diff options
| author | rpj <rpj> | 2011-03-07 01:23:25 +0000 | 
|---|---|---|
| committer | rpj <rpj> | 2011-03-07 01:23:25 +0000 | 
| commit | 247469c6f6a16681491ac3ee213e57efcdda6153 (patch) | |
| tree | 524cb8b1365cea86e12d8bee9b1a2bd93df4e6a4 | |
| parent | a39dab139b7c301ffd5a5592c292123c54e686cd (diff) | |
exception handling and c++ casts
| -rw-r--r-- | ChangeLog | 3 | ||||
| -rw-r--r-- | implement.h | 14 | ||||
| -rw-r--r-- | ptw32_MCS_lock.c | 9 | ||||
| -rw-r--r-- | ptw32_threadStart.c | 15 | 
4 files changed, 19 insertions, 22 deletions
@@ -3,6 +3,9 @@  	* several (MINGW64): Cast and call fixups for 64 bit compatibility;
  	clean build via x86_64-w64-mingw32 cross toolchain on Linux i686
  	targeting x86_64 win64.
 +	* ptw32_threadStart.c (ptw32_threadStart): Routine no longer attempts
 +	to pass [unexpected C++] exceptions out of scope but ends the thread
 +	normally setting EINTR as the exit status.
  2011-03-04  Ross Johnson <ross.johnson at homemail.com.au>
 diff --git a/implement.h b/implement.h index 5df0f93..807ae54 100644 --- a/implement.h +++ b/implement.h @@ -82,12 +82,16 @@ typedef VOID (APIENTRY *PAPCFUNC)(DWORD dwParam);  #define INLINE  #endif -#if defined (__MINGW64__) || defined(__MINGW32__) || (_MSC_VER >= 1300) -#define PTW32_INTERLOCKED_LONG long -#define PTW32_INTERLOCKED_LPLONG long* +#if defined (__MINGW64__) || defined(__MINGW32__) || defined(_MSC_VER) +#define PTW32_INTERLOCKED_LONG unsigned long +#define PTW32_INTERLOCKED_LPLONG volatile unsigned long* +#define PTW32_INTERLOCKED_PVOID PVOID +#define PTW32_INTERLOCKED_PVOID_PTR volatile PVOID*  #else  #define PTW32_INTERLOCKED_LONG PVOID -#define PTW32_INTERLOCKED_LPLONG PVOID* +#define PTW32_INTERLOCKED_LPLONG volatile PVOID* +#define PTW32_INTERLOCKED_PVOID PVOID +#define PTW32_INTERLOCKED_PVOID_PTR volatile PVOID*  #endif  #if defined(__MINGW64__) || defined(__MINGW32__) @@ -594,7 +598,7 @@ extern "C"    void ptw32_rwlock_cancelwrwait (void *arg); -#if ! (defined (__MINGW64__) || defined(__MINGW32__)) || defined (__MSVCRT__) +#if ! (defined (__MINGW64__) || defined(__MINGW32__)) || (defined (__MSVCRT__) && ! defined(__DMC__))    unsigned __stdcall  #else    void diff --git a/ptw32_MCS_lock.c b/ptw32_MCS_lock.c index ff74efa..08bea49 100644 --- a/ptw32_MCS_lock.c +++ b/ptw32_MCS_lock.c @@ -229,11 +229,10 @@ ptw32_mcs_lock_try_acquire (ptw32_mcs_lock_t * lock, ptw32_mcs_local_node_t * no    node->readyFlag = 0;    node->next = 0; /* initially, no successor */ -  return ((PTW32_INTERLOCKED_LPLONG)PTW32_INTERLOCKED_COMPARE_EXCHANGE_PTR( -                                      (PTW32_INTERLOCKED_LPLONG)lock, -                                      (PTW32_INTERLOCKED_LPLONG)node, -                                      (PTW32_INTERLOCKED_LPLONG)0) -               == (PTW32_INTERLOCKED_LPLONG)0) ? 0 : EBUSY; +  return ((PVOID)PTW32_INTERLOCKED_COMPARE_EXCHANGE_PTR((LPVOID volatile *)lock, +                                                        (PVOID)node, +                                                        (PVOID)0) +                                 == (PVOID)0) ? 0 : EBUSY;  }  /* diff --git a/ptw32_threadStart.c b/ptw32_threadStart.c index 8dcede3..3bc7ede 100644 --- a/ptw32_threadStart.c +++ b/ptw32_threadStart.c @@ -299,20 +299,11 @@ ptw32_threadStart (void *vthreadParms)    {      /*       * A system unexpected exception has occurred running the user's -     * terminate routine. We get control back within this block - cleanup -     * and release the exception out of thread scope. +     * terminate routine. We get control back within this block +     * and exit with a substitue status. If the thread was not +     * cancelled then this indicates the unhandled exception.       */      status = sp->exitStatus = PTHREAD_CANCELED; -    (void) pthread_mutex_lock (&sp->cancelLock); -    sp->state = PThreadStateException; -    (void) pthread_mutex_unlock (&sp->cancelLock); -    (void) pthread_win32_thread_detach_np (); -    (void) set_terminate (ptw32_oldTerminate); -    throw; - -    /* -     * Never reached. -     */    }    (void) set_terminate (ptw32_oldTerminate);  | 
