summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Include/pythread.h17
-rw-r--r--Include/thread.h17
-rw-r--r--Python/thread.c21
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);