blob: 776e8e1adb9fffe940d135f9206900eb47364bbf [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 */
Guido van Rossum65d5b571998-12-21 19:32:43 +000017static void PyThread__init_thread _P0()
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000018{
19 cthread_init();
20}
21
22/*
23 * Thread support.
24 */
Guido van Rossum65d5b571998-12-21 19:32:43 +000025int PyThread_start_new_thread _P2(func, void (*func) _P((void *)), arg, void *arg)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000026{
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000027 int success = 0; /* init not needed when SOLARIS_THREADS and */
28 /* C_THREADS implemented properly */
29
Guido van Rossum65d5b571998-12-21 19:32:43 +000030 dprintf(("PyThread_start_new_thread called\n"));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000031 if (!initialized)
Guido van Rossum65d5b571998-12-21 19:32:43 +000032 PyThread_init_thread();
Guido van Rossum3ecebf11996-07-30 16:48:31 +000033 /* looks like solaris detaches the thread to never rejoin
34 * so well do it here
35 */
36 cthread_detach(cthread_fork((cthread_fn_t) func, arg));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000037 return success < 0 ? 0 : 1;
38}
39
Guido van Rossum65d5b571998-12-21 19:32:43 +000040long PyThread_get_thread_ident _P0()
Guido van Rossume944da81994-05-23 12:43:41 +000041{
42 if (!initialized)
Guido van Rossum65d5b571998-12-21 19:32:43 +000043 PyThread_init_thread();
Guido van Rossum3ecebf11996-07-30 16:48:31 +000044 return (long) cthread_self();
Guido van Rossume944da81994-05-23 12:43:41 +000045}
46
Guido van Rossum65d5b571998-12-21 19:32:43 +000047static void do_PyThread_exit_thread _P1(no_cleanup, int no_cleanup)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000048{
Guido van Rossum65d5b571998-12-21 19:32:43 +000049 dprintf(("PyThread_exit_thread called\n"));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000050 if (!initialized)
51 if (no_cleanup)
52 _exit(0);
53 else
54 exit(0);
55 cthread_exit(0);
56}
57
Guido van Rossum65d5b571998-12-21 19:32:43 +000058void PyThread_exit_thread _P0()
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000059{
Guido van Rossum65d5b571998-12-21 19:32:43 +000060 do_PyThread_exit_thread(0);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000061}
62
Guido van Rossum65d5b571998-12-21 19:32:43 +000063void PyThread__exit_thread _P0()
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000064{
Guido van Rossum65d5b571998-12-21 19:32:43 +000065 do_PyThread_exit_thread(1);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000066}
67
68#ifndef NO_EXIT_PROG
Guido van Rossum65d5b571998-12-21 19:32:43 +000069static void do_PyThread_exit_prog _P2(status, int status, no_cleanup, int no_cleanup)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000070{
Guido van Rossum65d5b571998-12-21 19:32:43 +000071 dprintf(("PyThread_exit_prog(%d) called\n", status));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000072 if (!initialized)
73 if (no_cleanup)
74 _exit(status);
75 else
76 exit(status);
Guido van Rossum3ecebf11996-07-30 16:48:31 +000077 if (no_cleanup)
78 _exit(status);
79 else
80 exit(status);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000081}
82
Guido van Rossum65d5b571998-12-21 19:32:43 +000083void PyThread_exit_prog _P1(status, int status)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000084{
Guido van Rossum65d5b571998-12-21 19:32:43 +000085 do_PyThread_exit_prog(status, 0);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000086}
87
Guido van Rossum65d5b571998-12-21 19:32:43 +000088void PyThread__exit_prog _P1(status, int status)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000089{
Guido van Rossum65d5b571998-12-21 19:32:43 +000090 do_PyThread_exit_prog(status, 1);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000091}
92#endif /* NO_EXIT_PROG */
93
94/*
95 * Lock support.
96 */
Guido van Rossum65d5b571998-12-21 19:32:43 +000097PyThread_type_lock PyThread_allocate_lock _P0()
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +000098{
Guido van Rossum3ecebf11996-07-30 16:48:31 +000099 mutex_t lock;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000100
Guido van Rossum65d5b571998-12-21 19:32:43 +0000101 dprintf(("PyThread_allocate_lock called\n"));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000102 if (!initialized)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000103 PyThread_init_thread();
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000104
Guido van Rossum3ecebf11996-07-30 16:48:31 +0000105 lock = mutex_alloc();
106 if (mutex_init(lock)) {
107 perror("mutex_init");
108 free((void *) lock);
109 lock = 0;
110 }
Fred Drakea44d3532000-06-30 15:01:00 +0000111 dprintf(("PyThread_allocate_lock() -> %p\n", lock));
Guido van Rossum65d5b571998-12-21 19:32:43 +0000112 return (PyThread_type_lock) lock;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000113}
114
Guido van Rossum65d5b571998-12-21 19:32:43 +0000115void PyThread_free_lock _P1(lock, PyThread_type_lock lock)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000116{
Fred Drakea44d3532000-06-30 15:01:00 +0000117 dprintf(("PyThread_free_lock(%p) called\n", lock));
Guido van Rossum3ecebf11996-07-30 16:48:31 +0000118 mutex_free(lock);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000119}
120
Guido van Rossum65d5b571998-12-21 19:32:43 +0000121int PyThread_acquire_lock _P2(lock, PyThread_type_lock lock, waitflag, int waitflag)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000122{
Guido van Rossum3ecebf11996-07-30 16:48:31 +0000123 int success = FALSE;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000124
Fred Drakea44d3532000-06-30 15:01:00 +0000125 dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag));
Guido van Rossum3ecebf11996-07-30 16:48:31 +0000126 if (waitflag) { /* blocking */
127 mutex_lock(lock);
128 success = TRUE;
129 } else { /* non blocking */
130 success = mutex_try_lock(lock);
131 }
Fred Drakea44d3532000-06-30 15:01:00 +0000132 dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000133 return success;
134}
135
Guido van Rossum65d5b571998-12-21 19:32:43 +0000136void PyThread_release_lock _P1(lock, PyThread_type_lock lock)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000137{
Fred Drakea44d3532000-06-30 15:01:00 +0000138 dprintf(("PyThread_release_lock(%p) called\n", lock));
Guido van Rossum3ecebf11996-07-30 16:48:31 +0000139 mutex_unlock((mutex_t )lock);
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000140}
141
142/*
143 * Semaphore support.
Guido van Rossum3ecebf11996-07-30 16:48:31 +0000144 *
145 * This implementation is ripped directly from the pthreads implementation.
146 * Which is to say that it is 100% non-functional at this time.
147 *
148 * Assuming the page is still up, documentation can be found at:
149 *
150 * http://www.doc.ic.ac.uk/~mac/manuals/solaris-manual-pages/solaris/usr/man/man2/_lwp_sema_wait.2.html
151 *
152 * Looking at the man page, it seems that one could easily implement a
153 * semaphore using a condition.
154 *
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000155 */
Guido van Rossum65d5b571998-12-21 19:32:43 +0000156PyThread_type_sema PyThread_allocate_sema _P1(value, int value)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000157{
Guido van Rossum3ecebf11996-07-30 16:48:31 +0000158 char *sema = 0;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000159 dprintf(("PyThread_allocate_sema called\n"));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000160 if (!initialized)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000161 PyThread_init_thread();
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000162
Fred Drakea44d3532000-06-30 15:01:00 +0000163 dprintf(("PyThread_allocate_sema() -> %p\n", sema));
Guido van Rossum65d5b571998-12-21 19:32:43 +0000164 return (PyThread_type_sema) sema;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000165}
166
Guido van Rossum65d5b571998-12-21 19:32:43 +0000167void PyThread_free_sema _P1(sema, PyThread_type_sema sema)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000168{
Fred Drakea44d3532000-06-30 15:01:00 +0000169 dprintf(("PyThread_free_sema(%p) called\n", sema));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000170}
171
Guido van Rossum65d5b571998-12-21 19:32:43 +0000172int PyThread_down_sema _P2(sema, PyThread_type_sema sema, waitflag, int waitflag)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000173{
Fred Drakea44d3532000-06-30 15:01:00 +0000174 dprintf(("PyThread_down_sema(%p, %d) called\n", sema, waitflag));
175 dprintf(("PyThread_down_sema(%p) return\n", sema));
Guido van Rossumcf1474b1996-10-08 14:17:53 +0000176 return -1;
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000177}
178
Guido van Rossum65d5b571998-12-21 19:32:43 +0000179void PyThread_up_sema _P1(sema, PyThread_type_sema sema)
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000180{
Fred Drakea44d3532000-06-30 15:01:00 +0000181 dprintf(("PyThread_up_sema(%p)\n", sema));
Guido van Rossum2c8cb9f1994-05-09 15:12:46 +0000182}