Use this to specify that 'configure' depends on acglib.m4.
[platform/upstream/glib.git] / gtimer.c
index d613a50..299d638 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/. 
@@ -176,7 +176,7 @@ g_timer_elapsed (GTimer *timer,
 
   if (rtimer->start.tv_usec > rtimer->end.tv_usec)
     {
-      rtimer->end.tv_usec += G_MICROSEC;
+      rtimer->end.tv_usec += G_USEC_PER_SEC;
       rtimer->end.tv_sec--;
     }
 
@@ -205,10 +205,41 @@ 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);
+  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
 }