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