Look for nanosleep function.
authorSebastian Wilhelmi <wilhelmi@ira.uka.de>
Thu, 7 Jun 2001 13:46:14 +0000 (13:46 +0000)
committerSebastian Wilhelmi <wilhelmi@src.gnome.org>
Thu, 7 Jun 2001 13:46:14 +0000 (13:46 +0000)
2001-06-07  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

* configure.in: Look for nanosleep function.

* gtimer.c: Use nanosleep for g_usleep, when found.

* gtimer.c, gtimer.h: Add g_time_val_add function. Closes #54271.

* gasyncqueue.c: Documentation updates.

* gthreadpool.c: Use g_time_val_add now that we have it.

* glib/glib-sections.txt, glib/tmpl/date.sgml: Add g_time_val_add.

* glib/tmpl/threads.sgml: Updated.

21 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
configure.in
docs/reference/ChangeLog
docs/reference/glib/glib-sections.txt
docs/reference/glib/tmpl/date.sgml
docs/reference/glib/tmpl/threads.sgml
gasyncqueue.c
glib/gasyncqueue.c
glib/gthreadpool.c
glib/gtimer.c
glib/gtimer.h
gthreadpool.c
gtimer.c
gtimer.h

index 223f5a74df436a9e0ef86d870a1591e316efed03..83a31df221e75de8c18691b880eac911dd918003 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2001-06-07  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * configure.in: Look for nanosleep function. 
+
+       * gtimer.c: Use nanosleep for g_usleep, when found.
+
+       * gtimer.c, gtimer.h: Add g_time_val_add function. Closes #54271.
+
+       * gasyncqueue.c: Documentation updates.
+
+       * gthreadpool.c: Use g_time_val_add now that we have it.
+
 2001-06-01  Jon Trowbridge  <trow@gnu.org>
 
        * gdate.c (g_date_update_julian): Changed to take a const
index 223f5a74df436a9e0ef86d870a1591e316efed03..83a31df221e75de8c18691b880eac911dd918003 100644 (file)
@@ -1,3 +1,15 @@
+2001-06-07  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * configure.in: Look for nanosleep function. 
+
+       * gtimer.c: Use nanosleep for g_usleep, when found.
+
+       * gtimer.c, gtimer.h: Add g_time_val_add function. Closes #54271.
+
+       * gasyncqueue.c: Documentation updates.
+
+       * gthreadpool.c: Use g_time_val_add now that we have it.
+
 2001-06-01  Jon Trowbridge  <trow@gnu.org>
 
        * gdate.c (g_date_update_julian): Changed to take a const
index 223f5a74df436a9e0ef86d870a1591e316efed03..83a31df221e75de8c18691b880eac911dd918003 100644 (file)
@@ -1,3 +1,15 @@
+2001-06-07  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * configure.in: Look for nanosleep function. 
+
+       * gtimer.c: Use nanosleep for g_usleep, when found.
+
+       * gtimer.c, gtimer.h: Add g_time_val_add function. Closes #54271.
+
+       * gasyncqueue.c: Documentation updates.
+
+       * gthreadpool.c: Use g_time_val_add now that we have it.
+
 2001-06-01  Jon Trowbridge  <trow@gnu.org>
 
        * gdate.c (g_date_update_julian): Changed to take a const
index 223f5a74df436a9e0ef86d870a1591e316efed03..83a31df221e75de8c18691b880eac911dd918003 100644 (file)
@@ -1,3 +1,15 @@
+2001-06-07  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * configure.in: Look for nanosleep function. 
+
+       * gtimer.c: Use nanosleep for g_usleep, when found.
+
+       * gtimer.c, gtimer.h: Add g_time_val_add function. Closes #54271.
+
+       * gasyncqueue.c: Documentation updates.
+
+       * gthreadpool.c: Use g_time_val_add now that we have it.
+
 2001-06-01  Jon Trowbridge  <trow@gnu.org>
 
        * gdate.c (g_date_update_julian): Changed to take a const
index 223f5a74df436a9e0ef86d870a1591e316efed03..83a31df221e75de8c18691b880eac911dd918003 100644 (file)
@@ -1,3 +1,15 @@
+2001-06-07  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * configure.in: Look for nanosleep function. 
+
+       * gtimer.c: Use nanosleep for g_usleep, when found.
+
+       * gtimer.c, gtimer.h: Add g_time_val_add function. Closes #54271.
+
+       * gasyncqueue.c: Documentation updates.
+
+       * gthreadpool.c: Use g_time_val_add now that we have it.
+
 2001-06-01  Jon Trowbridge  <trow@gnu.org>
 
        * gdate.c (g_date_update_julian): Changed to take a const
