From 5f3c7322e8f3f35cb0f8c250f337596c83961b25 Mon Sep 17 00:00:00 2001 From: rpj Date: Mon, 4 Jan 1999 23:22:35 +0000 Subject: Parts of this package are going to have to be C++ in the GNU world because we now use exception handling to implement thread cancellation. The MSC compiler appears to know about __try/__except blocks, but gcc (ie. the GNU ANSI C compiler) doesn't know about the equivalent C++ try/catch blocks. This should not be a problem since gcc and g++ are nearly always available together. Some file names may need to change in the CVS repository however. Tue Jan 5 16:33:04 1999 Ross Johnson * cleanup.c (_pthread_pop_cleanup): Add C++ version of __try/__except block. Move trailing "}" out of #ifdef _WIN32 block left there by (my) mistake. * private.c: Remove #include which is included by pthread.h. --- cleanup.c | 65 ++++++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 21 deletions(-) (limited to 'cleanup.c') diff --git a/cleanup.c b/cleanup.c index 12ce282..883c8ca 100644 --- a/cleanup.c +++ b/cleanup.c @@ -54,31 +54,54 @@ _pthread_pop_cleanup (int execute) #ifdef _WIN32 __try - { - /* - * Run the caller's cleanup routine. - */ - (*cleanup->routine) (cleanup->arg); - } + { + /* + * Run the caller's cleanup routine. + */ + (*cleanup->routine) (cleanup->arg); + } __except (EXCEPTION_EXECUTE_HANDLER) - { - /* - * A system unexpected exception had occurred - * running the user's cleanup routine. - * We get control back within this block. - */ - } - } - -#else - - /* - * Run the caller's cleanup routine. - */ - (*cleanup->routine) (cleanup->arg); + { + /* + * A system unexpected exception had occurred + * running the user's cleanup routine. + * We get control back within this block. + */ + } + +#else /* _WIN32 */ + +#ifdef _cplusplus + + try + { + /* + * Run the caller's cleanup routine. + */ + (*cleanup->routine) (cleanup->arg); + } + catch(...) + { + /* + * A system unexpected exception had occurred + * running the user's cleanup routine. + * We get control back within this block. + */ + } + +#else /* _cplusplus */ + + /* + * Run the caller's cleanup routine and FIXME: hope for the best. + */ + (*cleanup->routine) (cleanup->arg); + +#endif /* _cplusplus */ #endif /* _WIN32 */ + } + pthread_setspecific (_pthread_cleanupKey, cleanup->prev); } -- cgit v1.2.3