diff options
author | rpj <rpj> | 2000-12-28 05:32:07 +0000 |
---|---|---|
committer | rpj <rpj> | 2000-12-28 05:32:07 +0000 |
commit | c94735ecdde19c4de652efd144faeec1a729b1e0 (patch) | |
tree | 1780c2bfe14e0b41931d85f6a5ed2f5e2695b6b2 /tests/exception3.c | |
parent | 548fc29a8cc3fd016eba997facc9566af8fd2d75 (diff) |
./ChangeLog:
2000-12-28 Ross Johnson <rpj@special.ise.canberra.edu.au>
* private.c (ptw32_threadStart): Unhandled exceptions are
now passed through to the system to deal with. This is consistent
with normal Windows behaviour. C++ applications may use
set_terminate() to override the default behaviour which is
to call ptw32_terminate(). Ptw32_terminate() cleans up some
POSIX thread stuff before calling the system default function
which calls abort(). The users termination function should conform
to standard C++ semantics which is to not return. It should
exit the thread (call pthread_exit()) or exit the application.
* private.c (ptw32_terminate): Added as the default set_terminate()
function. It calls the system default function after cleaning up
some POSIX thread stuff.
* implement.h (ptw32_try_enter_critical_section): Move
declaration.
* global.c (ptw32_try_enter_critical_section): Moved
from dll.c.
* dll.c: Move process and thread attach/detach code into
functions in nonportable.c.
* nonportable.c (pthread_win32_process_attach_np): Process
attach code from dll.c is now available to static linked
applications.
* nonportable.c (pthread_win32_process_detach_np): Likewise.
* nonportable.c (pthread_win32_thread_attach_np): Likewise.
* nonportable.c (pthread_win32_thread_detach_np): Likewise.
* pthread.h: Add new non-portable prototypes for static
linked applications.
* GNUmakefile (OPT): Increase optimisation flag and remove
debug info flag.
* pthread.def: Add new non-portable exports for static
linked applications.
2000-12-11 Ross Johnson <rpj@special.ise.canberra.edu.au>
* FAQ: Update Answer 6 re getting a fully working
Mingw32 built library.
2000-09-09 Ross Johnson <rpj@special.ise.canberra.edu.au>
* pthread.h (ctime_r): Fix arg.
./tests/ChangeLog:
2000-12-28 Ross Johnson <rpj@special.ise.canberra.edu.au>
* eyal1.c: Increase thread work loads.
* exception2.c: New test.
* exception3.c: New test.
* Makefile: Add new tests exception2.c and exception3.c.
* GNUmakefile: Likewise.
2000-12-11 Ross Johnson <rpj@special.ise.canberra.edu.au>
* cleanup3.c: Remove unused variable.
* cleanup2.c: Likewise.
* exception1.c: Throw an exception rather than use
a deliberate zero divide so that catch(...) will
handle it under Mingw32. Mingw32 now builds the
library correctly to pass all tests - see Thomas
Pfaff's detailed instructions re needed changes
to Mingw32 in the Pthreads-Win32 FAQ.
Diffstat (limited to 'tests/exception3.c')
-rw-r--r-- | tests/exception3.c | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/tests/exception3.c b/tests/exception3.c new file mode 100644 index 0000000..b820b4b --- /dev/null +++ b/tests/exception3.c @@ -0,0 +1,164 @@ +/* + * File: exception3.c + * + * Test Synopsis: Test running of user supplied teerminate() function. + * + * Test Method (Validation or Falsification): + * - + * + * Requirements Tested: + * - + * + * Features Tested: + * - + * + * Cases Tested: + * - + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * - have working pthread_create, pthread_self, pthread_mutex_lock/unlock + * pthread_testcancel, pthread_cancel, pthread_join + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + + +#if defined(_MSC_VER) && defined(__cplusplus) +#include <eh.h> +#else +#include <new.h> +#endif + +#if defined(_MSC_VER) || defined(__cplusplus) + +#include "test.h" + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { + NUMTHREADS = 20 +}; + +int caught = 0; +pthread_mutex_t caughtLock = PTHREAD_MUTEX_INITIALIZER; + +#if defined(_MSC_VER) && !defined(__cplusplus) + +LONG unhandledExceptionFilter (EXCEPTION_POINTERS *ep) +{ + if (ep->ExceptionRecord->ExceptionCode == 0x1) + { + pthread_mutex_lock(&caughtLock); + caught++; + pthread_mutex_unlock(&caughtLock); + } + + return EXCEPTION_CONTINUE_EXECUTION; +} + +#elif defined(__cplusplus) + +void +terminateFunction () +{ + pthread_mutex_lock(&caughtLock); + caught++; +#if 1 + { + FILE * fp = fopen("pthread.log", "a"); + fprintf(fp, "Caught = %d\n", caught); + fclose(fp); + } +#endif + pthread_mutex_unlock(&caughtLock); + pthread_exit((void *) 0); +} + +#endif + +void * +exceptionedThread(void * arg) +{ + int dummy = 0x1; + + { +#if defined(_MSC_VER) && !defined(__cplusplus) + + RaiseException(dummy, 0, 0, NULL); + +#elif defined(__cplusplus) + + (void) set_terminate(&terminateFunction); + + throw dummy; + +#endif + } + + return (void *) 100; +} + +int +main() +{ + int i; + pthread_t mt; + pthread_t et[NUMTHREADS]; + + assert((mt = pthread_self()) != NULL); + + { +#if defined(_MSC_VER) && !defined(__cplusplus) + LPTOP_LEVEL_EXCEPTION_FILTER oldHandler; + oldHandler = SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER) unhandledExceptionFilter); +#endif + + for (i = 0; i < NUMTHREADS; i++) + { + assert(pthread_create(&et[i], NULL, exceptionedThread, NULL) == 0); + } + +#if defined(_MSC_VER) && !defined(__cplusplus) + (void) SetUnhandledExceptionFilter(oldHandler); +#endif + + Sleep(30000); + } + + printf("Caught = %d\n", caught); + assert(caught == NUMTHREADS); + + /* + * Success. + */ + return 0; +} + +#else /* defined(_MSC_VER) || defined(__cplusplus) */ + +int +main() +{ + fprintf(stderr, "Test N/A for this compiler environment.\n"); + return 0; +} + +#endif /* defined(_MSC_VER) || defined(__cplusplus) */ |