Port to Solaris 2.3.

This commit is contained in:
Sjoerd Mullender 1993-12-03 16:54:45 +00:00
parent 57531fea90
commit 66bca326cb
4 changed files with 203 additions and 45 deletions

View File

@ -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 */
};

View File

@ -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);
}

View File

@ -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 */

View File

@ -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)
@ -487,6 +604,10 @@ void down_sema _P1(sema, type_sema sema)
#ifdef __sgi
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
}