* include/pthread.h: Change PTHREAD_MUTEX_DEFAULT to PTHREAD_MUTEX_NORMAL.

Revert PTHREAD_MUTEX_INITIALIZER to PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
since that is actually closer to what linux does.
* thread.h (cw_cancel_action): New enum.
(cancelable_wait): Use cw_cancel_action as third argument.
* thread.cc (cancelable_wait): Ditto.  Don't wait for cancel if cancel_action
== cw_no_cancel.
(pthread::create): Don't wait for cancel event since that is racy.
(pthread_mutex::pthread_mutex): Set default to PTHREAD_MUTEX_ERRORCHECK.
(pthread_mutexattr::pthread_mutexattr): Ditto.
(pthread_mutex::_lock): Tell cancelable_wait not to wait for cancellation
event.
(semaphore::_timedwait): Accommodate change in cancelable_wait args.
(pthread::join): Ditto.
This commit is contained in:
Christopher Faylor 2005-06-11 04:56:36 +00:00
parent b4177338e1
commit 8556456790
4 changed files with 47 additions and 24 deletions

View File

@ -1,3 +1,21 @@
2005-06-10 Christopher Faylor <cgf@timesys.com>
* include/pthread.h: Change PTHREAD_MUTEX_DEFAULT to
PTHREAD_MUTEX_NORMAL. Revert PTHREAD_MUTEX_INITIALIZER to
PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP since that is actually closer
to what linux does.
* thread.h (cw_cancel_action): New enum.
(cancelable_wait): Use cw_cancel_action as third argument.
* thread.cc (cancelable_wait): Ditto. Don't wait for cancel if
cancel_action == cw_no_cancel.
(pthread::create): Don't wait for cancel event since that is racy.
(pthread_mutex::pthread_mutex): Set default to PTHREAD_MUTEX_ERRORCHECK.
(pthread_mutexattr::pthread_mutexattr): Ditto.
(pthread_mutex::_lock): Tell cancelable_wait not to wait for
cancellation event.
(semaphore::_timedwait): Accommodate change in cancelable_wait args.
(pthread::join): Ditto.
2005-06-10 Corinna Vinschen <corinna@vinschen.de> 2005-06-10 Corinna Vinschen <corinna@vinschen.de>
* fhandler_socket.cc (fhandler_socket::sendto): Always initialize * fhandler_socket.cc (fhandler_socket::sendto): Always initialize
@ -50,7 +68,7 @@
2005-06-09 Christopher Faylor <cgf@timesys.com> 2005-06-09 Christopher Faylor <cgf@timesys.com>
* include/pthread.h (PTHREAD_MUEXT_INITIALIZER): Change to * include/pthread.h (PTHREAD_MUTEX_INITIALIZER): Change to
PTHREAD_NORMAL_MUTEX_INITIALIZER_NP to be closer to linux default. PTHREAD_NORMAL_MUTEX_INITIALIZER_NP to be closer to linux default.
2005-06-09 Christopher Faylor <cgf@timesys.com> 2005-06-09 Christopher Faylor <cgf@timesys.com>

View File

@ -53,12 +53,12 @@ extern "C"
#define PTHREAD_MUTEX_RECURSIVE 0 #define PTHREAD_MUTEX_RECURSIVE 0
#define PTHREAD_MUTEX_ERRORCHECK 1 #define PTHREAD_MUTEX_ERRORCHECK 1
#define PTHREAD_MUTEX_NORMAL 2 #define PTHREAD_MUTEX_NORMAL 2
#define PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_ERRORCHECK #define PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_NORMAL
/* this should be too low to ever be a valid address */ /* this should be too low to ever be a valid address */
#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP (pthread_mutex_t)18 #define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP (pthread_mutex_t)18
#define PTHREAD_NORMAL_MUTEX_INITIALIZER_NP (pthread_mutex_t)19 #define PTHREAD_NORMAL_MUTEX_INITIALIZER_NP (pthread_mutex_t)19
#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP (pthread_mutex_t)20 #define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP (pthread_mutex_t)20
#define PTHREAD_MUTEX_INITIALIZER PTHREAD_NORMAL_MUTEX_INITIALIZER_NP #define PTHREAD_MUTEX_INITIALIZER PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
#define PTHREAD_ONCE_INIT { PTHREAD_MUTEX_INITIALIZER, 0 } #define PTHREAD_ONCE_INIT { PTHREAD_MUTEX_INITIALIZER, 0 }
#define PTHREAD_PRIO_INHERIT #define PTHREAD_PRIO_INHERIT
#define PTHREAD_PRIO_NONE #define PTHREAD_PRIO_NONE

