summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Python/thread.c103
1 files changed, 82 insertions, 21 deletions
diff --git a/Python/thread.c b/Python/thread.c
index 76a67af..1f2ae9d 100644
--- a/Python/thread.c
+++ b/Python/thread.c
@@ -14,6 +14,7 @@ static int thread_debug = 0;
#include <sys/types.h>
#include <sys/prctl.h>
#include <ulocks.h>
+#include <errno.h>
#define MAXPROC 100 /* max # of threads that can be started */
@@ -101,6 +102,9 @@ void init_thread _P0()
{
#ifdef __sgi
struct sigaction s;
+#ifdef USE_DL
+ long addr, size;
+#endif
#endif
#ifdef DEBUG
@@ -112,6 +116,17 @@ void init_thread _P0()
dprintf(("init_thread called\n"));
#ifdef __sgi
+#ifdef USE_DL
+ if ((size = usconfig(CONF_INITSIZE, 64*1024)) < 0)
+ perror("usconfig - CONF_INITSIZE (check)");
+ if (usconfig(CONF_INITSIZE, size) < 0)
+ perror("usconfig - CONF_INITSIZE (reset)");
+ addr = (long) dl_getrange(size + sizeof(ushdr_t));
+ dprintf(("trying to use addr %lx-%lx for shared arena\n", addr, addr+size));
+ errno = 0;
+ if ((addr = usconfig(CONF_ATTACHADDR, addr)) < 0 && errno != 0)
+ perror("usconfig - CONF_ATTACHADDR (set)");
+#endif
if (usconfig(CONF_INITUSERS, 16) < 0)
perror("usconfig - CONF_INITUSERS");
my_pid = getpid(); /* so that we know which is the main thread */
@@ -128,13 +143,16 @@ void init_thread _P0()
/*usconfig(CONF_LOCKTYPE, US_DEBUGPLUS);*/
if ((shared_arena = usinit(tmpnam(0))) == 0)
perror("usinit");
- count_lock = usnewlock(shared_arena);
+#ifdef USE_DL
+ if (usconfig(CONF_ATTACHADDR, addr) < 0) /* reset address */
+ perror("usconfig - CONF_ATTACHADDR (reset)");
+#endif
+ if ((count_lock = usnewlock(shared_arena)) == NULL)
+ perror("usnewlock (count_lock)");
(void) usinitlock(count_lock);
- wait_lock = usnewlock(shared_arena);
+ if ((wait_lock = usnewlock(shared_arena)) == NULL)
+ perror("usnewlock (wait_lock)");
dprintf(("arena start: %lx, arena size: %ld\n", (long) shared_arena, (long) usconfig(CONF_GETSIZE, shared_arena)));
-#ifdef USE_DL /* for python */
- dl_setrange((long) shared_arena, (long) shared_arena + 64 * 1024);
-#endif
#endif
#ifdef sun
lwp_setstkcache(STACKSIZE, NSTACKS);
@@ -152,6 +170,10 @@ int start_new_thread _P2(func, void (*func) _P((void *)), arg, void *arg)
#ifdef sun
thread_t tid;
#endif
+#if defined(__sgi) && defined(USE_DL)
+ long addr, size;
+ static int local_initialized = 0;
+#endif
int success = 0; /* init not needed when SOLARIS and */
/* C_THREADS implemented properly */
@@ -159,18 +181,42 @@ int start_new_thread _P2(func, void (*func) _P((void *)), arg, void *arg)
if (!initialized)
init_thread();
#ifdef __sgi
- if (ussetlock(count_lock) == 0)
- return 0;
+ switch (ussetlock(count_lock)) {
+ case 0: return 0;
+ case -1: perror("ussetlock (count_lock)");
+ }
if (maxpidindex >= MAXPROC)
success = -1;
else {
- success = sproc(func, PR_SALL, arg);
+#ifdef USE_DL
+ if (!local_initialized) {
+ if ((size = usconfig(CONF_INITSIZE, 64*1024)) < 0)
+ perror("usconfig - CONF_INITSIZE (check)");
+ if (usconfig(CONF_INITSIZE, size) < 0)
+ perror("usconfig - CONF_INITSIZE (reset)");
+ addr = (long) dl_getrange(size + sizeof(ushdr_t));
+ dprintf(("trying to use addr %lx-%lx for sproc\n", addr, addr+size));
+ errno = 0;
+ if ((addr = usconfig(CONF_ATTACHADDR, addr)) < 0 && errno != 0)
+ perror("usconfig - CONF_ATTACHADDR (set)");
+ }
+#endif
+ if ((success = sproc(func, PR_SALL, arg)) < 0)
+ perror("sproc");
+#ifdef USE_DL
+ if (!local_initialized) {
+ if (usconfig(CONF_ATTACHADDR, addr) < 0) /* reset address */
+ perror("usconfig - CONF_ATTACHADDR (reset)");
+ local_initialized = 1;
+ }
+#endif
if (success >= 0) {
nthreads++;
pidlist[maxpidindex++] = success;
}
}
- (void) usunsetlock(count_lock);
+ if (usunsetlock(count_lock) < 0)
+ perror("usunsetlock (count_lock)");
#endif
#ifdef SOLARIS
(void) thread_create(0, 0, func, arg, THREAD_NEW_LWP);
@@ -193,7 +239,8 @@ static void do_exit_thread _P1(no_cleanup, int no_cleanup)
else
exit(0);
#ifdef __sgi
- (void) ussetlock(count_lock);
+ if (ussetlock(count_lock) < 0)
+ perror("ussetlock (count_lock)");
nthreads--;
if (getpid() == my_pid) {
/* main thread; wait for other threads to exit */
@@ -210,7 +257,8 @@ static void do_exit_thread _P1(no_cleanup, int no_cleanup)
}
}
waiting_for_threads = 1;
- ussetlock(wait_lock);
+ if (ussetlock(wait_lock) < 0)
+ perror("ussetlock (wait_lock)");
for (;;) {
if (nthreads < 0) {
dprintf(("really exit (%d)\n", exit_status));
@@ -219,19 +267,24 @@ static void do_exit_thread _P1(no_cleanup, int no_cleanup)
else
exit(exit_status);
}
- usunsetlock(count_lock);
+ if (usunsetlock(count_lock) < 0)
+ perror("usunsetlock (count_lock)");
dprintf(("waiting for other threads (%d)\n", nthreads));
- ussetlock(wait_lock);
- ussetlock(count_lock);
+ if (ussetlock(wait_lock) < 0)
+ perror("ussetlock (wait_lock)");
+ if (ussetlock(count_lock) < 0)
+ perror("ussetlock (count_lock)");
}
}
/* not the main thread */
if (waiting_for_threads) {
dprintf(("main thread is waiting\n"));
- usunsetlock(wait_lock);
+ if (usunsetlock(wait_lock) < 0)
+ perror("usunsetlock (wait_lock)");
} else if (do_exit)
(void) kill(my_pid, SIGUSR1);
- (void) usunsetlock(count_lock);
+ if (usunsetlock(count_lock) < 0)
+ perror("usunsetlock (count_lock)");
_exit(0);
#endif
#ifdef SOLARIS
@@ -301,7 +354,8 @@ type_lock allocate_lock _P0()
init_thread();
#ifdef __sgi
- lock = usnewlock(shared_arena);
+ if ((lock = usnewlock(shared_arena)) == NULL)
+ perror("usnewlock");
(void) usinitlock(lock);
#endif
#ifdef sun
@@ -332,10 +386,13 @@ int acquire_lock _P2(lock, type_lock lock, waitflag, int waitflag)
dprintf(("acquire_lock(%lx, %d) called\n", (long)lock, waitflag));
#ifdef __sgi
+ errno = 0; /* clear it just in case */
if (waitflag)
success = ussetlock((ulock_t) lock);
else
success = uscsetlock((ulock_t) lock, 1); /* Try it once */
+ if (success < 0)
+ perror(waitflag ? "ussetlock" : "uscsetlock");
#endif
#ifdef sun
success = 0;
@@ -359,7 +416,8 @@ void release_lock _P1(lock, type_lock lock)
{
dprintf(("release_lock(%lx) called\n", (long)lock));
#ifdef __sgi
- (void) usunsetlock((ulock_t) lock);
+ if (usunsetlock((ulock_t) lock) < 0)
+ perror("usunsetlock");
#endif
#ifdef sun
(void) mon_enter(((struct lock *) lock)->lock_monitor);
@@ -383,7 +441,8 @@ type_sema allocate_sema _P1(value, int value)
init_thread();
#ifdef __sgi
- sema = usnewsema(shared_arena, value);
+ if ((sema = usnewsema(shared_arena, value)) == NULL)
+ perror("usnewsema");
dprintf(("allocate_sema() -> %lx\n", (long) sema));
return (type_sema) sema;
#endif
@@ -401,7 +460,8 @@ void down_sema _P1(sema, type_sema sema)
{
dprintf(("down_sema(%lx) called\n", (long) sema));
#ifdef __sgi
- (void) uspsema((usema_t *) sema);
+ if (uspsema((usema_t *) sema) < 0)
+ perror("uspsema");
#endif
dprintf(("down_sema(%lx) return\n", (long) sema));
}
@@ -410,6 +470,7 @@ void up_sema _P1(sema, type_sema sema)
{
dprintf(("up_sema(%lx)\n", (long) sema));
#ifdef __sgi
- (void) usvsema((usema_t *) sema);
+ if (usvsema((usema_t *) sema) < 0)
+ perror("usvsema");
#endif
}