From 8c2fb68a110efe662c951bd43b3e2b79796d9848 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Tue, 8 Mar 2005 14:32:07 +0000 Subject: [PATCH] revert errnoneous checkin --- winsup/cygwin/timer.cc | 70 ++++++++++++++---------------------------- 1 file changed, 23 insertions(+), 47 deletions(-) diff --git a/winsup/cygwin/timer.cc b/winsup/cygwin/timer.cc index d710c2c66..6a53a572f 100644 --- a/winsup/cygwin/timer.cc +++ b/winsup/cygwin/timer.cc @@ -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; +timer_tracker ttstart; -class lock_timer_tracker +muto *timer_tracker::protect; + +timer_tracker::timer_tracker () { - static muto *protect; -public: - lock_timer_tracker (); - ~lock_timer_tracker (); -}; - -muto NO_COPY *lock_timer_tracker::protect; - -lock_timer_tracker::lock_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 = ⁢ } @@ -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; }