#include <stdlib.h> | |
#include <lwp/lwp.h> | |
#include <lwp/stackdep.h> | |
#define STACKSIZE 1000 /* stacksize for a thread */ | |
#define NSTACKS 2 /* # stacks to be put in cache initially */ | |
struct lock { | |
int lock_locked; | |
cv_t lock_condvar; | |
mon_t lock_monitor; | |
}; | |
/* | |
* Initialization. | |
*/ | |
static void PyThread__init_thread(void) | |
{ | |
lwp_setstkcache(STACKSIZE, NSTACKS); | |
} | |
/* | |
* Thread support. | |
*/ | |
long PyThread_start_new_thread(void (*func)(void *), void *arg) | |
{ | |
thread_t tid; | |
int success; | |
dprintf(("PyThread_start_new_thread called\n")); | |
if (!initialized) | |
PyThread_init_thread(); | |
success = lwp_create(&tid, func, MINPRIO, 0, lwp_newstk(), 1, arg); | |
return success < 0 ? -1 : 0; | |
} | |
long PyThread_get_thread_ident(void) | |
{ | |
thread_t tid; | |
if (!initialized) | |
PyThread_init_thread(); | |
if (lwp_self(&tid) < 0) | |
return -1; | |
return tid.thread_id; | |
} | |
void PyThread_exit_thread(void) | |
{ | |
dprintf(("PyThread_exit_thread called\n")); | |
if (!initialized) | |
exit(0); | |
lwp_destroy(SELF); | |
} | |
/* | |
* Lock support. | |
*/ | |
PyThread_type_lock PyThread_allocate_lock(void) | |
{ | |
struct lock *lock; | |
extern char *malloc(size_t); | |
dprintf(("PyThread_allocate_lock called\n")); | |
if (!initialized) | |
PyThread_init_thread(); | |
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); | |
dprintf(("PyThread_allocate_lock() -> %p\n", lock)); | |
return (PyThread_type_lock) lock; | |
} | |
void PyThread_free_lock(PyThread_type_lock lock) | |
{ | |
dprintf(("PyThread_free_lock(%p) called\n", lock)); | |
mon_destroy(((struct lock *) lock)->lock_monitor); | |
free((char *) lock); | |
} | |
int PyThread_acquire_lock(PyThread_type_lock lock, int waitflag) | |
{ | |
int success; | |
dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag)); | |
success = 0; | |
(void) mon_enter(((struct lock *) lock)->lock_monitor); | |
if (waitflag) | |
while (((struct lock *) lock)->lock_locked) | |
cv_wait(((struct lock *) lock)->lock_condvar); | |
if (!((struct lock *) lock)->lock_locked) { | |
success = 1; | |
((struct lock *) lock)->lock_locked = 1; | |
} | |
cv_broadcast(((struct lock *) lock)->lock_condvar); | |
mon_exit(((struct lock *) lock)->lock_monitor); | |
dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success)); | |
return success; | |
} | |
void PyThread_release_lock(PyThread_type_lock lock) | |
{ | |
dprintf(("PyThread_release_lock(%p) called\n", lock)); | |
(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); | |
} |