1 
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <errno.h>
5 #include </usr/include/thread.h>
6 #undef _POSIX_THREADS
7 
8 
9 /*
10  * Initialization.
11  */
PyThread__init_thread(void)12 static void PyThread__init_thread(void)
13 {
14 }
15 
16 /*
17  * Thread support.
18  */
19 struct func_arg {
20     void (*func)(void *);
21     void *arg;
22 };
23 
24 static void *
new_func(void * funcarg)25 new_func(void *funcarg)
26 {
27     void (*func)(void *);
28     void *arg;
29 
30     func = ((struct func_arg *) funcarg)->func;
31     arg = ((struct func_arg *) funcarg)->arg;
32     free(funcarg);
33     (*func)(arg);
34     return 0;
35 }
36 
37 
38 long
PyThread_start_new_thread(void (* func)(void *),void * arg)39 PyThread_start_new_thread(void (*func)(void *), void *arg)
40 {
41     thread_t tid;
42     struct func_arg *funcarg;
43 
44     dprintf(("PyThread_start_new_thread called\n"));
45     if (!initialized)
46         PyThread_init_thread();
47     funcarg = (struct func_arg *) malloc(sizeof(struct func_arg));
48     funcarg->func = func;
49     funcarg->arg = arg;
50     if (thr_create(0, 0, new_func, funcarg,
51                    THR_DETACHED | THR_NEW_LWP, &tid)) {
52         perror("thr_create");
53         free((void *) funcarg);
54         return -1;
55     }
56     return tid;
57 }
58 
59 long
PyThread_get_thread_ident(void)60 PyThread_get_thread_ident(void)
61 {
62     if (!initialized)
63         PyThread_init_thread();
64     return thr_self();
65 }
66 
67 void
PyThread_exit_thread(void)68 PyThread_exit_thread(void)
69 {
70     dprintf(("PyThread_exit_thread called\n"));
71     if (!initialized)
72         exit(0);
73     thr_exit(0);
74 }
75 
76 /*
77  * Lock support.
78  */
79 PyThread_type_lock
PyThread_allocate_lock(void)80 PyThread_allocate_lock(void)
81 {
82     mutex_t *lock;
83 
84     dprintf(("PyThread_allocate_lock called\n"));
85     if (!initialized)
86         PyThread_init_thread();
87 
88     lock = (mutex_t *) malloc(sizeof(mutex_t));
89     if (mutex_init(lock, USYNC_THREAD, 0)) {
90         perror("mutex_init");
91         free((void *) lock);
92         lock = 0;
93     }
94     dprintf(("PyThread_allocate_lock() -> %p\n", lock));
95     return (PyThread_type_lock) lock;
96 }
97 
98 void
PyThread_free_lock(PyThread_type_lock lock)99 PyThread_free_lock(PyThread_type_lock lock)
100 {
101     dprintf(("PyThread_free_lock(%p) called\n", lock));
102     mutex_destroy((mutex_t *) lock);
103     free((void *) lock);
104 }
105 
106 int
PyThread_acquire_lock(PyThread_type_lock lock,int waitflag)107 PyThread_acquire_lock(PyThread_type_lock lock, int waitflag)
108 {
109     int success;
110 
111     dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag));
112     if (waitflag)
113         success = mutex_lock((mutex_t *) lock);
114     else
115         success = mutex_trylock((mutex_t *) lock);
116     if (success < 0)
117         perror(waitflag ? "mutex_lock" : "mutex_trylock");
118     else
119         success = !success; /* solaris does it the other way round */
120     dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success));
121     return success;
122 }
123 
124 void
PyThread_release_lock(PyThread_type_lock lock)125 PyThread_release_lock(PyThread_type_lock lock)
126 {
127     dprintf(("PyThread_release_lock(%p) called\n", lock));
128     if (mutex_unlock((mutex_t *) lock))
129         perror("mutex_unlock");
130 }
131