View File

@ -313,9 +313,8 @@ pthread::create (void *(*func) (void *), pthread_attr *newattr,
else else
{ {
postcreate (); postcreate ();
if (WaitForSingleObject (cancel_event, 5000) != WAIT_OBJECT_0) while (!cygtls)
thread_printf ("event never arrived after CreateThread"); low_priority_sleep (0);
ResetEvent (cancel_event);
} }
mutex.unlock (); mutex.unlock ();
} }
@ -604,7 +603,7 @@ pthread::static_cancel_self (void)
} }
DWORD DWORD
cancelable_wait (HANDLE object, DWORD timeout, const bool do_cancel, cancelable_wait (HANDLE object, DWORD timeout, const cw_cancel_action cancel_action,
const enum cw_sig_wait sig_wait) const enum cw_sig_wait sig_wait)
{ {
DWORD res; DWORD res;
@ -618,7 +617,7 @@ cancelable_wait (HANDLE object, DWORD timeout, const bool do_cancel,
if both objects are signaled. */ if both objects are signaled. */
wait_objects[num++] = object; wait_objects[num++] = object;
DWORD cancel_n; DWORD cancel_n;
if (!pthread::is_good_object (&thread) || if (cancel_action == cw_no_cancel || !pthread::is_good_object (&thread) ||
thread->cancelstate == PTHREAD_CANCEL_DISABLE) thread->cancelstate == PTHREAD_CANCEL_DISABLE)
cancel_n = (DWORD) -1; cancel_n = (DWORD) -1;
else else
@ -641,7 +640,7 @@ cancelable_wait (HANDLE object, DWORD timeout, const bool do_cancel,
res = WaitForMultipleObjects (num, wait_objects, FALSE, timeout); res = WaitForMultipleObjects (num, wait_objects, FALSE, timeout);
if (res == cancel_n) if (res == cancel_n)
{ {
if (do_cancel) if (cancel_action == cw_cancel_self)
pthread::static_cancel_self (); pthread::static_cancel_self ();
res = WAIT_CANCELED; res = WAIT_CANCELED;
} }
@ -954,7 +953,7 @@ pthread_cond::wait (pthread_mutex_t mutex, DWORD dwMilliseconds)
++mutex->condwaits; ++mutex->condwaits;
mutex->unlock (); mutex->unlock ();
rv = cancelable_wait (sem_wait, dwMilliseconds, false, cw_sig_eintr); rv = cancelable_wait (sem_wait, dwMilliseconds, cw_no_cancel_self, cw_sig_eintr);
mtx_out.lock (); mtx_out.lock ();
@ -1504,7 +1503,7 @@ pthread_mutex::pthread_mutex (pthread_mutexattr *attr) :
verifyable_object (PTHREAD_MUTEX_MAGIC), verifyable_object (PTHREAD_MUTEX_MAGIC),
lock_counter (0), lock_counter (0),
win32_obj_id (NULL), recursion_counter (0), win32_obj_id (NULL), recursion_counter (0),
condwaits (0), owner (NULL), type (PTHREAD_MUTEX_DEFAULT), condwaits (0), owner (NULL), type (PTHREAD_MUTEX_ERRORCHECK),
pshared (PTHREAD_PROCESS_PRIVATE) pshared (PTHREAD_PROCESS_PRIVATE)
{ {
win32_obj_id = ::CreateSemaphore (&sec_none_nih, 0, LONG_MAX, NULL); win32_obj_id = ::CreateSemaphore (&sec_none_nih, 0, LONG_MAX, NULL);
@ -1544,7 +1543,12 @@ pthread_mutex::_lock (pthread_t self)
if (InterlockedIncrement ((long *)&lock_counter) == 1) if (InterlockedIncrement ((long *)&lock_counter) == 1)
set_owner (self); set_owner (self);
else if (type != PTHREAD_MUTEX_NORMAL && pthread::equal (owner, self)) else if (type == PTHREAD_MUTEX_NORMAL || !pthread::equal (owner, self))
{
(void) cancelable_wait (win32_obj_id, INFINITE, cw_no_cancel, cw_sig_resume);
set_owner (self);
}
else
{ {
InterlockedDecrement ((long *) &lock_counter); InterlockedDecrement ((long *) &lock_counter);
if (type == PTHREAD_MUTEX_RECURSIVE) if (type == PTHREAD_MUTEX_RECURSIVE)
@ -1552,11 +1556,6 @@ pthread_mutex::_lock (pthread_t self)
else else
result = EDEADLK; result = EDEADLK;
} }
else
{
cancelable_wait (win32_obj_id, INFINITE, false, cw_sig_resume);
set_owner (self);
}
return result; return result;
} }
@ -1640,7 +1639,7 @@ pthread_mutexattr::is_good_object (pthread_mutexattr_t const * attr)
} }
pthread_mutexattr::pthread_mutexattr ():verifyable_object (PTHREAD_MUTEXATTR_MAGIC), pthread_mutexattr::pthread_mutexattr ():verifyable_object (PTHREAD_MUTEXATTR_MAGIC),
pshared (PTHREAD_PROCESS_PRIVATE), mutextype (PTHREAD_MUTEX_DEFAULT) pshared (PTHREAD_PROCESS_PRIVATE), mutextype (PTHREAD_MUTEX_ERRORCHECK)
{ {
} }
@ -1787,7 +1786,7 @@ semaphore::_timedwait (const struct timespec *abstime)
waitlength -= tv.tv_sec * 1000 + tv.tv_usec / 1000; waitlength -= tv.tv_sec * 1000 + tv.tv_usec / 1000;
if (waitlength < 0) if (waitlength < 0)
waitlength = 0; waitlength = 0;
switch (cancelable_wait (win32_obj_id, waitlength, true, cw_sig_eintr)) switch (cancelable_wait (win32_obj_id, waitlength, cw_cancel_self, cw_sig_eintr))
{ {
case WAIT_OBJECT_0: case WAIT_OBJECT_0:
currentvalue--; currentvalue--;
@ -1809,7 +1808,7 @@ semaphore::_timedwait (const struct timespec *abstime)
int int
semaphore::_wait () semaphore::_wait ()
{ {
switch (cancelable_wait (win32_obj_id, INFINITE, true, cw_sig_eintr)) switch (cancelable_wait (win32_obj_id, INFINITE, cw_cancel_self, cw_sig_eintr))
{ {
case WAIT_OBJECT_0: case WAIT_OBJECT_0:
currentvalue--; currentvalue--;
@ -1882,7 +1881,6 @@ pthread::thread_init_wrapper (void *arg)
{ {
pthread *thread = (pthread *) arg; pthread *thread = (pthread *) arg;
set_tls_self_pointer (thread); set_tls_self_pointer (thread);
SetEvent (thread->cancel_event);
thread->mutex.lock (); thread->mutex.lock ();
@ -2263,7 +2261,7 @@ pthread::join (pthread_t *thread, void **return_val)
(*thread)->attr.joinable = PTHREAD_CREATE_DETACHED; (*thread)->attr.joinable = PTHREAD_CREATE_DETACHED;
(*thread)->mutex.unlock (); (*thread)->mutex.unlock ();
switch (cancelable_wait ((*thread)->win32_obj_id, INFINITE, false, cw_sig_resume)) switch (cancelable_wait ((*thread)->win32_obj_id, INFINITE, cw_no_cancel_self, cw_sig_resume))
{ {
case WAIT_OBJECT_0: case WAIT_OBJECT_0:
if (return_val) if (return_val)

View File

@ -31,6 +31,13 @@ enum cw_sig_wait
cw_sig_resume cw_sig_resume
}; };
enum cw_cancel_action
{
cw_cancel_self,
cw_no_cancel_self,
cw_no_cancel
};
extern "C" extern "C"
{ {
void SetResourceLock (int, int, const char *) __attribute__ ((regparm (3))); void SetResourceLock (int, int, const char *) __attribute__ ((regparm (3)));
@ -38,7 +45,7 @@ void ReleaseResourceLock (int, int, const char *)
__attribute__ ((regparm (3))); __attribute__ ((regparm (3)));
} }
DWORD cancelable_wait (HANDLE, DWORD, const bool = true, const enum cw_sig_wait = cw_sig_nosig) DWORD cancelable_wait (HANDLE, DWORD, const cw_cancel_action = cw_cancel_self, const enum cw_sig_wait = cw_sig_nosig)
__attribute__ ((regparm (3))); __attribute__ ((regparm (3)));
class fast_mutex class fast_mutex
@ -70,7 +77,7 @@ public:
void lock () void lock ()
{ {
if (InterlockedIncrement ((long *) &lock_counter) != 1) if (InterlockedIncrement ((long *) &lock_counter) != 1)
cancelable_wait (win32_obj_id, INFINITE, false, cw_sig_resume); cancelable_wait (win32_obj_id, INFINITE, cw_no_cancel, cw_sig_resume);
} }
void unlock () void unlock ()