minor optimization.
[platform/upstream/glib.git] / gtimer.c
index 0b6e86a..d613a50 100644 (file)
--- a/gtimer.c
+++ b/gtimer.c
  * Boston, MA 02111-1307, USA.
  */
 
+/*
+ * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
+ * file for a list of people on the GLib Team.  See the ChangeLog
+ * files for a list of changes.  These files are distributed with
+ * GLib at ftp://ftp.gtk.org/pub/gtk/. 
+ */
+
 /* 
  * MT safe
  */
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif /* HAVE_UNISTD_H */
-#ifndef NATIVE_WIN32
+#ifndef G_OS_WIN32
 #include <sys/time.h>
-#endif /* NATIVE_WIN32 */
+#endif /* G_OS_WIN32 */
 
-#ifdef NATIVE_WIN32
+#ifdef G_OS_WIN32
 #include <windows.h>
-#endif /* NATIVE_WIN32 */
+#endif /* G_OS_WIN32 */
 
 typedef struct _GRealTimer GRealTimer;
 
 struct _GRealTimer
 {
-#ifdef NATIVE_WIN32
+#ifdef G_OS_WIN32
   DWORD start;
   DWORD end;
-#else /* !NATIVE_WIN32 */
+#else /* !G_OS_WIN32 */
   struct timeval start;
   struct timeval end;
-#endif /* !NATIVE_WIN32 */
+#endif /* !G_OS_WIN32 */
 
   guint active : 1;
 };
@@ -60,11 +67,11 @@ g_timer_new (void)
   timer = g_new (GRealTimer, 1);
   timer->active = TRUE;
 
-#ifdef NATIVE_WIN32
+#ifdef G_OS_WIN32
   timer->start = GetTickCount ();
-#else /* !NATIVE_WIN32 */
+#else /* !G_OS_WIN32 */
   gettimeofday (&timer->start, NULL);
-#endif /* !NATIVE_WIN32 */
+#endif /* !G_OS_WIN32 */
 
   return ((GTimer*) timer);
 }
@@ -72,7 +79,7 @@ g_timer_new (void)
 void
 g_timer_destroy (GTimer *timer)
 {
-  g_assert (timer != NULL);
+  g_return_if_fail (timer != NULL);
 
   g_free (timer);
 }
@@ -82,16 +89,16 @@ g_timer_start (GTimer *timer)
 {
   GRealTimer *rtimer;
 
-  g_assert (timer != NULL);
+  g_return_if_fail (timer != NULL);
 
   rtimer = (GRealTimer*) timer;
   rtimer->active = TRUE;
 
-#ifdef NATIVE_WIN32
+#ifdef G_OS_WIN32
   rtimer->start = GetTickCount ();
-#else /* !NATIVE_WIN32 */
+#else /* !G_OS_WIN32 */
   gettimeofday (&rtimer->start, NULL);
-#endif /* !NATIVE_WIN32 */
+#endif /* !G_OS_WIN32 */
 }
 
 void
@@ -99,16 +106,16 @@ g_timer_stop (GTimer *timer)
 {
   GRealTimer *rtimer;
 
-  g_assert (timer != NULL);
+  g_return_if_fail (timer != NULL);
 
   rtimer = (GRealTimer*) timer;
   rtimer->active = FALSE;
 
-#ifdef NATIVE_WIN32
+#ifdef G_OS_WIN32
   rtimer->end = GetTickCount ();
-#else /* !NATIVE_WIN32 */
+#else /* !G_OS_WIN32 */
   gettimeofday (&rtimer->end, NULL);
-#endif /* !NATIVE_WIN32 */
+#endif /* !G_OS_WIN32 */
 }
 
 void
@@ -116,15 +123,15 @@ g_timer_reset (GTimer *timer)
 {
   GRealTimer *rtimer;
 
-  g_assert (timer != NULL);
+  g_return_if_fail (timer != NULL);
 
   rtimer = (GRealTimer*) timer;
 
-#ifdef NATIVE_WIN32
+#ifdef G_OS_WIN32
    rtimer->start = GetTickCount ();
-#else /* !NATIVE_WIN32 */
+#else /* !G_OS_WIN32 */
   gettimeofday (&rtimer->start, NULL);
-#endif /* !NATIVE_WIN32 */
+#endif /* !G_OS_WIN32 */
 }
 
 gdouble
@@ -133,15 +140,15 @@ g_timer_elapsed (GTimer *timer,
 {
   GRealTimer *rtimer;
   gdouble total;
-#ifndef NATIVE_WIN32
+#ifndef G_OS_WIN32
   struct timeval elapsed;
-#endif /* NATIVE_WIN32 */
+#endif /* G_OS_WIN32 */
 
   g_return_val_if_fail (timer != NULL, 0);
 
   rtimer = (GRealTimer*) timer;
 
-#ifdef NATIVE_WIN32
+#ifdef G_OS_WIN32
   if (rtimer->active)
     rtimer->end = GetTickCount ();
 
@@ -163,13 +170,13 @@ g_timer_elapsed (GTimer *timer,
        *microseconds =
          ((rtimer->end - rtimer->start) % 1000) * 1000;
     }
-#else /* !NATIVE_WIN32 */
+#else /* !G_OS_WIN32 */
   if (rtimer->active)
     gettimeofday (&rtimer->end, NULL);
 
   if (rtimer->start.tv_usec > rtimer->end.tv_usec)
     {
-      rtimer->end.tv_usec += 1000000;
+      rtimer->end.tv_usec += G_MICROSEC;
       rtimer->end.tv_sec--;
     }
 
@@ -177,10 +184,31 @@ g_timer_elapsed (GTimer *timer,
   elapsed.tv_sec = rtimer->end.tv_sec - rtimer->start.tv_sec;
 
   total = elapsed.tv_sec + ((gdouble) elapsed.tv_usec / 1e6);
+  if (total < 0)
+    {
+      total = 0;
 
-  if (microseconds)
+      if (microseconds)
+       *microseconds = 0;
+    }
+  else if (microseconds)
     *microseconds = elapsed.tv_usec;
-#endif /* !NATIVE_WIN32 */
+
+#endif /* !G_OS_WIN32 */
 
   return total;
 }
+
+void
+g_usleep (gulong microseconds)
+{
+#ifdef G_OS_WIN32
+  Sleep (microseconds / 1000);
+#else
+  struct timeval tv;
+  tv.tv_sec = microseconds / G_MICROSEC;
+  tv.tv_usec = microseconds % G_MICROSEC;
+  select(0, NULL, NULL, NULL, &tv);
+#endif
+}
+