diff options
Diffstat (limited to 'private.c')
| -rw-r--r-- | private.c | 69 | 
1 files changed, 58 insertions, 11 deletions
@@ -62,7 +62,7 @@ ptw32_processInitialize (void)        * ------------------------------------------------------        */  { -	if (ptw32_rocessInitialized) { +	if (ptw32_processInitialized) {  		/*   		 * ignore if already initialized. this is useful for   		 * programs that uses a non-dll pthread @@ -184,6 +184,7 @@ ptw32_threadStart (ThreadParms * threadParms)    pthread_t self;    void *(*start) (void *);    void *arg; +  #ifdef _MSC_VER    DWORD ei[] = {0,0,0};  #endif @@ -221,21 +222,21 @@ ptw32_threadStart (ThreadParms * threadParms)      /*       * Run the caller's routine;       */ -    status = (*start) (arg); +    status = self->exitStatus = (*start) (arg);    }    __except (ExceptionFilter(GetExceptionInformation(), ei))    {      DWORD ec = GetExceptionCode(); -    if (ec == EXCEPTION_PTHREAD_SERVICES) +    if (ec == EXCEPTION_PTW32_SERVICES)        {  	switch (ei[0])  	  { -	  case _PTHREAD_EPS_CANCEL: +	  case PTW32_EPS_CANCEL:  	    status = PTHREAD_CANCELED;  	    break; -	  case _PTHREAD_EPS_EXIT: -	    status = (void *) ei[1]; +	  case PTW32_EPS_EXIT: +	    status = self->exitStatus;  	    break;  	  default:  	    status = PTHREAD_CANCELED; @@ -247,7 +248,7 @@ ptw32_threadStart (ThreadParms * threadParms)  	/*  	 * A system unexpected exception had occurred running the user's  	 * routine. We get control back within this block because -         * we can't allow the exception out of thread scope. +         * we can't allow the exception to pass out of thread scope.  	 */  	status = PTHREAD_CANCELED;        } @@ -264,14 +265,14 @@ ptw32_threadStart (ThreadParms * threadParms)       */      status = self->exitStatus = (*start) (arg);    } -  catch (Pthread_exception_cancel) +  catch (ptw32_exception_cancel)      {        /*         * Thread was cancelled.         */        status = self->exitStatus = PTHREAD_CANCELED;      } -  catch (Pthread_exception_exit) +  catch (ptw32_exception_exit)      {        /*         * Thread was exited via pthread_exit(). @@ -294,7 +295,7 @@ ptw32_threadStart (ThreadParms * threadParms)     * Run the caller's routine; no cancelation or other exceptions will     * be honoured.     */ -  status = (*start) (arg); +  status = self->exitStatus = (*start) (arg);  #endif /* __cplusplus */ @@ -800,7 +801,7 @@ ptw32_get_exception_services_code(void)  {  #if defined(_MSC_VER) && !defined(__cplusplus) -  return EXCEPTION_PTHREAD_SERVICES; +  return EXCEPTION_PTW32_SERVICES;  #else @@ -808,3 +809,49 @@ ptw32_get_exception_services_code(void)  #endif  } + + +void +ptw32_throw(DWORD exception) +{ +  if (exception != PTW32_EPS_CANCEL || +      exception != PTW32_EPS_EXIT) +    { +      /* Should never enter here */ +      exit(1); +    } + +#if defined(_MSC_VER) && !defined(__cplusplus) + +  DWORD exceptionInformation[3]; + +  exceptionInformation[0] = (DWORD) (exception); +  exceptionInformation[1] = (DWORD) (0); +  exceptionInformation[2] = (DWORD) (0); + +  RaiseException ( +		  EXCEPTION_PTW32_SERVICES, +		  0, +		  3, +		  exceptionInformation); + +#else /* _MSC_VER && ! __cplusplus */ + +# ifdef __cplusplus + +  switch (exception) +    { +    case PTW32_EPS_CANCEL: +      throw ptw32_exception_cancel(); +      break; +    case PTW32_EPS_EXIT: +      throw ptw32_exception_exit(); +      break; +    } + +# endif /* __cplusplus */ + +#endif /* _MSC_VER && ! __cplusplus */ + +  /* Never reached */ +}  | 