index 223f5a74df436a9e0ef86d870a1591e316efed03..83a31df221e75de8c18691b880eac911dd918003 100644 (file)
@@ -1,3 +1,15 @@
+2001-06-07  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * configure.in: Look for nanosleep function. 
+
+       * gtimer.c: Use nanosleep for g_usleep, when found.
+
+       * gtimer.c, gtimer.h: Add g_time_val_add function. Closes #54271.
+
+       * gasyncqueue.c: Documentation updates.
+
+       * gthreadpool.c: Use g_time_val_add now that we have it.
+
 2001-06-01  Jon Trowbridge  <trow@gnu.org>
 
        * gdate.c (g_date_update_julian): Changed to take a const
index 223f5a74df436a9e0ef86d870a1591e316efed03..83a31df221e75de8c18691b880eac911dd918003 100644 (file)
@@ -1,3 +1,15 @@
+2001-06-07  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * configure.in: Look for nanosleep function. 
+
+       * gtimer.c: Use nanosleep for g_usleep, when found.
+
+       * gtimer.c, gtimer.h: Add g_time_val_add function. Closes #54271.
+
+       * gasyncqueue.c: Documentation updates.
+
+       * gthreadpool.c: Use g_time_val_add now that we have it.
+
 2001-06-01  Jon Trowbridge  <trow@gnu.org>
 
        * gdate.c (g_date_update_julian): Changed to take a const
index 223f5a74df436a9e0ef86d870a1591e316efed03..83a31df221e75de8c18691b880eac911dd918003 100644 (file)
@@ -1,3 +1,15 @@
+2001-06-07  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * configure.in: Look for nanosleep function. 
+
+       * gtimer.c: Use nanosleep for g_usleep, when found.
+
+       * gtimer.c, gtimer.h: Add g_time_val_add function. Closes #54271.
+
+       * gasyncqueue.c: Documentation updates.
+
+       * gthreadpool.c: Use g_time_val_add now that we have it.
+
 2001-06-01  Jon Trowbridge  <trow@gnu.org>
 
        * gdate.c (g_date_update_julian): Changed to take a const
index 774d765e109b1016fd395def3aa22eb8856c7be9..58c33abdaa256d67269682bed85a203d197cc8fe 100644 (file)
@@ -460,7 +460,7 @@ GLIB_SIZEOF([$size_includes], ptrdiff_t, ptrdiff_t)
 GLIB_SIZEOF([$size_includes], intmax_t, intmax_t)
 
 # Check for some functions
-AC_CHECK_FUNCS(lstat strerror strsignal memmove mkstemp vsnprintf stpcpy strcasecmp strncasecmp poll getcwd)
+AC_CHECK_FUNCS(lstat strerror strsignal memmove mkstemp vsnprintf stpcpy strcasecmp strncasecmp poll getcwd nanosleep)
 
 # Check if bcopy can be used for overlapping copies, if memmove isn't found.
 # The check is borrowed from the PERL Configure script.
index 113ba61ad29f4e8571222c59ea4264cce3eae29a..29646783658be047b3061585b8923d4c7d175385 100644 (file)
@@ -1,3 +1,9 @@
+2001-06-07  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * glib/glib-sections.txt, glib/tmpl/date.sgml: Add g_time_val_add.
+
+       * glib/tmpl/threads.sgml: Updated. 
+
 2001-05-23  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
        * glib/tmpl/arrays.sgml, glib/tmpl/arrays_pointers.sgml,
index 79d362c1d6669fccb33d800740a32b6e23d9e2b6..0d377f5da8900e52d1bbcb233d1c021a3b35eb17 100644 (file)
@@ -857,6 +857,7 @@ G_USEC_PER_SEC
 GTimeVal
 g_get_current_time
 g_usleep
+g_time_val_add
 
 <SUBSECTION>
 GDate
index 60d0a4d6f773dd330d3172f06f7a4fc64a038dd0..7d65991bcf011e88070b9f56061fd4736261ef0e 100644 (file)
@@ -101,6 +101,15 @@ rely on the exact length of the sleep.
 @microseconds: number of microseconds to pause
 
 
+<!-- ##### FUNCTION g_time_val_add ##### -->
+<para>
+
+</para>
+
+@time: 
+@microseconds: 
+
+
 <!-- ##### STRUCT GDate ##### -->
 <para>\r
 Represents a day between January 1, Year 1 and a few thousand years in\r
