You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
3.3 KiB
149 lines
3.3 KiB
|
|
#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; |
|
} |
|
|
|
static void do_PyThread_exit_thread(int no_cleanup) |
|
{ |
|
dprintf(("PyThread_exit_thread called\n")); |
|
if (!initialized) |
|
if (no_cleanup) |
|
_exit(0); |
|
else |
|
exit(0); |
|
lwp_destroy(SELF); |
|
} |
|
|
|
void PyThread_exit_thread(void) |
|
{ |
|
do_PyThread_exit_thread(0); |
|
} |
|
|
|
void PyThread__exit_thread(void) |
|
{ |
|
do_PyThread_exit_thread(1); |
|
} |
|
|
|
#ifndef NO_EXIT_PROG |
|
static void do_PyThread_exit_prog(int status, int no_cleanup) |
|
{ |
|
dprintf(("PyThread_exit_prog(%d) called\n", status)); |
|
if (!initialized) |
|
if (no_cleanup) |
|
_exit(status); |
|
else |
|
exit(status); |
|
pod_exit(status); |
|
} |
|
|
|
void PyThread_exit_prog(int status) |
|
{ |
|
do_PyThread_exit_prog(status, 0); |
|
} |
|
|
|
void PyThread__exit_prog(int status) |
|
{ |
|
do_PyThread_exit_prog(status, 1); |
|
} |
|
#endif /* NO_EXIT_PROG */ |
|
|
|
/* |
|
* 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); |
|
}
|
|
|