diff options
-rw-r--r-- | Include/pythread.h | 17 | ||||
-rw-r--r-- | Include/thread.h | 17 | ||||
-rw-r--r-- | Python/thread.c | 21 |
3 files changed, 40 insertions, 15 deletions
diff --git a/Include/pythread.h b/Include/pythread.h index fb2ff48..e29f7e6 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -1,19 +1,24 @@ #ifndef _THREAD_H_included #define _THREAD_H_included -#ifdef __STDC__ +#if defined(__STDC__) || defined(__cplusplus) #define _P(args) args #else #define _P(args) () #endif +typedef void *type_lock; +typedef void *type_sema; + +#ifdef __cplusplus +extern "C" { +#endif + void init_thread _P((void)); int start_new_thread _P((void (*)(void *), void *)); void exit_thread _P((void)); void _exit_thread _P((void)); -typedef void *type_lock; - type_lock allocate_lock _P((void)); void free_lock _P((type_lock)); int acquire_lock _P((type_lock, int)); @@ -21,8 +26,6 @@ int acquire_lock _P((type_lock, int)); #define NOWAIT_LOCK 0 void release_lock _P((type_lock)); -typedef void *type_sema; - type_sema allocate_sema _P((int)); void free_sema _P((type_sema)); void down_sema _P((type_sema)); @@ -31,6 +34,10 @@ void up_sema _P((type_sema)); void exit_prog _P((int)); void _exit_prog _P((int)); +#ifdef __cplusplus +} +#endif + #undef _P #endif diff --git a/Include/thread.h b/Include/thread.h index fb2ff48..e29f7e6 100644 --- a/Include/thread.h +++ b/Include/thread.h @@ -1,19 +1,24 @@ #ifndef _THREAD_H_included #define _THREAD_H_included -#ifdef __STDC__ +#if defined(__STDC__) || defined(__cplusplus) #define _P(args) args #else #define _P(args) () #endif +typedef void *type_lock; +typedef void *type_sema; + +#ifdef __cplusplus +extern "C" { +#endif + void init_thread _P((void)); int start_new_thread _P((void (*)(void *), void *)); void exit_thread _P((void)); void _exit_thread _P((void)); -typedef void *type_lock; - type_lock allocate_lock _P((void)); void free_lock _P((type_lock)); int acquire_lock _P((type_lock, int)); @@ -21,8 +26,6 @@ int acquire_lock _P((type_lock, int)); #define NOWAIT_LOCK 0 void release_lock _P((type_lock)); -typedef void *type_sema; - type_sema allocate_sema _P((int)); void free_sema _P((type_sema)); void down_sema _P((type_sema)); @@ -31,6 +34,10 @@ void up_sema _P((type_sema)); void exit_prog _P((int)); void _exit_prog _P((int)); +#ifdef __cplusplus +} +#endif + #undef _P #endif diff --git a/Python/thread.c b/Python/thread.c index 2c851dd..149190f 100644 --- a/Python/thread.c +++ b/Python/thread.c @@ -1,7 +1,8 @@ #include "thread.h" #ifdef DEBUG -#define dprintf(args) printf args +static int thread_debug = 0; +#define dprintf(args) (thread_debug && printf args) #else #define dprintf(args) #endif @@ -102,6 +103,9 @@ void init_thread _P0() struct sigaction s; #endif +#ifdef DEBUG + thread_debug = getenv("THREADDEBUG") != 0; +#endif dprintf(("init_thread called\n")); if (initialized) return; @@ -112,7 +116,7 @@ void init_thread _P0() atexit(maybe_exit); s.sa_handler = exit_sig; sigemptyset(&s.sa_mask); - sigaddset(&s.sa_mask, SIGUSR1); + /*sigaddset(&s.sa_mask, SIGUSR1);*/ s.sa_flags = 0; sigaction(SIGUSR1, &s, 0); prctl(PR_SETEXITSIG, SIGUSR1); @@ -189,8 +193,12 @@ static void do_exit_thread _P1(no_cleanup, int no_cleanup) int i; /* notify other threads */ - for (i = 0; i < maxpidindex; i++) - (void) kill(pidlist[i], SIGUSR1); + if (nthreads >= 0) { + dprintf(("kill other threads\n")); + for (i = 0; i < maxpidindex; i++) + (void) kill(pidlist[i], SIGKILL); + _exit(exit_status); + } } waiting_for_threads = 1; ussetlock(wait_lock); @@ -212,7 +220,8 @@ static void do_exit_thread _P1(no_cleanup, int no_cleanup) if (waiting_for_threads) { dprintf(("main thread is waiting\n")); usunsetlock(wait_lock); - } + } else if (do_exit) + (void) kill(my_pid, SIGUSR1); (void) usunsetlock(count_lock); _exit(0); #endif @@ -361,6 +370,8 @@ type_sema allocate_sema _P1(value, int value) #endif dprintf(("allocate_sema called\n")); + if (!initialized) + init_thread(); #ifdef __sgi sema = usnewsema(shared_arena, value); |