blob: 1b3e3904cdcc38c23096502e47303a1899875ca5 [file] [log] [blame]
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +00001
Martin v. Löwisa6e97582002-01-01 18:41:33 +00002#ifdef MACH_C_THREADS
Guido van Rossum3ecebf11996-07-30 16:48:31 +00003#include <mach/cthreads.h>
Martin v. Löwisa6e97582002-01-01 18:41:33 +00004#endif
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +00005
Martin v. Löwisa6e97582002-01-01 18:41:33 +00006#ifdef HURD_C_THREADS
7#include <cthreads.h>
8#endif
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +00009
10/*
11 * Initialization.
12 */
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000013static void
14PyThread__init_thread(void)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000015{
Martin v. Löwisa6e97582002-01-01 18:41:33 +000016#ifndef HURD_C_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000017 /* Roland McGrath said this should not be used since this is
18 done while linking to threads */
19 cthread_init();
Martin v. Löwisa6e97582002-01-01 18:41:33 +000020#else
21/* do nothing */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 ;
Martin v. Löwisa6e97582002-01-01 18:41:33 +000023#endif
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000024}
25
26/*
27 * Thread support.
28 */
Guido van Rossum3c288632001-10-16 21:13:49 +000029long
Guido van Rossum128bcf42000-11-13 19:45:45 +000030PyThread_start_new_thread(void (*func)(void *), void *arg)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000031{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000032 int success = 0; /* init not needed when SOLARIS_THREADS and */
33 /* C_THREADS implemented properly */
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000035 dprintf(("PyThread_start_new_thread called\n"));
36 if (!initialized)
37 PyThread_init_thread();
38 /* looks like solaris detaches the thread to never rejoin
39 * so well do it here
40 */
41 cthread_detach(cthread_fork((cthread_fn_t) func, arg));
42 return success < 0 ? -1 : 0;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000043}
44
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000045long
46PyThread_get_thread_ident(void)
Guido van Rossume944da81994-05-23 12:43:41 +000047{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000048 if (!initialized)
49 PyThread_init_thread();
50 return (long) cthread_self();
Guido van Rossume944da81994-05-23 12:43:41 +000051}
52
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000053void
54PyThread_exit_thread(void)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000055{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000056 dprintf(("PyThread_exit_thread called\n"));
57 if (!initialized)
58 exit(0);
59 cthread_exit(0);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000060}
61
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000062/*
63 * Lock support.
64 */
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000065PyThread_type_lock
66PyThread_allocate_lock(void)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000067{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000068 mutex_t lock;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000070 dprintf(("PyThread_allocate_lock called\n"));
71 if (!initialized)
72 PyThread_init_thread();
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000074 lock = mutex_alloc();
75 if (mutex_init(lock)) {
76 perror("mutex_init");
77 free((void *) lock);
78 lock = 0;
79 }
80 dprintf(("PyThread_allocate_lock() -> %p\n", lock));
81 return (PyThread_type_lock) lock;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000082}
83
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000084void
85PyThread_free_lock(PyThread_type_lock lock)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000086{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000087 dprintf(("PyThread_free_lock(%p) called\n", lock));
88 mutex_free(lock);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000089}
90
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000091int
92PyThread_acquire_lock(PyThread_type_lock lock, int waitflag)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000094 int success = FALSE;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000096 dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag));
97 if (waitflag) { /* blocking */
98 mutex_lock((mutex_t)lock);
99 success = TRUE;
100 } else { /* non blocking */
101 success = mutex_try_lock((mutex_t)lock);
102 }
103 dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success));
104 return success;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000105}
106
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000107void
108PyThread_release_lock(PyThread_type_lock lock)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000109{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000110 dprintf(("PyThread_release_lock(%p) called\n", lock));
111 mutex_unlock((mutex_t )lock);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000112}