Issue #5812: The two-argument form of the Fraction constructor
[python.git] / Python / thread_lwp.h
blobe93d65aa30dc680a5c45e6c457394adf0ecc61e8
2 #include <stdlib.h>
3 #include <lwp/lwp.h>
4 #include <lwp/stackdep.h>
6 #define STACKSIZE 1000 /* stacksize for a thread */
7 #define NSTACKS 2 /* # stacks to be put in cache initially */
9 struct lock {
10 int lock_locked;
11 cv_t lock_condvar;
12 mon_t lock_monitor;
17 * Initialization.
19 static void PyThread__init_thread(void)
21 lwp_setstkcache(STACKSIZE, NSTACKS);
25 * Thread support.
29 long PyThread_start_new_thread(void (*func)(void *), void *arg)
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;
40 long PyThread_get_thread_ident(void)
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;
50 static void do_PyThread_exit_thread(int no_cleanup)
52 dprintf(("PyThread_exit_thread called\n"));
53 if (!initialized)
54 if (no_cleanup)
55 _exit(0);
56 else
57 exit(0);
58 lwp_destroy(SELF);
61 void PyThread_exit_thread(void)
63 do_PyThread_exit_thread(0);
66 void PyThread__exit_thread(void)
68 do_PyThread_exit_thread(1);
71 #ifndef NO_EXIT_PROG
72 static void do_PyThread_exit_prog(int status, int no_cleanup)
74 dprintf(("PyThread_exit_prog(%d) called\n", status));
75 if (!initialized)
76 if (no_cleanup)
77 _exit(status);
78 else
79 exit(status);
80 pod_exit(status);
83 void PyThread_exit_prog(int status)
85 do_PyThread_exit_prog(status, 0);
88 void PyThread__exit_prog(int status)
90 do_PyThread_exit_prog(status, 1);
92 #endif /* NO_EXIT_PROG */
95 * Lock support.
97 PyThread_type_lock PyThread_allocate_lock(void)
99 struct lock *lock;
100 extern char *malloc(size_t);
102 dprintf(("PyThread_allocate_lock called\n"));
103 if (!initialized)
104 PyThread_init_thread();
106 lock = (struct lock *) malloc(sizeof(struct lock));
107 lock->lock_locked = 0;
108 (void) mon_create(&lock->lock_monitor);
109 (void) cv_create(&lock->lock_condvar, lock->lock_monitor);
110 dprintf(("PyThread_allocate_lock() -> %p\n", lock));
111 return (PyThread_type_lock) lock;
114 void PyThread_free_lock(PyThread_type_lock lock)
116 dprintf(("PyThread_free_lock(%p) called\n", lock));
117 mon_destroy(((struct lock *) lock)->lock_monitor);
118 free((char *) lock);
121 int PyThread_acquire_lock(PyThread_type_lock lock, int waitflag)
123 int success;
125 dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag));
126 success = 0;
128 (void) mon_enter(((struct lock *) lock)->lock_monitor);
129 if (waitflag)
130 while (((struct lock *) lock)->lock_locked)
131 cv_wait(((struct lock *) lock)->lock_condvar);
132 if (!((struct lock *) lock)->lock_locked) {
133 success = 1;
134 ((struct lock *) lock)->lock_locked = 1;
136 cv_broadcast(((struct lock *) lock)->lock_condvar);
137 mon_exit(((struct lock *) lock)->lock_monitor);
138 dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success));
139 return success;
142 void PyThread_release_lock(PyThread_type_lock lock)
144 dprintf(("PyThread_release_lock(%p) called\n", lock));
145 (void) mon_enter(((struct lock *) lock)->lock_monitor);
146 ((struct lock *) lock)->lock_locked = 0;
147 cv_broadcast(((struct lock *) lock)->lock_condvar);
148 mon_exit(((struct lock *) lock)->lock_monitor);