blob: 4c958b915e2aa5565bd3fa42bade19f2de53c491 [file] [log] [blame]
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +00001
2#include <stdlib.h>
3#include <stdio.h>
4#include <unistd.h>
Guido van Rossumcf1474b1996-10-08 14:17:53 +00005#include <errno.h>
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +00006#include </usr/include/thread.h>
Guido van Rossum6eea3261996-08-26 14:58:54 +00007#undef _POSIX_THREADS
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +00008
9
10/*
11 * Initialization.
12 */
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000013static void PyThread__init_thread(void)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000014{
15}
16
17/*
18 * Thread support.
19 */
20struct func_arg {
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000021 void (*func)(void *);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000022 void *arg;
23};
24
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000025static void *
26new_func(void *funcarg)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000027{
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000028 void (*func)(void *);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000029 void *arg;
30
31 func = ((struct func_arg *) funcarg)->func;
32 arg = ((struct func_arg *) funcarg)->arg;
33 free(funcarg);
34 (*func)(arg);
35 return 0;
36}
37
38
Guido van Rossum3c288632001-10-16 21:13:49 +000039long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000040PyThread_start_new_thread(void (*func)(void *), void *arg)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000041{
Guido van Rossum3c288632001-10-16 21:13:49 +000042 thread_t tid;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000043 struct func_arg *funcarg;
44 int success = 0; /* init not needed when SOLARIS_THREADS and */
45 /* C_THREADS implemented properly */
46
Guido van Rossum65d5b571998-12-21 19:32:43 +000047 dprintf(("PyThread_start_new_thread called\n"));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000048 if (!initialized)
Guido van Rossum65d5b571998-12-21 19:32:43 +000049 PyThread_init_thread();
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000050 funcarg = (struct func_arg *) malloc(sizeof(struct func_arg));
51 funcarg->func = func;
52 funcarg->arg = arg;
Guido van Rossum495894e1999-04-13 14:32:12 +000053 if (thr_create(0, 0, new_func, funcarg,
Guido van Rossum3c288632001-10-16 21:13:49 +000054 THR_DETACHED | THR_NEW_LWP, &tid)) {
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000055 perror("thr_create");
56 free((void *) funcarg);
57 success = -1;
58 }
Guido van Rossum3c288632001-10-16 21:13:49 +000059 return tid;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000060}
61
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000062long
63PyThread_get_thread_ident(void)
Guido van Rossume944da81994-05-23 12:43:41 +000064{
65 if (!initialized)
Guido van Rossum65d5b571998-12-21 19:32:43 +000066 PyThread_init_thread();
Guido van Rossume944da81994-05-23 12:43:41 +000067 return thr_self();
68}
69
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000070static void
71do_PyThread_exit_thread(int no_cleanup)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000072{
Guido van Rossum65d5b571998-12-21 19:32:43 +000073 dprintf(("PyThread_exit_thread called\n"));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000074 if (!initialized)
75 if (no_cleanup)
76 _exit(0);
77 else
78 exit(0);
79 thr_exit(0);
80}
81
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000082void
83PyThread_exit_thread(void)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000084{
Guido van Rossum65d5b571998-12-21 19:32:43 +000085 do_PyThread_exit_thread(0);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000086}
87
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000088void
89PyThread__exit_thread(void)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000090{
Guido van Rossum65d5b571998-12-21 19:32:43 +000091 do_PyThread_exit_thread(1);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000092}
93
94#ifndef NO_EXIT_PROG
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000095static void
96do_PyThread_exit_prog(int status, int no_cleanup)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000097{
Guido van Rossum65d5b571998-12-21 19:32:43 +000098 dprintf(("PyThread_exit_prog(%d) called\n", status));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000099 if (!initialized)
100 if (no_cleanup)
101 _exit(status);
102 else
103 exit(status);
104 if (no_cleanup)
105 _exit(status);
106 else
107 exit(status);
108}
109
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000110void
111PyThread_exit_prog(int status)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000112{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000113 do_PyThread_exit_prog(status, 0);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000114}
115
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000116void
117PyThread__exit_prog(int status)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000118{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000119 do_PyThread_exit_prog(status, 1);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000120}
121#endif /* NO_EXIT_PROG */
122
123/*
124 * Lock support.
125 */
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000126PyThread_type_lock
127PyThread_allocate_lock(void)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000128{
129 mutex_t *lock;
130
Guido van Rossum65d5b571998-12-21 19:32:43 +0000131 dprintf(("PyThread_allocate_lock called\n"));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000132 if (!initialized)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000133 PyThread_init_thread();
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000134
135 lock = (mutex_t *) malloc(sizeof(mutex_t));
136 if (mutex_init(lock, USYNC_THREAD, 0)) {
137 perror("mutex_init");
138 free((void *) lock);
139 lock = 0;
140 }
Fred Drakea44d3532000-06-30 15:01:00 +0000141 dprintf(("PyThread_allocate_lock() -> %p\n", lock));
Guido van Rossum65d5b571998-12-21 19:32:43 +0000142 return (PyThread_type_lock) lock;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000143}
144
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000145void
146PyThread_free_lock(PyThread_type_lock lock)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000147{
Fred Drakea44d3532000-06-30 15:01:00 +0000148 dprintf(("PyThread_free_lock(%p) called\n", lock));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000149 mutex_destroy((mutex_t *) lock);
150 free((void *) lock);
151}
152
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000153int
154PyThread_acquire_lock(PyThread_type_lock lock, int waitflag)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000155{
156 int success;
157
Fred Drakea44d3532000-06-30 15:01:00 +0000158 dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000159 if (waitflag)
160 success = mutex_lock((mutex_t *) lock);
161 else
162 success = mutex_trylock((mutex_t *) lock);
163 if (success < 0)
164 perror(waitflag ? "mutex_lock" : "mutex_trylock");
165 else
166 success = !success; /* solaris does it the other way round */
Fred Drakea44d3532000-06-30 15:01:00 +0000167 dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000168 return success;
169}
170
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000171void
172PyThread_release_lock(PyThread_type_lock lock)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000173{
Fred Drakea44d3532000-06-30 15:01:00 +0000174 dprintf(("PyThread_release_lock(%p) called\n", lock));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000175 if (mutex_unlock((mutex_t *) lock))
176 perror("mutex_unlock");
177}
178
179/*
180 * Semaphore support.
181 */
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000182PyThread_type_sema
183PyThread_allocate_sema(int value)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000184{
185 sema_t *sema;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000186 dprintf(("PyThread_allocate_sema called\n"));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000187 if (!initialized)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000188 PyThread_init_thread();
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000189
190 sema = (sema_t *) malloc(sizeof(sema_t));
191 if (sema_init(sema, value, USYNC_THREAD, 0)) {
192 perror("sema_init");
193 free((void *) sema);
194 sema = 0;
195 }
Fred Drakea44d3532000-06-30 15:01:00 +0000196 dprintf(("PyThread_allocate_sema() -> %p\n", sema));
Guido van Rossum65d5b571998-12-21 19:32:43 +0000197 return (PyThread_type_sema) sema;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000198}
199
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000200void
201PyThread_free_sema(PyThread_type_sema sema)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000202{
Fred Drakea44d3532000-06-30 15:01:00 +0000203 dprintf(("PyThread_free_sema(%p) called\n", sema));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000204 if (sema_destroy((sema_t *) sema))
205 perror("sema_destroy");
206 free((void *) sema);
207}
208
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000209int
210PyThread_down_sema(PyThread_type_sema sema, int waitflag)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000211{
Guido van Rossumcf1474b1996-10-08 14:17:53 +0000212 int success;
213
Fred Drakea44d3532000-06-30 15:01:00 +0000214 dprintf(("PyThread_down_sema(%p) called\n", sema));
Guido van Rossumcf1474b1996-10-08 14:17:53 +0000215 if (waitflag)
216 success = sema_wait((sema_t *) sema);
217 else
218 success = sema_trywait((sema_t *) sema);
219 if (success < 0) {
220 if (errno == EBUSY)
221 success = 0;
222 else
223 perror("sema_wait");
224 }
225 else
226 success = !success;
Fred Drakea44d3532000-06-30 15:01:00 +0000227 dprintf(("PyThread_down_sema(%p) return %d\n", sema, success));
Guido van Rossumcf1474b1996-10-08 14:17:53 +0000228 return success;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000229}
230
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000231void
232PyThread_up_sema(PyThread_type_sema sema)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000233{
Fred Drakea44d3532000-06-30 15:01:00 +0000234 dprintf(("PyThread_up_sema(%p)\n", sema));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000235 if (sema_post((sema_t *) sema))
236 perror("sema_post");
237}