diff options
-rw-r--r-- | Modules/md5module.c | 4 | ||||
-rw-r--r-- | Modules/sunaudiodev.c | 39 | ||||
-rw-r--r-- | Modules/threadmodule.c | 2 | ||||
-rw-r--r-- | Python/thread.c | 203 |
4 files changed, 203 insertions, 45 deletions
diff --git a/Modules/md5module.c b/Modules/md5module.c index 8bfbafb..6230cee 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -41,8 +41,6 @@ extern typeobject MD5type; /* Really static, forward */ #define is_md5object(v) ((v)->ob_type == &MD5type) -static const char initialiser_name[] = "md5"; - /* #define MD5_DEBUG */ static md5object * @@ -207,7 +205,7 @@ typeobject MD5type = { /* List of functions exported by this module */ static struct methodlist md5_functions[] = { - {initialiser_name, MD5_md5}, + {"md5", MD5_md5}, {NULL, NULL} /* Sentinel */ }; diff --git a/Modules/sunaudiodev.c b/Modules/sunaudiodev.c index 4e63123..5bd7249 100644 --- a/Modules/sunaudiodev.c +++ b/Modules/sunaudiodev.c @@ -30,7 +30,11 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include <stropts.h> #include <sys/ioctl.h> +#ifdef SOLARIS +#include <multimedia/libaudio.h> +#else #include <sun/audioio.h> +#endif /* #define offsetof(str,mem) ((int)(((str *)0)->mem)) */ @@ -50,7 +54,7 @@ typedef struct { extern typeobject Sadtype; /* Really static, forward */ extern typeobject Sadstatustype; /* Really static, forward */ -extern sadstatusobject *sads_alloc(); /* Forward */ +static sadstatusobject *sads_alloc(); /* Forward */ static object *SunAudioError; @@ -256,6 +260,24 @@ sad_drain(self, args) return None; } +#ifdef SOLARIS +static object * +sad_getdev(self, args) + sadobject *self; + object *args; +{ + struct audio_device ad; + + if ( !getargs(args, "") ) + return 0; + if ( ioctl(self->x_fd, AUDIO_GETDEV, &ad) < 0 ) { + err_errno(SunAudioError); + return NULL; + } + return mkvalue("(sss)", ad.name, ad.version, ad.config); +} +#endif + static object * sad_flush(self, args) sadobject *self; @@ -298,6 +320,9 @@ static struct methodlist sad_methods[] = { { "setinfo", sad_setinfo }, { "drain", sad_drain }, { "flush", sad_flush }, +#ifdef SOLARIS + { "getdev", sad_getdev }, +#endif { "close", sad_close }, {NULL, NULL} /* sentinel */ }; @@ -345,6 +370,11 @@ static struct memberlist sads_ml[] = { { "i_waiting", T_UBYTE, OFF(record.waiting) }, { "i_open", T_UBYTE, OFF(record.open) , RO}, { "i_active", T_UBYTE, OFF(record.active) , RO}, +#ifdef SOLARIS + { "i_buffer_size", T_UINT, OFF(record.buffer_size) }, + { "i_balance", T_UBYTE, OFF(record.balance) }, + { "i_avail_ports", T_UINT, OFF(record.avail_ports) }, +#endif { "o_sample_rate", T_UINT, OFF(play.sample_rate) }, { "o_channels", T_UINT, OFF(play.channels) }, @@ -359,6 +389,11 @@ static struct memberlist sads_ml[] = { { "o_waiting", T_UBYTE, OFF(play.waiting) }, { "o_open", T_UBYTE, OFF(play.open) , RO}, { "o_active", T_UBYTE, OFF(play.active) , RO}, +#ifdef SOLARIS + { "o_buffer_size", T_UINT, OFF(play.buffer_size) }, + { "o_balance", T_UBYTE, OFF(play.balance) }, + { "o_avail_ports", T_UINT, OFF(play.avail_ports) }, +#endif { "monitor_gain", T_UINT, OFF(monitor_gain) }, { NULL, 0, 0}, @@ -382,7 +417,7 @@ sads_setattr(xp, name, v) if (v == NULL) { err_setstr(TypeError, "can't delete sun audio status attributes"); - return NULL; + return 0; } return setmember((char *)&xp->ai, sads_ml, name, v); } diff --git a/Modules/threadmodule.c b/Modules/threadmodule.c index f22aa8c..40169a3 100644 --- a/Modules/threadmodule.c +++ b/Modules/threadmodule.c @@ -195,7 +195,7 @@ t_bootstrap(args_raw) func = gettupleitem(args, 0); arg = gettupleitem(args, 1); res = call_object(func, arg); - DECREF(arg); /* Matches the INCREF(arg) in thread_start_new_thread */ + DECREF(args); /* Matches the INCREF(args) in thread_start_new_thread */ if (res == NULL) { fprintf(stderr, "Unhandled exception in thread:\n"); print_error(); /* From pythonmain.c */ diff --git a/Python/thread.c b/Python/thread.c index f2e7ae9..b6c9df7 100644 --- a/Python/thread.c +++ b/Python/thread.c @@ -26,9 +26,11 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #ifdef DEBUG static int thread_debug = 0; -#define dprintf(args) (thread_debug && printf args) +#define dprintf(args) ((thread_debug & 1) && printf args) +#define d2printf(args) ((thread_debug & 8) && printf args) #else #define dprintf(args) +#define d2printf(args) #endif #ifdef __sgi @@ -43,7 +45,7 @@ static int thread_debug = 0; #define HDR_SIZE 2680 /* sizeof(ushdr_t) */ #define MAXPROC 100 /* max # of threads that can be started */ -/*static*/ usptr_t *shared_arena; +static usptr_t *shared_arena; static ulock_t count_lock; /* protection for some variables */ static ulock_t wait_lock; /* lock used to wait for other threads */ static int waiting_for_threads; /* protected by count_lock */ @@ -54,6 +56,13 @@ static int exiting; /* we're already exiting (for maybe_exit) */ static pid_t my_pid; /* PID of main thread */ static pid_t pidlist[MAXPROC]; /* PIDs of other threads */ static int maxpidindex; /* # of PIDs in pidlist */ +#endif /* __sgi */ +#ifdef SOLARIS +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> +#include </usr/include/thread.h> +#undef sun #endif #ifdef sun #include <lwp/lwp.h> @@ -67,10 +76,13 @@ struct lock { cv_t lock_condvar; mon_t lock_monitor; }; -#endif +#endif /* sun */ #ifdef C_THREADS #include <cthreads.h> -#endif +#endif /* C_THREADS */ +#ifdef _POSIX_THREADS +#include <pthread.h> +#endif /* _POSIX_THREADS */ #ifdef __STDC__ #define _P(args) args @@ -82,7 +94,7 @@ struct lock { #define _P0() () #define _P1(v,t) (v) t; #define _P2(v1,t1,v2,t2) (v1,v2) t1; t2; -#endif +#endif /* __STDC__ */ static int initialized; @@ -94,13 +106,17 @@ static int initialized; */ static void exit_sig _P0() { - dprintf(("exit_sig called\n")); + d2printf(("exit_sig called\n")); if (exiting && getpid() == my_pid) { - dprintf(("already exiting\n")); + d2printf(("already exiting\n")); return; } if (do_exit) { - dprintf(("exiting in exit_sig\n")); + d2printf(("exiting in exit_sig\n")); +#ifdef DEBUG + if ((thread_debug & 8) == 0) + thread_debug &= ~1; /* don't produce debug messages */ +#endif exit_thread(); } } @@ -118,7 +134,7 @@ static void maybe_exit _P0() } exit_prog(0); } -#endif +#endif /* __sgi */ /* * Initialization. @@ -129,12 +145,19 @@ void init_thread _P0() struct sigaction s; #ifdef USE_DL long addr, size; -#endif -#endif +#endif /* USE_DL */ +#endif /* __sgi */ #ifdef DEBUG - thread_debug = getenv("THREADDEBUG") != 0; -#endif + char *p = getenv("THREADDEBUG"); + + if (p) { + if (*p) + thread_debug = atoi(p); + else + thread_debug = 1; + } +#endif /* DEBUG */ if (initialized) return; initialized = 1; @@ -151,7 +174,7 @@ void init_thread _P0() errno = 0; if ((addr = usconfig(CONF_ATTACHADDR, addr)) < 0 && errno != 0) perror("usconfig - CONF_ATTACHADDR (set)"); -#endif +#endif /* USE_DL */ if (usconfig(CONF_INITUSERS, 16) < 0) perror("usconfig - CONF_INITUSERS"); my_pid = getpid(); /* so that we know which is the main thread */ @@ -165,39 +188,72 @@ void init_thread _P0() perror("prctl - PR_SETEXITSIG"); if (usconfig(CONF_ARENATYPE, US_SHAREDONLY) < 0) perror("usconfig - CONF_ARENATYPE"); - /*usconfig(CONF_LOCKTYPE, US_DEBUGPLUS);*/ +#ifdef DEBUG + if (thread_debug & 4) + usconfig(CONF_LOCKTYPE, US_DEBUGPLUS); + else if (thread_debug & 2) + usconfig(CONF_LOCKTYPE, US_DEBUG); +#endif /* DEBUG */ if ((shared_arena = usinit(tmpnam(0))) == 0) perror("usinit"); #ifdef USE_DL if (usconfig(CONF_ATTACHADDR, addr) < 0) /* reset address */ perror("usconfig - CONF_ATTACHADDR (reset)"); -#endif +#endif /* USE_DL */ if ((count_lock = usnewlock(shared_arena)) == NULL) perror("usnewlock (count_lock)"); (void) usinitlock(count_lock); 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))); +#endif /* __sgi */ +#ifdef SOLARIS + /* nothing */ #endif #ifdef sun lwp_setstkcache(STACKSIZE, NSTACKS); -#endif +#endif /* sun */ #ifdef C_THREADS cthread_init(); -#endif +#endif /* C_THREADS */ } /* * Thread support. */ +#ifdef SOLARIS +struct func_arg { + void (*func) _P((void *)); + void *arg; +}; + +static void *new_func _P1(funcarg, void *funcarg) +{ + void (*func) _P((void *)); + void *arg; + + func = ((struct func_arg *) funcarg)->func; + arg = ((struct func_arg *) funcarg)->arg; + free(funcarg); + (*func)(arg); + return 0; +} +#endif /* SOLARIS */ + int start_new_thread _P2(func, void (*func) _P((void *)), arg, void *arg) { +#ifdef SOLARIS + struct func_arg *funcarg; +#endif #ifdef sun thread_t tid; -#endif +#endif /* sun */ #if defined(__sgi) && defined(USE_DL) long addr, size; static int local_initialized = 0; +#endif /* __sgi and USE_DL */ +#ifdef _POSIX_THREADS + pthread_t th; #endif int success = 0; /* init not needed when SOLARIS and */ /* C_THREADS implemented properly */ @@ -225,7 +281,7 @@ int start_new_thread _P2(func, void (*func) _P((void *)), arg, void *arg) if ((addr = usconfig(CONF_ATTACHADDR, addr)) < 0 && errno != 0) perror("usconfig - CONF_ATTACHADDR (set)"); } -#endif +#endif /* USE_DL */ if ((success = sproc(func, PR_SALL, arg)) < 0) perror("sproc"); #ifdef USE_DL @@ -234,7 +290,7 @@ int start_new_thread _P2(func, void (*func) _P((void *)), arg, void *arg) perror("usconfig - CONF_ATTACHADDR (reset)"); local_initialized = 1; } -#endif +#endif /* USE_DL */ if (success >= 0) { nthreads++; pidlist[maxpidindex++] = success; @@ -242,15 +298,25 @@ int start_new_thread _P2(func, void (*func) _P((void *)), arg, void *arg) } if (usunsetlock(count_lock) < 0) perror("usunsetlock (count_lock)"); -#endif +#endif /* __sgi */ #ifdef SOLARIS - (void) thread_create(0, 0, func, arg, THREAD_NEW_LWP); -#endif + funcarg = (struct func_arg *) malloc(sizeof(struct func_arg)); + funcarg->func = func; + funcarg->arg = arg; + if (thr_create(0, 0, new_func, funcarg, THR_NEW_LWP, 0)) { + perror("thr_create"); + free((void *) funcarg); + success = -1; + } +#endif /* SOLARIS */ #ifdef sun success = lwp_create(&tid, func, MINPRIO, 0, lwp_newstk(), 1, arg); -#endif +#endif /* sun */ #ifdef C_THREADS (void) cthread_fork(func, arg); +#endif /* C_THREADS */ +#ifdef _POSIX_THREADS + pthread_create(&th, NULL, func, arg); #endif return success < 0 ? 0 : 1; } @@ -311,16 +377,16 @@ static void do_exit_thread _P1(no_cleanup, int no_cleanup) if (usunsetlock(count_lock) < 0) perror("usunsetlock (count_lock)"); _exit(0); -#endif +#endif /* __sgi */ #ifdef SOLARIS - thread_exit(); -#endif + thr_exit(0); +#endif /* SOLARIS */ #ifdef sun lwp_destroy(SELF); -#endif +#endif /* sun */ #ifdef C_THREADS cthread_exit(0); -#endif +#endif /* C_THREADS */ } void exit_thread _P0() @@ -346,6 +412,12 @@ static void do_exit_prog _P2(status, int status, no_cleanup, int no_cleanup) exit_status = status; do_exit_thread(no_cleanup); #endif +#ifdef SOLARIS + if (no_cleanup) + _exit(status); + else + exit(status); +#endif #ifdef sun pod_exit(status); #endif @@ -369,6 +441,9 @@ type_lock allocate_lock _P0() #ifdef __sgi ulock_t lock; #endif +#ifdef SOLARIS + mutex_t *lock; +#endif #ifdef sun struct lock *lock; extern char *malloc(); @@ -382,13 +457,21 @@ type_lock allocate_lock _P0() if ((lock = usnewlock(shared_arena)) == NULL) perror("usnewlock"); (void) usinitlock(lock); -#endif +#endif /* __sgi */ +#ifdef SOLARIS + lock = (mutex_t *) malloc(sizeof(mutex_t)); + if (mutex_init(lock, USYNC_THREAD, 0)) { + perror("mutex_init"); + free((void *) lock); + lock = 0; + } +#endif /* SOLARIS */ #ifdef sun lock = (struct lock *) malloc(sizeof(struct lock)); lock->lock_locked = 0; (void) mon_create(&lock->lock_monitor); (void) cv_create(&lock->lock_condvar, lock->lock_monitor); -#endif +#endif /* sun */ dprintf(("allocate_lock() -> %lx\n", (long)lock)); return (type_lock) lock; } @@ -398,11 +481,15 @@ void free_lock _P1(lock, type_lock lock) dprintf(("free_lock(%lx) called\n", (long)lock)); #ifdef __sgi usfreelock((ulock_t) lock, shared_arena); +#endif /* __sgi */ +#ifdef SOLARIS + mutex_destroy((mutex_t *) lock); + free((void *) lock); #endif #ifdef sun mon_destroy(((struct lock *) lock)->lock_monitor); free((char *) lock); -#endif +#endif /* sun */ } int acquire_lock _P2(lock, type_lock lock, waitflag, int waitflag) @@ -418,7 +505,17 @@ int acquire_lock _P2(lock, type_lock lock, waitflag, int waitflag) success = uscsetlock((ulock_t) lock, 1); /* Try it once */ if (success < 0) perror(waitflag ? "ussetlock" : "uscsetlock"); -#endif +#endif /* __sgi */ +#ifdef SOLARIS + if (waitflag) + success = mutex_lock((mutex_t *) lock); + else + success = mutex_trylock((mutex_t *) lock); + if (success < 0) + perror(waitflag ? "mutex_lock" : "mutex_trylock"); + else + success = !success; /* solaris does it the other way round */ +#endif /* SOLARIS */ #ifdef sun success = 0; @@ -432,7 +529,7 @@ int acquire_lock _P2(lock, type_lock lock, waitflag, int waitflag) } cv_broadcast(((struct lock *) lock)->lock_condvar); mon_exit(((struct lock *) lock)->lock_monitor); -#endif +#endif /* sun */ dprintf(("acquire_lock(%lx, %d) -> %d\n", (long)lock, waitflag, success)); return success; } @@ -443,13 +540,17 @@ void release_lock _P1(lock, type_lock lock) #ifdef __sgi if (usunsetlock((ulock_t) lock) < 0) perror("usunsetlock"); -#endif +#endif /* __sgi */ +#ifdef SOLARIS + if (mutex_unlock((mutex_t *) lock)) + perror("mutex_unlock"); +#endif /* SOLARIS */ #ifdef sun (void) mon_enter(((struct lock *) lock)->lock_monitor); ((struct lock *) lock)->lock_locked = 0; cv_broadcast(((struct lock *) lock)->lock_condvar); mon_exit(((struct lock *) lock)->lock_monitor); -#endif +#endif /* sun */ } /* @@ -459,6 +560,9 @@ type_sema allocate_sema _P1(value, int value) { #ifdef __sgi usema_t *sema; +#endif /* __sgi */ +#ifdef SOLARIS + sema_t *sema; #endif dprintf(("allocate_sema called\n")); @@ -468,9 +572,17 @@ type_sema allocate_sema _P1(value, int value) #ifdef __sgi if ((sema = usnewsema(shared_arena, value)) == NULL) perror("usnewsema"); +#endif /* __sgi */ +#ifdef SOLARIS + sema = (sema_t *) malloc(sizeof(sema_t)); + if (sema_init(sema, value, USYNC_THREAD, 0)) { + perror("sema_init"); + free((void *) sema); + sema = 0; + } +#endif /* SOLARIS */ dprintf(("allocate_sema() -> %lx\n", (long) sema)); return (type_sema) sema; -#endif } void free_sema _P1(sema, type_sema sema) @@ -478,7 +590,12 @@ void free_sema _P1(sema, type_sema sema) dprintf(("free_sema(%lx) called\n", (long) sema)); #ifdef __sgi usfreesema((usema_t *) sema, shared_arena); -#endif +#endif /* __sgi */ +#ifdef SOLARIS + if (sema_destroy((sema_t *) sema)) + perror("sema_destroy"); + free((void *) sema); +#endif /* SOLARIS */ } void down_sema _P1(sema, type_sema sema) @@ -488,6 +605,10 @@ void down_sema _P1(sema, type_sema sema) if (uspsema((usema_t *) sema) < 0) perror("uspsema"); #endif +#ifdef SOLARIS + if (sema_wait((sema_t *) sema)) + perror("sema_wait"); +#endif dprintf(("down_sema(%lx) return\n", (long) sema)); } @@ -497,5 +618,9 @@ void up_sema _P1(sema, type_sema sema) #ifdef __sgi if (usvsema((usema_t *) sema) < 0) perror("usvsema"); +#endif /* __sgi */ +#ifdef SOLARIS + if (sema_post((sema_t *) sema)) + perror("sema_post"); #endif } |