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