]> sourceware.org Git - newlib-cygwin.git/commitdiff
revert errnoneous checkin
authorChristopher Faylor <me@cgf.cx>
Tue, 8 Mar 2005 14:32:07 +0000 (14:32 +0000)
committerChristopher Faylor <me@cgf.cx>
Tue, 8 Mar 2005 14:32:07 +0000 (14:32 +0000)
winsup/cygwin/timer.cc

index d710c2c668f32891fe34c7bcc5d3b11236df7579..6a53a572f38903276a1594cd7454f28fbaa653e3 100644 (file)
@@ -22,6 +22,7 @@ details. */
 #define TT_MAGIC 0x513e4a1c
 struct timer_tracker
 {
+  static muto *protect;
   unsigned magic;
   clockid_t clock_id;
   sigevent evp;
@@ -32,52 +33,20 @@ struct timer_tracker
   struct timer_tracker *next;
   int settime (int, const itimerspec *, itimerspec *);
   timer_tracker (clockid_t, const sigevent *);
-  timer_tracker () {};
-  static void lock ();
-  static void unlock ();
-  ~timer_tracker ();
+  timer_tracker ();
 };
 
-timer_tracker NO_COPY ttstart;
-
-class lock_timer_tracker
-{
-  static muto *protect;
-public:
-  lock_timer_tracker ();
-  ~lock_timer_tracker ();
-};
+timer_tracker ttstart;
 
-muto NO_COPY *lock_timer_tracker::protect;
+muto *timer_tracker::protect;
 
-lock_timer_tracker::lock_timer_tracker ()
+timer_tracker::timer_tracker ()
 {
-  new_muto (protect)->acquire ();
-}
-
-lock_timer_tracker::~lock_timer_tracker ()
-{
-  protect->release ();
-}
-
-timer_tracker::~timer_tracker ()
-{
-  if (cancel)
-    {
-      SetEvent (cancel);
-      th->detach ();
-      CloseHandle (cancel);
-#ifdef DEBUGGING
-      th = NULL;
-      cancel = NULL;
-#endif
-    }
-  magic = 0;
+  new_muto (protect);
 }
 
 timer_tracker::timer_tracker (clockid_t c, const sigevent *e)
 {
-  lock_timer_tracker now;
   if (e != NULL)
     evp = *e;
   else
@@ -90,17 +59,19 @@ timer_tracker::timer_tracker (clockid_t c, const sigevent *e)
   cancel = NULL;
   flags = 0;
   memset (&it, 0, sizeof (it));
+  protect->acquire ();
   next = ttstart.next;
   ttstart.next = this;
+  protect->release ();
   magic = TT_MAGIC;
 }
 
 static long long
-to_us (const timespec& ts)
+to_us (timespec& ts)
 {
   long long res = ts.tv_sec;
   res *= 1000000;
-  res += ts.tv_nsec / 1000 + (ts.tv_nsec % 1000) ? 1 : 0;
+  res += ts.tv_nsec / 1000 + ((ts.tv_nsec % 1000) >= 500 ? 1 : 0);
   return res;
 }
 
@@ -179,6 +150,10 @@ timer_thread (VOID *x)
     }
 
 out:
+  CloseHandle (tt.cancel);
+  // FIXME: race here but is it inevitable?
+  if (tt.cancel == tp->cancel)
+    tp->cancel = NULL;
   return 0;
 }
 
@@ -208,16 +183,13 @@ timer_tracker::settime (int in_flags, const itimerspec *value, itimerspec *ovalu
   if (ovalue && check_null_invalid_struct_errno (ovalue))
     return -1;
 
-  lock_timer_tracker now;
   itimerspec *elapsed;
   if (!cancel)
     elapsed = &itzero;
   else
     {
-      SetEvent (cancel);
+      SetEvent (cancel);       // should be closed when the thread exits
       th->detach ();
-      CloseHandle (cancel);
-      th = NULL;
       elapsed = &it;
     }
 
@@ -274,14 +246,18 @@ timer_delete (timer_t timerid)
   if (check_null_invalid_struct_errno (in_tt) || in_tt->magic != TT_MAGIC)
     return -1;
 
-  lock_timer_tracker now;
+  timer_tracker::protect->acquire ();
   for (timer_tracker *tt = &ttstart; tt->next != NULL; tt = tt->next)
     if (tt->next == in_tt)
       {
-       tt->next = in_tt->next;
-       delete in_tt;
+       timer_tracker *deleteme = tt->next;
+       tt->next = deleteme->next;
+       delete deleteme;
+       timer_tracker::protect->release ();
        return 0;
       }
+  timer_tracker::protect->release ();
+
   set_errno (EINVAL);
   return 0;
 }
This page took 0.033852 seconds and 5 git commands to generate.