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 */
12static void PyThread__init_thread(void)
13{
14}
15
16/*
17 * Thread support.
18 */
19struct func_arg {
20    void (*func)(void *);
21    void *arg;
22};
23
24static void *
25new_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
38long
39PyThread_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
59long
60PyThread_get_thread_ident(void)
61{
62    if (!initialized)
63        PyThread_init_thread();
64    return thr_self();
65}
66
67void
68PyThread_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 */
79PyThread_type_lock
80PyThread_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
98void
99PyThread_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
106int
107PyThread_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
124void
125PyThread_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