From 4a72430d821b96add23846980d07f5a01059029d Mon Sep 17 00:00:00 2001 From: rpj Date: Sat, 2 Feb 2002 23:15:28 +0000 Subject: * cancel.c: Rearranged some code and introduced checks to disable cancelation at the start of a thread's cancelation run to prevent double cancelation. The main problem arises if a thread is canceling and then receives a subsequent async cancel request. * private.c: Likewise. * condvar.c: Place pragmas around cleanup_push/pop to turn off inline optimisation (/Obn where n>0 - MSVC only). Various optimisation switches in MSVC turn this on, which interferes with the way that cleanup handlers are run in C++ EH and SEH code. Application code compiled with inline optimisation must also wrap cleanup_push/pop blocks with the pragmas, e.g. #pragma inline_depth(0) pthread_cleanup_push(...) ... pthread_cleanup_pop(...) #pragma inline_depth(8) * rwlock.c: Likewise. * mutex.c: Remove attempts to inline some functions. * signal.c: Modify misleading comment. tests/ * mutex8: New test. * mutex8n: New test. * mutex8e: New test. * mutex8r: New test. * cancel6a: New test. * cancel6d: New test. * cleanup0.c: Add pragmas for inline optimisation control. * cleanup1.c: Add pragmas for inline optimisation control. * cleanup2.c: Add pragmas for inline optimisation control. * cleanup3.c: Add pragmas for inline optimisation control. * condvar7.c: Add pragmas for inline optimisation control. * condvar8.c: Add pragmas for inline optimisation control. * condvar9.c: Add pragmas for inline optimisation control. --- condvar.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'condvar.c') diff --git a/condvar.c b/condvar.c index 6f1c9f4..4d22608 100644 --- a/condvar.c +++ b/condvar.c @@ -920,6 +920,9 @@ ptw32_cond_timedwait (pthread_cond_t * cond, */ cleanup_args.signaled = 0; +#ifdef _MSC_VER +#pragma inline_depth(0) +#endif pthread_cleanup_push(ptw32_cond_wait_cleanup, (void *) &cleanup_args); /* @@ -935,13 +938,13 @@ ptw32_cond_timedwait (pthread_cond_t * cond, * timeout, or * thread cancellation * - * Note: + * Note: * * sem_timedwait is a cancellation point, - * hence providing the mechanism for making - * pthread_cond_wait a cancellation point. + * hence providing the mechanism for making + * pthread_cond_wait a cancellation point. * We use the cleanup mechanism to ensure we - * re-lock the mutex and adjust (to)unblock(ed) waiters + * re-lock the mutex and adjust (to)unblock(ed) waiters * counts if we are cancelled, timed out or signalled. */ if (sem_timedwait(&(cv->semBlockQueue), abstime) != 0) @@ -959,6 +962,9 @@ ptw32_cond_timedwait (pthread_cond_t * cond, * Always cleanup */ pthread_cleanup_pop(1); +#ifdef _MSC_VER +#pragma inline_depth(8) +#endif /* * "result" can be modified by the cleanup handler. @@ -969,7 +975,7 @@ ptw32_cond_timedwait (pthread_cond_t * cond, static INLINE int -ptw32_cond_unblock (pthread_cond_t * cond, +ptw32_cond_unblock (pthread_cond_t * cond, int unblockAll) /* * Notes. -- cgit v1.2.3