index 5dbbb170a6aaa61741696b1012e6402824d17266..80f2c7141e47bbf9da5efb292ca89b06a36c32ee 100644 (file)
@@ -1366,6 +1366,11 @@ This function can also be used, if g_thread_init() has not yet been
 called and will immediately return TRUE then.
 </para>
 
+<para>
+To easily calculate @abs_time a combination of g_get_current_time()
+and g_time_val_add() can be used.
+</para>
+
 @cond: a #GCond
 @mutex: a #GMutex, that is currently locked
 @abs_time: a #GTimeVal, determining the final time
index 126bb1d846a9679ccbd3a0898d6841bb6d01834c..39c035d865a07e9ee83076f355c326557ae01280 100644 (file)
@@ -343,6 +343,9 @@ g_async_queue_try_pop_unlocked (GAsyncQueue* queue)
  * Pop data from the @queue. If no data is received before @end_time,
  * #NULL is returned.
  *
+ * To easily calculate @end_time a combination of g_get_current_time()
+ * and g_time_val_add() can be used.
+ *
  * Return value: data from the queue or #NULL, when no data is
  * received before @end_time.
  **/
@@ -370,6 +373,9 @@ g_async_queue_timed_pop (GAsyncQueue* queue, GTimeVal *end_time)
  * #NULL is returned. This function must be called while holding the
  * @queue's lock.
  *
+ * To easily calculate @end_time a combination of g_get_current_time()
+ * and g_time_val_add() can be used.
+ *
  * Return value: data from the queue or #NULL, when no data is
  * received before @end_time.
  **/
index 126bb1d846a9679ccbd3a0898d6841bb6d01834c..39c035d865a07e9ee83076f355c326557ae01280 100644 (file)
@@ -343,6 +343,9 @@ g_async_queue_try_pop_unlocked (GAsyncQueue* queue)
  * Pop data from the @queue. If no data is received before @end_time,
  * #NULL is returned.
  *
+ * To easily calculate @end_time a combination of g_get_current_time()
+ * and g_time_val_add() can be used.
+ *
  * Return value: data from the queue or #NULL, when no data is
  * received before @end_time.
  **/
@@ -370,6 +373,9 @@ g_async_queue_timed_pop (GAsyncQueue* queue, GTimeVal *end_time)
  * #NULL is returned. This function must be called while holding the
  * @queue's lock.
  *
+ * To easily calculate @end_time a combination of g_get_current_time()
+ * and g_time_val_add() can be used.
+ *
  * Return value: data from the queue or #NULL, when no data is
  * received before @end_time.
  **/
index c2620ccbc96ccf0d21a4ad661694ad1ca4333ba3..601022830c4cfe70b66a1ffc305eff747d77ce24 100644 (file)
@@ -86,20 +86,12 @@ g_thread_pool_thread_proxy (gpointer data)
                * pool afterwards */
              GTimeVal end_time;
              g_get_current_time (&end_time);
-             end_time.tv_usec += G_USEC_PER_SEC / 2; /* Halv a second */
-             if (end_time.tv_usec >= G_USEC_PER_SEC)
-               {
-                 end_time.tv_usec -= G_USEC_PER_SEC;
-                 end_time.tv_sec += 1;
-               }
-        
+             g_time_val_add (&end_time, G_USEC_PER_SEC / 2); /* 1/2 second */
              task = g_async_queue_timed_pop_unlocked (pool->queue, &end_time);
            }
          else
