blob: 314b4cbe1707ed70c56c1f994e8b07c68d5f5f25 [file] [log] [blame]
Guido van Rossum62332931995-04-10 11:36:14 +00001/***********************************************************
Guido van Rossumd266eb41996-10-25 14:44:06 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
4
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
16
17While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum62332931995-04-10 11:36:14 +000029
Guido van Rossumd266eb41996-10-25 14:44:06 +000030******************************************************************/
Guido van Rossum62332931995-04-10 11:36:14 +000031
32/* This code implemented by cvale@netcom.com */
33
34#define INCL_DOSPROCESS
35#define INCL_DOSSEMAPHORES
36#include "os2.h"
37#include "limits.h"
38
39#include "process.h"
40
41long get_thread_ident(void);
42
43
44/*
45 * Initialization of the C package, should not be needed.
46 */
47static void _init_thread(void)
48{
49}
50
51/*
52 * Thread support.
53 */
54int start_new_thread(void (*func)(void *), void *arg)
55{
56 int aThread;
57 int success = 1;
58
59 aThread = _beginthread(func,4096,arg);
60
61 if( aThread == -1 ) {
62 success = 0;
63 fprintf(stderr,"aThread failed == %d",aThread);
64 dprintf(("_beginthread failed. return %ld\n", errno));
65 }
66
67 return success;
68}
69
70long get_thread_ident(void)
71{
72 PPIB pib;
73 PTIB tib;
74
75 if (!initialized)
76 init_thread();
77
78 DosGetInfoBlocks(&tib,&pib);
79 return tib->tib_ptib2->tib2_ultid;
80}
81
82static void do_exit_thread(int no_cleanup)
83{
84 dprintf(("%ld: exit_thread called\n", get_thread_ident()));
85 if (!initialized)
86 if (no_cleanup)
87 _exit(0);
88 else
89 exit(0);
90 _endthread();
91}
92
93void exit_thread(void)
94{
95 do_exit_thread(0);
96}
97
98void _exit_thread(void)
99{
100 do_exit_thread(1);
101}
102
103#ifndef NO_EXIT_PROG
104static void do_exit_prog(int status, int no_cleanup)
105{
106 dprintf(("exit_prog(%d) called\n", status));
107 if (!initialized)
108 if (no_cleanup)
109 _exit(status);
110 else
111 exit(status);
112}
113
114void exit_prog(int status)
115{
116 do_exit_prog(status, 0);
117}
118
119void _exit_prog _P1(int status)
120{
121 do_exit_prog(status, 1);
122}
123#endif /* NO_EXIT_PROG */
124
125/*
126 * Lock support. It has too be implemented as semaphores.
127 * I [Dag] tried to implement it with mutex but I could find a way to
128 * tell whether a thread already own the lock or not.
129 */
130type_lock allocate_lock(void)
131{
132 HMTX aLock;
133 APIRET rc;
134
135 dprintf(("allocate_lock called\n"));
136 if (!initialized)
137 init_thread();
138
139 DosCreateMutexSem(NULL, /* Sem name */
140 &aLock, /* the semaphone */
141 0, /* shared ? */
142 0); /* initial state */
143
144 dprintf(("%ld: allocate_lock() -> %lx\n", get_thread_ident(), (long)aLock));
145
146 return (type_lock) aLock;
147}
148
149void free_lock(type_lock aLock)
150{
151 dprintf(("%ld: free_lock(%lx) called\n", get_thread_ident(),(long)aLock));
152
153 DosCloseMutexSem((HMTX)aLock);
154}
155
156/*
157 * Return 1 on success if the lock was acquired
158 *
159 * and 0 if the lock was not acquired. This means a 0 is returned
160 * if the lock has already been acquired by this thread!
161 */
162int acquire_lock(type_lock aLock, int waitflag)
163{
164 int success = 1;
165 ULONG rc, count;
166 PID pid = 0;
167 TID tid = 0;
168
169 dprintf(("%ld: acquire_lock(%lx, %d) called\n", get_thread_ident(),
170 (long)aLock, waitflag));
171
172 DosQueryMutexSem((HMTX)aLock,&pid,&tid,&count);
173 if( tid == get_thread_ident() ) { /* if we own this lock */
174 success = 0;
175 } else {
176 rc = DosRequestMutexSem((HMTX) aLock,
177 (waitflag == 1 ? SEM_INDEFINITE_WAIT : 0));
178
179 if( rc != 0) {
180 success = 0; /* We failed */
181 }
182 }
183
184 dprintf(("%ld: acquire_lock(%lx, %d) -> %d\n",
185 get_thread_ident(),(long)aLock, waitflag, success));
186
187 return success;
188}
189
190void release_lock(type_lock aLock)
191{
192 dprintf(("%ld: release_lock(%lx) called\n", get_thread_ident(),(long)aLock));
193
194 if ( DosReleaseMutexSem( (HMTX) aLock ) != 0 ) {
195 dprintf(("%ld: Could not release_lock(%lx) error: %l\n",
196 get_thread_ident(), (long)aLock, GetLastError()));
197 }
198}
199
200/*
201 * Semaphore support.
202 */
203type_sema allocate_sema(int value)
204{
205 return (type_sema) 0;
206}
207
208void free_sema(type_sema aSemaphore)
209{
210
211}
212
Guido van Rossumcf1474b1996-10-08 14:17:53 +0000213void down_sema(type_sema aSemaphore, int waitflag)
Guido van Rossum62332931995-04-10 11:36:14 +0000214{
Guido van Rossumcf1474b1996-10-08 14:17:53 +0000215 return -1;
Guido van Rossum62332931995-04-10 11:36:14 +0000216}
217
218void up_sema(type_sema aSemaphore)
219{
220 dprintf(("%ld: up_sema(%lx)\n", get_thread_ident(), (long)aSemaphore));
221}