]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Added C++ support in thread.h; don't use signals if not strictly
authorSjoerd Mullender <sjoerd@acm.org>
Fri, 11 Sep 1992 15:19:27 +0000 (15:19 +0000)
committerSjoerd Mullender <sjoerd@acm.org>
Fri, 11 Sep 1992 15:19:27 +0000 (15:19 +0000)
necessary, and when they are, use SIGKILL; when compiled with -DDEBUG,
only print debug messages when "THREADDEBUG" is set in the environment.

Include/pythread.h
Include/thread.h
Python/thread.c

index fb2ff48f9616775d9475b88c0df0c43e12e136c0..e29f7e63bfec41c7da54761cac4e246cb490ccb9 100644 (file)
@@ -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
index fb2ff48f9616775d9475b88c0df0c43e12e136c0..e29f7e63bfec41c7da54761cac4e246cb490ccb9 100644 (file)
@@ -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
index 2c851ddc34a359bc9296b30b1cf6664d755fc4c9..149190fcf1dc510857c387923cecbf87025c313b 100644 (file)
@@ -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);