-           {
-             task = g_async_queue_pop_unlocked (pool->queue);
-           }
-
+           task = g_async_queue_pop_unlocked (pool->queue);
+         
          if (task)
            {
              watcher = FALSE;
index d5e06b01169aaab3587000c8454ae1d60e9e446b..2064131f1cd27ab177b4c911c7dcbe246f7225f9 100644 (file)
@@ -38,6 +38,8 @@
 #endif /* HAVE_UNISTD_H */
 #ifndef G_OS_WIN32
 #include <sys/time.h>
+#include <time.h>
+#include <errno.h>
 #endif /* G_OS_WIN32 */
 
 #ifdef G_OS_WIN32
@@ -193,7 +195,14 @@ g_usleep (gulong microseconds)
 {
 #ifdef G_OS_WIN32
   Sleep (microseconds / 1000);
-#else
+#else /* !G_OS_WIN32 */
+# ifdef HAVE_NANOSLEEP
+  struct timespec request, remaining;
+  request.tv_sec = microseconds / G_USEC_PER_SEC;
+  request.tv_nsec = 1000 * (microseconds % G_USEC_PER_SEC);
+  while (nanosleep (&request, &remaining) == EINTR)
+    request = remaining;
+# else /* !HAVE_NANOSLEEP */
   if (g_thread_supported ())
     {
       static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
@@ -201,16 +210,13 @@ g_usleep (gulong microseconds)
       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)
+      if (microseconds > G_MAXLONG)
        {
-         end_time.tv_usec -= G_USEC_PER_SEC;
-         end_time.tv_sec += 1;
+         microseconds -= G_MAXLONG;
+         g_time_val_add (&end_time, G_MAXLONG);
        }
-      
+      g_time_val_add (&end_time, microseconds);
+
       g_static_mutex_lock (&mutex);
       
       if (!cond)
@@ -229,6 +235,42 @@ g_usleep (gulong microseconds)
       tv.tv_usec = microseconds % G_USEC_PER_SEC;
       select(0, NULL, NULL, NULL, &tv);
     }
-#endif
+# endif /* !HAVE_NANOSLEEP */
+#endif /* !G_OS_WIN32 */
 }
 
+/**
+ * g_time_val_add:
+ * @time: a #GTimeVal
+ * @microseconds: number of microseconds to add to @time
+ *
+ * Adds the given number of microseconds to @time. @microseconds can
+ * also be negative to decrease the value of @time.
+ **/
+void 
+g_time_val_add (GTimeVal *time, glong microseconds)
+{
+  g_return_if_fail (time->tv_usec >= 0 && time->tv_usec < G_USEC_PER_SEC);
+
+  if (microseconds >= 0)
+    {
+      time->tv_usec += microseconds % G_USEC_PER_SEC;
+      time->tv_sec += microseconds / G_USEC_PER_SEC;
+      if (time->tv_usec >= G_USEC_PER_SEC)
+       {
+         time->tv_usec -= G_USEC_PER_SEC;
+         time->tv_sec++;
+       }
+    }
+  else
+    {
+      microseconds *= -1;
+      time->tv_usec -= microseconds % G_USEC_PER_SEC;
+      time->tv_sec -= microseconds / G_USEC_PER_SEC;
+      if (time->tv_usec < 0)
+       {
+         time->tv_usec += G_USEC_PER_SEC;
+         time->tv_sec--;
+       }      
+    }
+}
index 533a778f19be6889abd210936b2750f674297a9e..823d6344284d5eac8b55739ce805dbf97e1117f0 100644 (file)
@@ -40,13 +40,17 @@ typedef struct _GTimer              GTimer;
 #define G_USEC_PER_SEC 1000000
 
 GTimer* g_timer_new    (void);
-void   g_timer_destroy (GTimer  *timer);
-void   g_timer_start   (GTimer  *timer);
-void   g_timer_stop    (GTimer  *timer);
-void   g_timer_reset   (GTimer  *timer);
-gdouble g_timer_elapsed (GTimer         *timer,
-                        gulong  *microseconds);
-void    g_usleep        (gulong microseconds);
+void   g_timer_destroy (GTimer   *timer);
+void   g_timer_start   (GTimer   *timer);
+void   g_timer_stop    (GTimer   *timer);
+void   g_timer_reset   (GTimer   *timer);
+gdouble g_timer_elapsed (GTimer          *timer,
+                        gulong   *microseconds);
+
+void    g_usleep        (gulong    microseconds);
+
+void    g_time_val_add  (GTimeVal *time, 
+                         glong     microseconds);
 
 G_END_DECLS
 
index c2620ccbc96ccf0d21a4ad661694ad1ca4333ba3..601022830c4cfe70b66a1ffc305eff747d77ce24 100644 (file)
@@ -86,20 +86,12 @@ g_thread_pool_thread_proxy (gpointer data)
                * pool afterwards */
              GTimeVal end_time;
              g_get_current_time (&end_time);
-             end_time.tv_usec += G_USEC_PER_SEC / 2; /* Halv a second */
-             if (end_time.tv_usec >= G_USEC_PER_SEC)
-               {
-                 end_time.tv_usec -= G_USEC_PER_SEC;
-                 end_time.tv_sec += 1;
-               }
-        
+             g_time_val_add (&end_time, G_USEC_PER_SEC / 2); /* 1/2 second */
              task = g_async_queue_timed_pop_unlocked (pool->queue, &end_time);
            }
          else
