diff options
author | Christopher Faylor <me@cgf.cx> | 2005-03-28 19:31:23 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2005-03-28 19:31:23 +0000 |
commit | dc000a838679572cba87587a7548d8fce4c44aa9 (patch) | |
tree | 9d706e84a0ad36fc5410d35ca2f84b49cee17f81 /winsup/cygwin | |
parent | 12f9fb4972db8e9a25cff1cd7a9b847cd2846556 (diff) | |
download | newlib-dc000a838679572cba87587a7548d8fce4c44aa9.zip newlib-dc000a838679572cba87587a7548d8fce4c44aa9.tar.gz newlib-dc000a838679572cba87587a7548d8fce4c44aa9.tar.bz2 |
* cygthread.cc (cygthread::detach): Revert to just waiting for thred event
since waiting for anything else is racy.
* timer.cc (timer_tracker::hcancel): Rename from cancel.
(timer_tracker::cancel): New method.
(timer_tracker::th): Remove.
(timer_tracker::~timer_tracker): Call cancel method.
(timer_tracker::timer_tracker): Ditto.
(timer_tracker::timer_tracker): Always, clear cancel, even though it is
probably not strictly necessary for ttstart.
(timer_thread): Accommodate cancel -> hcancel rename.
(timer_tracker::settime): Ditto.
(timer_tracker::gettime): Ditto.
(timer_delete): Ditto.
* cygwin.din: Export _ctype_.
* include/ctype.h: Mark that _ctype_ is imported.
Diffstat (limited to 'winsup/cygwin')
-rw-r--r-- | winsup/cygwin/ChangeLog | 19 | ||||
-rw-r--r-- | winsup/cygwin/cygthread.cc | 2 | ||||
-rw-r--r-- | winsup/cygwin/cygwin.din | 1 | ||||
-rw-r--r-- | winsup/cygwin/include/ctype.h | 4 | ||||
-rw-r--r-- | winsup/cygwin/timer.cc | 49 |
5 files changed, 52 insertions, 23 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index ad2c226..a868a00 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,5 +1,24 @@ 2005-03-28 Christopher Faylor <cgf@timesys.com> + * cygthread.cc (cygthread::detach): Revert to just waiting for thred + event since waiting for anything else is racy. + * timer.cc (timer_tracker::hcancel): Rename from cancel. + (timer_tracker::cancel): New method. + (timer_tracker::th): Remove. + (timer_tracker::~timer_tracker): Call cancel method. + (timer_tracker::timer_tracker): Ditto. + (timer_tracker::timer_tracker): Always, clear cancel, even though it is + probably not strictly necessary for ttstart. + (timer_thread): Accommodate cancel -> hcancel rename. + (timer_tracker::settime): Ditto. + (timer_tracker::gettime): Ditto. + (timer_delete): Ditto. + + * cygwin.din: Export _ctype_. + * include/ctype.h: Mark that _ctype_ is imported. + +2005-03-28 Christopher Faylor <cgf@timesys.com> + * timer.cc (timer_tracker::timer_tracker): Eliminate simple constructor. (ttstart): Fully initialize. diff --git a/winsup/cygwin/cygthread.cc b/winsup/cygwin/cygthread.cc index 11fb047..59b13be 100644 --- a/winsup/cygwin/cygthread.cc +++ b/winsup/cygwin/cygthread.cc @@ -315,7 +315,7 @@ cygthread::detach (HANDLE sigwait) if (!sigwait) /* If the caller specified a special handle for notification, wait for that. This assumes that the thread in question is auto releasing. */ - res = WaitForSingleObject (notify_detached ?: *this, INFINITE); + res = WaitForSingleObject (*this, INFINITE); else { /* Lower our priority and give priority to the read thread */ diff --git a/winsup/cygwin/cygwin.din b/winsup/cygwin/cygwin.din index 5d59327..9a09c7a 100644 --- a/winsup/cygwin/cygwin.din +++ b/winsup/cygwin/cygwin.din @@ -4,6 +4,7 @@ EXPORTS __argc DATA __argv DATA __check_rhosts_file DATA +_ctype_ DATA __cygwin_environ DATA __cygwin_user_data DATA __mb_cur_max DATA diff --git a/winsup/cygwin/include/ctype.h b/winsup/cygwin/include/ctype.h index c317a30..8b0ca03 100644 --- a/winsup/cygwin/include/ctype.h +++ b/winsup/cygwin/include/ctype.h @@ -38,7 +38,11 @@ int __cdecl _toupper(int); #define _X 0100 #define _B 0200 +#ifdef __INSIDE_CYGWIN__ extern const char _ctype_[]; +#else +extern const __declspec(dllimport) char _ctype_[]; +#endif #if !defined(__cplusplus) || defined(__INSIDE_CYGWIN__) #define isalpha(c) ((_ctype_+1)[(unsigned)(c)]&(_U|_L)) diff --git a/winsup/cygwin/timer.cc b/winsup/cygwin/timer.cc index fccc465..60149ba 100644 --- a/winsup/cygwin/timer.cc +++ b/winsup/cygwin/timer.cc @@ -26,11 +26,11 @@ struct timer_tracker clockid_t clock_id; sigevent evp; timespec it_interval; - HANDLE cancel; + HANDLE hcancel; HANDLE syncthread; long long interval_us; long long sleepto_us; - cygthread *th; + bool cancel (); struct timer_tracker *next; int settime (int, const itimerspec *, itimerspec *); void gettime (itimerspec *); @@ -61,16 +61,25 @@ lock_timer_tracker::~lock_timer_tracker () protect->release (); } +bool +timer_tracker::cancel () +{ + if (!hcancel) + return false; + + SetEvent (hcancel); + if (WaitForSingleObject (syncthread, INFINITE) != WAIT_OBJECT_0) + api_fatal ("WFSO failed waiting for timer thread, %E"); + return true; +} + timer_tracker::~timer_tracker () { - if (cancel) + if (cancel ()) { - SetEvent (cancel); - th->detach (); - CloseHandle (cancel); + CloseHandle (hcancel); #ifdef DEBUGGING - th = NULL; - cancel = NULL; + hcancel = NULL; #endif } if (syncthread) @@ -90,9 +99,9 @@ timer_tracker::timer_tracker (clockid_t c, const sigevent *e) } clock_id = c; magic = TT_MAGIC; + hcancel = NULL; if (this != &ttstart) { - cancel = NULL; lock_timer_tracker here; next = ttstart.next; ttstart.next = this; @@ -134,7 +143,7 @@ timer_thread (VOID *x) } debug_printf ("%p waiting for %u ms", x, sleep_ms); - switch (WaitForSingleObject (tt->cancel, sleep_ms)) + switch (WaitForSingleObject (tt->hcancel, sleep_ms)) { case WAIT_TIMEOUT: debug_printf ("timed out"); @@ -216,11 +225,7 @@ timer_tracker::settime (int in_flags, const itimerspec *value, itimerspec *ovalu long long now = in_flags & TIMER_ABSTIME ? 0 : gtod.usecs (false); lock_timer_tracker here; - if (cancel) - { - SetEvent (cancel); // should be closed when the thread exits - th->detach (); - } + cancel (); if (ovalue) gettime (ovalue); @@ -230,15 +235,15 @@ timer_tracker::settime (int in_flags, const itimerspec *value, itimerspec *ovalu sleepto_us = now + to_us (value->it_value); interval_us = to_us (value->it_interval); it_interval = value->it_interval; - if (!cancel) - cancel = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL); + if (!hcancel) + hcancel = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL); else - ResetEvent (cancel); + ResetEvent (hcancel); if (!syncthread) syncthread = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL); else ResetEvent (syncthread); - th = new cygthread (timer_thread, this, "itimer", syncthread); + (void) new cygthread (timer_thread, this, "itimer", syncthread); } return 0; @@ -247,7 +252,7 @@ timer_tracker::settime (int in_flags, const itimerspec *value, itimerspec *ovalu void timer_tracker::gettime (itimerspec *ovalue) { - if (!cancel) + if (!hcancel) memset (ovalue, 0, sizeof (*ovalue)); else { @@ -333,12 +338,12 @@ timer_delete (timer_t timerid) void fixup_timers_after_fork () { - ttstart.cancel = ttstart.syncthread = NULL; + ttstart.hcancel = ttstart.syncthread = NULL; for (timer_tracker *tt = &ttstart; tt->next != NULL; /* nothing */) { timer_tracker *deleteme = tt->next; tt->next = deleteme->next; - deleteme->cancel = deleteme->syncthread = NULL; + deleteme->hcancel = deleteme->syncthread = NULL; delete deleteme; } } |