blob: 59ca0025a70538055299200ce68e5779985f7743 [file] [log] [blame]
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +00001
2#include <stdlib.h>
3#include <stdio.h>
Guido van Rossumcf1474b1996-10-08 14:17:53 +00004#include <errno.h>
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +00005#include </usr/include/thread.h>
Guido van Rossum6eea3261996-08-26 14:58:54 +00006#undef _POSIX_THREADS
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +00007
8
9/*
10 * Initialization.
11 */
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000012static void PyThread__init_thread(void)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000013{
14}
15
16/*
17 * Thread support.
18 */
19struct func_arg {
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000020 void (*func)(void *);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000021 void *arg;
22};
23
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000024static void *
25new_func(void *funcarg)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000026{
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000027 void (*func)(void *);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000028 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
Guido van Rossum3c288632001-10-16 21:13:49 +000038long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000039PyThread_start_new_thread(void (*func)(void *), void *arg)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000040{
Guido van Rossum3c288632001-10-16 21:13:49 +000041 thread_t tid;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000042 struct func_arg *funcarg;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000043
Guido van Rossum65d5b571998-12-21 19:32:43 +000044 dprintf(("PyThread_start_new_thread called\n"));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000045 if (!initialized)
Guido van Rossum65d5b571998-12-21 19:32:43 +000046 PyThread_init_thread();
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000047 funcarg = (struct func_arg *) malloc(sizeof(struct func_arg));
48 funcarg->func = func;
49 funcarg->arg = arg;
Guido van Rossum495894e1999-04-13 14:32:12 +000050 if (thr_create(0, 0, new_func, funcarg,
Guido van Rossum3c288632001-10-16 21:13:49 +000051 THR_DETACHED | THR_NEW_LWP, &tid)) {
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000052 perror("thr_create");
53 free((void *) funcarg);
Martin v. Löwis910ae622003-04-19 07:44:52 +000054 return -1;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000055 }
Guido van Rossum3c288632001-10-16 21:13:49 +000056 return tid;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000057}
58
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000059long
60PyThread_get_thread_ident(void)
Guido van Rossume944da81994-05-23 12:43:41 +000061{
62 if (!initialized)
Guido van Rossum65d5b571998-12-21 19:32:43 +000063 PyThread_init_thread();
Guido van Rossume944da81994-05-23 12:43:41 +000064 return thr_self();
65}
66
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000067void
68PyThread_exit_thread(void)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000069{
Amaury Forgeot d'Arc72aee3d2010-02-24 00:10:48 +000070 dprintf(("PyThread_exit_thread called\n"));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000071 if (!initialized)
Amaury Forgeot d'Arc72aee3d2010-02-24 00:10:48 +000072 exit(0);
73 thr_exit(0);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000074}
75
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000076/*
77 * Lock support.
78 */
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000079PyThread_type_lock
80PyThread_allocate_lock(void)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000081{
82 mutex_t *lock;
83
Guido van Rossum65d5b571998-12-21 19:32:43 +000084 dprintf(("PyThread_allocate_lock called\n"));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000085 if (!initialized)
Guido van Rossum65d5b571998-12-21 19:32:43 +000086 PyThread_init_thread();
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000087
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 }
Fred Drakea44d3532000-06-30 15:01:00 +000094 dprintf(("PyThread_allocate_lock() -> %p\n", lock));
Guido van Rossum65d5b571998-12-21 19:32:43 +000095 return (PyThread_type_lock) lock;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000096}
97
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000098void
99PyThread_free_lock(PyThread_type_lock lock)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000100{
Fred Drakea44d3532000-06-30 15:01:00 +0000101 dprintf(("PyThread_free_lock(%p) called\n", lock));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000102 mutex_destroy((mutex_t *) lock);
103 free((void *) lock);
104}
105
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000106int
107PyThread_acquire_lock(PyThread_type_lock lock, int waitflag)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000108{
109 int success;
110
Fred Drakea44d3532000-06-30 15:01:00 +0000111 dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000112 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 */
Fred Drakea44d3532000-06-30 15:01:00 +0000120 dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000121 return success;
122}
123
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000124void
125PyThread_release_lock(PyThread_type_lock lock)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000126{
Fred Drakea44d3532000-06-30 15:01:00 +0000127 dprintf(("PyThread_release_lock(%p) called\n", lock));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000128 if (mutex_unlock((mutex_t *) lock))
129 perror("mutex_unlock");
130}