1 2#include <stdlib.h> 3#include <lwp/lwp.h> 4#include <lwp/stackdep.h> 5 6#define STACKSIZE 1000 /* stacksize for a thread */ 7#define NSTACKS 2 /* # stacks to be put in cache initially */ 8 9struct lock { 10 int lock_locked; 11 cv_t lock_condvar; 12 mon_t lock_monitor; 13}; 14 15 16/* 17 * Initialization. 18 */ 19static void PyThread__init_thread(void) 20{ 21 lwp_setstkcache(STACKSIZE, NSTACKS); 22} 23 24/* 25 * Thread support. 26 */ 27 28 29long PyThread_start_new_thread(void (*func)(void *), void *arg) 30{ 31 thread_t tid; 32 int success; 33 dprintf(("PyThread_start_new_thread called\n")); 34 if (!initialized) 35 PyThread_init_thread(); 36 success = lwp_create(&tid, func, MINPRIO, 0, lwp_newstk(), 1, arg); 37 return success < 0 ? -1 : 0; 38} 39 40long PyThread_get_thread_ident(void) 41{ 42 thread_t tid; 43 if (!initialized) 44 PyThread_init_thread(); 45 if (lwp_self(&tid) < 0) 46 return -1; 47 return tid.thread_id; 48} 49 50void PyThread_exit_thread(void) 51{ 52 dprintf(("PyThread_exit_thread called\n")); 53 if (!initialized) 54 exit(0); 55 lwp_destroy(SELF); 56} 57 58/* 59 * Lock support. 60 */ 61PyThread_type_lock PyThread_allocate_lock(void) 62{ 63 struct lock *lock; 64 extern char *malloc(size_t); 65 66 dprintf(("PyThread_allocate_lock called\n")); 67 if (!initialized) 68 PyThread_init_thread(); 69 70 lock = (struct lock *) malloc(sizeof(struct lock)); 71 lock->lock_locked = 0; 72 (void) mon_create(&lock->lock_monitor); 73 (void) cv_create(&lock->lock_condvar, lock->lock_monitor); 74 dprintf(("PyThread_allocate_lock() -> %p\n", lock)); 75 return (PyThread_type_lock) lock; 76} 77 78void PyThread_free_lock(PyThread_type_lock lock) 79{ 80 dprintf(("PyThread_free_lock(%p) called\n", lock)); 81 mon_destroy(((struct lock *) lock)->lock_monitor); 82 free((char *) lock); 83} 84 85int PyThread_acquire_lock(PyThread_type_lock lock, int waitflag) 86{ 87 int success; 88 89 dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag)); 90 success = 0; 91 92 (void) mon_enter(((struct lock *) lock)->lock_monitor); 93 if (waitflag) 94 while (((struct lock *) lock)->lock_locked) 95 cv_wait(((struct lock *) lock)->lock_condvar); 96 if (!((struct lock *) lock)->lock_locked) { 97 success = 1; 98 ((struct lock *) lock)->lock_locked = 1; 99 } 100 cv_broadcast(((struct lock *) lock)->lock_condvar); 101 mon_exit(((struct lock *) lock)->lock_monitor); 102 dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success)); 103 return success; 104} 105 106void PyThread_release_lock(PyThread_type_lock lock) 107{ 108 dprintf(("PyThread_release_lock(%p) called\n", lock)); 109 (void) mon_enter(((struct lock *) lock)->lock_monitor); 110 ((struct lock *) lock)->lock_locked = 0; 111 cv_broadcast(((struct lock *) lock)->lock_condvar); 112 mon_exit(((struct lock *) lock)->lock_monitor); 113} 114