-           {
-             task = g_async_queue_pop_unlocked (pool->queue);
-           }
-
+           task = g_async_queue_pop_unlocked (pool->queue);
+         
          if (task)
            {
              watcher = FALSE;
index d5e06b01169aaab3587000c8454ae1d60e9e446b..2064131f1cd27ab177b4c911c7dcbe246f7225f9 100644 (file)
--- a/gtimer.c
+++ b/gtimer.c
@@ -38,6 +38,8 @@
 #endif /* HAVE_UNISTD_H */
 #ifndef G_OS_WIN32
 #include <sys/time.h>
+#include <time.h>
+#include <errno.h>
 #endif /* G_OS_WIN32 */
 
 #ifdef G_OS_WIN32
@@ -193,7 +195,14 @@ g_usleep (gulong microseconds)
 {
 #ifdef G_OS_WIN32
   Sleep (microseconds / 1000);
-#else
+#else /* !G_OS_WIN32 */
+# ifdef HAVE_NANOSLEEP
+  struct timespec request, remaining;
+  request.tv_sec = microseconds / G_USEC_PER_SEC;
+  request.tv_nsec = 1000 * (microseconds % G_USEC_PER_SEC);
+  while (nanosleep (&request, &remaining) == EINTR)
+    request = remaining;
+# else /* !HAVE_NANOSLEEP */
   if (g_thread_supported ())
     {
       static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
@@ -201,16 +210,13 @@ g_usleep (gulong microseconds)
       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)
+      if (microseconds > G_MAXLONG)
        {
-         end_time.tv_usec -= G_USEC_PER_SEC;
-         end_time.tv_sec += 1;
+         microseconds -= G_MAXLONG;
+         g_time_val_add (&end_time, G_MAXLONG);
        }
-      
+      g_time_val_add (&end_time, microseconds);
+
       g_static_mutex_lock (&mutex);
       
       if (!cond)
@@ -229,6 +235,42 @@ g_usleep (gulong microseconds)
       tv.tv_usec = microseconds % G_USEC_PER_SEC;
       select(0, NULL, NULL, NULL, &tv);
     }
-#endif
+# endif /* !HAVE_NANOSLEEP */
+#endif /* !G_OS_WIN32 */
 }
 
+/**
+ * g_time_val_add:
+ * @time: a #GTimeVal
+ * @microseconds: number of microseconds to add to @time
+ *
+ * Adds the given number of microseconds to @time. @microseconds can
+ * also be negative to decrease the value of @time.
+ **/
+void 
+g_time_val_add (GTimeVal *time, glong microseconds)
+{
+  g_return_if_fail (time->tv_usec >= 0 && time->tv_usec < G_USEC_PER_SEC);
+
+  if (microseconds >= 0)
+    {
+      time->tv_usec += microseconds % G_USEC_PER_SEC;
+      time->tv_sec += microseconds / G_USEC_PER_SEC;
+      if (time->tv_usec >= G_USEC_PER_SEC)
+       {
+         time->tv_usec -= G_USEC_PER_SEC;
+         time->tv_sec++;
+       }
+    }
+  else
+    {
+      microseconds *= -1;
+      time->tv_usec -= microseconds % G_USEC_PER_SEC;
+      time->tv_sec -= microseconds / G_USEC_PER_SEC;
+      if (time->tv_usec < 0)
+       {
+         time->tv_usec += G_USEC_PER_SEC;
+         time->tv_sec--;
+       }      
+    }
+}
index 533a778f19be6889abd210936b2750f674297a9e..823d6344284d5eac8b55739ce805dbf97e1117f0 100644 (file)
--- a/gtimer.h
+++ b/gtimer.h
@@ -40,13 +40,17 @@ typedef struct _GTimer              GTimer;
 #define G_USEC_PER_SEC 1000000
 
 GTimer* g_timer_new    (void);
-void   g_timer_destroy (GTimer  *timer);
-void   g_timer_start   (GTimer  *timer);
-void   g_timer_stop    (GTimer  *timer);
-void   g_timer_reset   (GTimer  *timer);
-gdouble g_timer_elapsed (GTimer         *timer,
-                        gulong  *microseconds);
-void    g_usleep        (gulong microseconds);
+void   g_timer_destroy (GTimer   *timer);
+void   g_timer_start   (GTimer   *timer);
+void   g_timer_stop    (GTimer   *timer);
+void   g_timer_reset   (GTimer   *timer);
+gdouble g_timer_elapsed (GTimer          *timer,
+                        gulong   *microseconds);
+
+void    g_usleep        (gulong    microseconds);
+
+void    g_time_val_add  (GTimeVal *time, 
+                         glong     microseconds);
 
 G_END_DECLS