blob: 80b10f767531cc1c06aef6e508159fee468e89ce [file] [log] [blame]
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +00009******************************************************************/
10
Guido van Rossum3ecebf11996-07-30 16:48:31 +000011#include <mach/cthreads.h>
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000012
13
14/*
15 * Initialization.
16 */
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000017static void
18PyThread__init_thread(void)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000019{
20 cthread_init();
21}
22
23/*
24 * Thread support.
25 */
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000026int
27PyThread_start_new_thread(func, void (*func)(void *), void *arg)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000028{
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000029 int success = 0; /* init not needed when SOLARIS_THREADS and */
30 /* C_THREADS implemented properly */
31
Guido van Rossum65d5b571998-12-21 19:32:43 +000032 dprintf(("PyThread_start_new_thread called\n"));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000033 if (!initialized)
Guido van Rossum65d5b571998-12-21 19:32:43 +000034 PyThread_init_thread();
Guido van Rossum3ecebf11996-07-30 16:48:31 +000035 /* looks like solaris detaches the thread to never rejoin
36 * so well do it here
37 */
38 cthread_detach(cthread_fork((cthread_fn_t) func, arg));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000039 return success < 0 ? 0 : 1;
40}
41
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000042long
43PyThread_get_thread_ident(void)
Guido van Rossume944da81994-05-23 12:43:41 +000044{
45 if (!initialized)
Guido van Rossum65d5b571998-12-21 19:32:43 +000046 PyThread_init_thread();
Guido van Rossum3ecebf11996-07-30 16:48:31 +000047 return (long) cthread_self();
Guido van Rossume944da81994-05-23 12:43:41 +000048}
49
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000050static void
51do_PyThread_exit_thread(int no_cleanup)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000052{
Guido van Rossum65d5b571998-12-21 19:32:43 +000053 dprintf(("PyThread_exit_thread called\n"));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000054 if (!initialized)
55 if (no_cleanup)
56 _exit(0);
57 else
58 exit(0);
59 cthread_exit(0);
60}
61
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000062void
63PyThread_exit_thread(void)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000064{
Guido van Rossum65d5b571998-12-21 19:32:43 +000065 do_PyThread_exit_thread(0);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000066}
67
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000068void
69PyThread__exit_thread(void)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000070{
Guido van Rossum65d5b571998-12-21 19:32:43 +000071 do_PyThread_exit_thread(1);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000072}
73
74#ifndef NO_EXIT_PROG
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000075static
76void do_PyThread_exit_prog(int status, int no_cleanup)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000077{
Guido van Rossum65d5b571998-12-21 19:32:43 +000078 dprintf(("PyThread_exit_prog(%d) called\n", status));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000079 if (!initialized)
80 if (no_cleanup)
81 _exit(status);
82 else
83 exit(status);
Guido van Rossum3ecebf11996-07-30 16:48:31 +000084 if (no_cleanup)
85 _exit(status);
86 else
87 exit(status);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000088}
89
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000090void
91PyThread_exit_prog(int status)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000092{
Guido van Rossum65d5b571998-12-21 19:32:43 +000093 do_PyThread_exit_prog(status, 0);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000094}
95
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000096void
97PyThread__exit_prog(int status)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000098{
Guido van Rossum65d5b571998-12-21 19:32:43 +000099 do_PyThread_exit_prog(status, 1);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000100}
101#endif /* NO_EXIT_PROG */
102
103/*
104 * Lock support.
105 */
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000106PyThread_type_lock
107PyThread_allocate_lock(void)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000108{
Guido van Rossum3ecebf11996-07-30 16:48:31 +0000109 mutex_t lock;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000110
Guido van Rossum65d5b571998-12-21 19:32:43 +0000111 dprintf(("PyThread_allocate_lock called\n"));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000112 if (!initialized)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000113 PyThread_init_thread();
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000114
Guido van Rossum3ecebf11996-07-30 16:48:31 +0000115 lock = mutex_alloc();
116 if (mutex_init(lock)) {
117 perror("mutex_init");
118 free((void *) lock);
119 lock = 0;
120 }
Fred Drakea44d3532000-06-30 15:01:00 +0000121 dprintf(("PyThread_allocate_lock() -> %p\n", lock));
Guido van Rossum65d5b571998-12-21 19:32:43 +0000122 return (PyThread_type_lock) lock;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000123}
124
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000125void
126PyThread_free_lock(PyThread_type_lock lock)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000127{
Fred Drakea44d3532000-06-30 15:01:00 +0000128 dprintf(("PyThread_free_lock(%p) called\n", lock));
Guido van Rossum3ecebf11996-07-30 16:48:31 +0000129 mutex_free(lock);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000130}
131
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000132int
133PyThread_acquire_lock(PyThread_type_lock lock, int waitflag)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000134{
Guido van Rossum3ecebf11996-07-30 16:48:31 +0000135 int success = FALSE;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000136
Fred Drakea44d3532000-06-30 15:01:00 +0000137 dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag));
Guido van Rossum3ecebf11996-07-30 16:48:31 +0000138 if (waitflag) { /* blocking */
139 mutex_lock(lock);
140 success = TRUE;
141 } else { /* non blocking */
142 success = mutex_try_lock(lock);
143 }
Fred Drakea44d3532000-06-30 15:01:00 +0000144 dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000145 return success;
146}
147
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000148void
149PyThread_release_lock(PyThread_type_lock lock)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000150{
Fred Drakea44d3532000-06-30 15:01:00 +0000151 dprintf(("PyThread_release_lock(%p) called\n", lock));
Guido van Rossum3ecebf11996-07-30 16:48:31 +0000152 mutex_unlock((mutex_t )lock);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000153}
154
155/*
156 * Semaphore support.
Guido van Rossum3ecebf11996-07-30 16:48:31 +0000157 *
158 * This implementation is ripped directly from the pthreads implementation.
159 * Which is to say that it is 100% non-functional at this time.
160 *
161 * Assuming the page is still up, documentation can be found at:
162 *
163 * http://www.doc.ic.ac.uk/~mac/manuals/solaris-manual-pages/solaris/usr/man/man2/_lwp_sema_wait.2.html
164 *
165 * Looking at the man page, it seems that one could easily implement a
166 * semaphore using a condition.
167 *
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000168 */
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000169PyThread_type_sema
170PyThread_allocate_sema(int value)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000171{
Guido van Rossum3ecebf11996-07-30 16:48:31 +0000172 char *sema = 0;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000173 dprintf(("PyThread_allocate_sema called\n"));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000174 if (!initialized)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000175 PyThread_init_thread();
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000176
Fred Drakea44d3532000-06-30 15:01:00 +0000177 dprintf(("PyThread_allocate_sema() -> %p\n", sema));
Guido van Rossum65d5b571998-12-21 19:32:43 +0000178 return (PyThread_type_sema) sema;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000179}
180
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000181void
182PyThread_free_sema(PyThread_type_sema sema)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000183{
Fred Drakea44d3532000-06-30 15:01:00 +0000184 dprintf(("PyThread_free_sema(%p) called\n", sema));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000185}
186
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000187int
188PyThread_down_sema(PyThread_type_sema sema, int waitflag)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000189{
Fred Drakea44d3532000-06-30 15:01:00 +0000190 dprintf(("PyThread_down_sema(%p, %d) called\n", sema, waitflag));
191 dprintf(("PyThread_down_sema(%p) return\n", sema));
Guido van Rossumcf1474b1996-10-08 14:17:53 +0000192 return -1;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000193}
194
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000195void
196PyThread_up_sema(PyThread_type_sema sema)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000197{
Fred Drakea44d3532000-06-30 15:01:00 +0000198 dprintf(("PyThread_up_sema(%p)\n", sema));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000199}