don't try to export g_strcpy, it is g_stpcpy; updated and added some
[platform/upstream/glib.git] / gtimer.c
index eb18af8..d5e06b0 100644 (file)
--- a/gtimer.c
+++ b/gtimer.c
@@ -2,23 +2,23 @@
  * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
  *
  * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
+ * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2 of the License, or (at your option) any later version.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
+ * Lesser General Public License for more details.
  *
- * You should have received a copy of the GNU Library General Public
+ * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
 
 /*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
+ * Modified by the GLib Team and others 1997-2000.  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/. 
 #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;
 };
 
+#ifdef G_OS_WIN32
+#  define GETTIME(v) \
+     v = GetTickCount ()
+#else /* !G_OS_WIN32 */
+#  define GETTIME(v) \
+     gettimeofday (&v, NULL)
+#endif /* !G_OS_WIN32 */
+
 GTimer*
 g_timer_new (void)
 {
@@ -67,11 +75,7 @@ g_timer_new (void)
   timer = g_new (GRealTimer, 1);
   timer->active = TRUE;
 
-#ifdef NATIVE_WIN32
-  timer->start = GetTickCount ();
-#else /* !NATIVE_WIN32 */
-  gettimeofday (&timer->start, NULL);
-#endif /* !NATIVE_WIN32 */
+  GETTIME (timer->start);
 
   return ((GTimer*) timer);
 }
@@ -79,7 +83,7 @@ g_timer_new (void)
 void
 g_timer_destroy (GTimer *timer)
 {
-  g_assert (timer != NULL);
+  g_return_if_fail (timer != NULL);
 
   g_free (timer);
 }
@@ -89,16 +93,12 @@ 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
-  rtimer->start = GetTickCount ();
-#else /* !NATIVE_WIN32 */
-  gettimeofday (&rtimer->start, NULL);
-#endif /* !NATIVE_WIN32 */
+  GETTIME (rtimer->start);
 }
 
 void
@@ -106,16 +106,12 @@ 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
-  rtimer->end = GetTickCount ();
-#else /* !NATIVE_WIN32 */
-  gettimeofday (&rtimer->end, NULL);
-#endif /* !NATIVE_WIN32 */
+  GETTIME(rtimer->end);
 }
 
 void
@@ -123,15 +119,11 @@ g_timer_reset (GTimer *timer)
 {
   GRealTimer *rtimer;
 
-  g_assert (timer != NULL);
+  g_return_if_fail (timer != NULL);
 
   rtimer = (GRealTimer*) timer;
 
-#ifdef NATIVE_WIN32
-   rtimer->start = GetTickCount ();
-#else /* !NATIVE_WIN32 */
-  gettimeofday (&rtimer->start, NULL);
-#endif /* !NATIVE_WIN32 */
+  GETTIME (rtimer->start);
 }
 
 gdouble
@@ -140,22 +132,19 @@ 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 ();
 
-  /* Check for wraparound, which happens every 49.7 days.
-   * No, Win95 machines probably are never running for that long,
-   * but NT machines are.
-   */
+  /* Check for wraparound, which happens every 49.7 days. */
   if (rtimer->end < rtimer->start)
     total = (UINT_MAX - (rtimer->start - rtimer->end)) / 1000.0;
   else
@@ -170,13 +159,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_USEC_PER_SEC;
       rtimer->end.tv_sec--;
     }
 
@@ -184,10 +173,62 @@ 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
+  if (g_thread_supported ())
+    {
+      static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
+      static GCond* cond = NULL;
+      GTimeVal end_time;
+      
+      g_get_current_time (&end_time);
+      
+      end_time.tv_sec += microseconds / G_USEC_PER_SEC;
+      end_time.tv_usec += microseconds % G_USEC_PER_SEC;
+      
+      if (end_time.tv_usec >= G_USEC_PER_SEC)
+       {
+         end_time.tv_usec -= G_USEC_PER_SEC;
+         end_time.tv_sec += 1;
+       }
+      
+      g_static_mutex_lock (&mutex);
+      
+      if (!cond)
+       cond = g_cond_new ();
+      
+      while (g_cond_timed_wait (cond, g_static_mutex_get_mutex (&mutex), 
+                               &end_time))
+       /* do nothing */;
+      
+      g_static_mutex_unlock (&mutex);
+    }
+  else
+    {
+      struct timeval tv;
+      tv.tv_sec = microseconds / G_USEC_PER_SEC;
+      tv.tv_usec = microseconds % G_USEC_PER_SEC;
+      select(0, NULL, NULL, NULL, &tv);
+    }
+#endif
+}
+