diff options
author | Sjoerd Mullender <sjoerd@acm.org> | 1992-09-11 15:19:27 (GMT) |
---|---|---|
committer | Sjoerd Mullender <sjoerd@acm.org> | 1992-09-11 15:19:27 (GMT) |
commit | d10d8291f1de5bef74628bd1c766403ee9444dca (patch) | |
tree | 4a487cf3ae0b2afb303609ba7bd666265c947723 /Python | |
parent | 0aead9f1bac4f9fd962fedff2e377d69bb33fee6 (diff) | |
download | cpython-d10d8291f1de5bef74628bd1c766403ee9444dca.zip cpython-d10d8291f1de5bef74628bd1c766403ee9444dca.tar.gz cpython-d10d8291f1de5bef74628bd1c766403ee9444dca.tar.bz2 |
Added C++ support in thread.h; don't use signals if not strictly
necessary, and when they are, use SIGKILL; when compiled with -DDEBUG,
only print debug messages when "THREADDEBUG" is set in the environment.
Diffstat (limited to 'Python')
-rw-r--r-- | Python/thread.c | 21 |
1 files changed, 16 insertions, 5 deletions
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); |