blob: 2371aaec25ffb3c8b40089b337280dfa3efef29c [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
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007Copyright (c) 2000, BeOpen.com.
8Copyright (c) 1995-2000, Corporation for National Research Initiatives.
9Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
10All rights reserved.
Guido van Rossumd266eb41996-10-25 14:44:06 +000011
Guido van Rossumfd71b9e2000-06-30 23:50:40 +000012See the file "Misc/COPYRIGHT" for information on usage and
13redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossum62332931995-04-10 11:36:14 +000014
Guido van Rossumd266eb41996-10-25 14:44:06 +000015******************************************************************/
Guido van Rossum62332931995-04-10 11:36:14 +000016
17/* This code implemented by cvale@netcom.com */
18
19#define INCL_DOSPROCESS
20#define INCL_DOSSEMAPHORES
21#include "os2.h"
22#include "limits.h"
23
24#include "process.h"
25
Guido van Rossum65d5b571998-12-21 19:32:43 +000026long PyThread_get_thread_ident(void);
Guido van Rossum62332931995-04-10 11:36:14 +000027
28
29/*
30 * Initialization of the C package, should not be needed.
31 */
Guido van Rossum65d5b571998-12-21 19:32:43 +000032static void PyThread__init_thread(void)
Guido van Rossum62332931995-04-10 11:36:14 +000033{
34}
35
36/*
37 * Thread support.
38 */
Guido van Rossum65d5b571998-12-21 19:32:43 +000039int PyThread_start_new_thread(void (*func)(void *), void *arg)
Guido van Rossum62332931995-04-10 11:36:14 +000040{
41 int aThread;
42 int success = 1;
43
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000044 aThread = _beginthread(func,NULL,65536,arg);
Guido van Rossum62332931995-04-10 11:36:14 +000045
46 if( aThread == -1 ) {
47 success = 0;
48 fprintf(stderr,"aThread failed == %d",aThread);
49 dprintf(("_beginthread failed. return %ld\n", errno));
50 }
51
52 return success;
53}
54
Guido van Rossum65d5b571998-12-21 19:32:43 +000055long PyThread_get_thread_ident(void)
Guido van Rossum62332931995-04-10 11:36:14 +000056{
57 PPIB pib;
58 PTIB tib;
59
60 if (!initialized)
Guido van Rossum65d5b571998-12-21 19:32:43 +000061 PyThread_init_thread();
Guido van Rossum62332931995-04-10 11:36:14 +000062
63 DosGetInfoBlocks(&tib,&pib);
64 return tib->tib_ptib2->tib2_ultid;
65}
66
Guido van Rossum65d5b571998-12-21 19:32:43 +000067static void do_PyThread_exit_thread(int no_cleanup)
Guido van Rossum62332931995-04-10 11:36:14 +000068{
Guido van Rossum65d5b571998-12-21 19:32:43 +000069 dprintf(("%ld: PyThread_exit_thread called\n", PyThread_get_thread_ident()));
Guido van Rossum62332931995-04-10 11:36:14 +000070 if (!initialized)
71 if (no_cleanup)
72 _exit(0);
73 else
74 exit(0);
75 _endthread();
76}
77
Guido van Rossum65d5b571998-12-21 19:32:43 +000078void PyThread_exit_thread(void)
Guido van Rossum62332931995-04-10 11:36:14 +000079{
Guido van Rossum65d5b571998-12-21 19:32:43 +000080 do_PyThread_exit_thread(0);
Guido van Rossum62332931995-04-10 11:36:14 +000081}
82
Guido van Rossum65d5b571998-12-21 19:32:43 +000083void PyThread__exit_thread(void)
Guido van Rossum62332931995-04-10 11:36:14 +000084{
Guido van Rossum65d5b571998-12-21 19:32:43 +000085 do_PyThread_exit_thread(1);
Guido van Rossum62332931995-04-10 11:36:14 +000086}
87
88#ifndef NO_EXIT_PROG
Guido van Rossum65d5b571998-12-21 19:32:43 +000089static void do_PyThread_exit_prog(int status, int no_cleanup)
Guido van Rossum62332931995-04-10 11:36:14 +000090{
Guido van Rossum65d5b571998-12-21 19:32:43 +000091 dprintf(("PyThread_exit_prog(%d) called\n", status));
Guido van Rossum62332931995-04-10 11:36:14 +000092 if (!initialized)
93 if (no_cleanup)
94 _exit(status);
95 else
96 exit(status);
97}
98
Guido van Rossum65d5b571998-12-21 19:32:43 +000099void PyThread_exit_prog(int status)
Guido van Rossum62332931995-04-10 11:36:14 +0000100{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000101 do_PyThread_exit_prog(status, 0);
Guido van Rossum62332931995-04-10 11:36:14 +0000102}
103
Guido van Rossum65d5b571998-12-21 19:32:43 +0000104void PyThread__exit_prog _P1(int status)
Guido van Rossum62332931995-04-10 11:36:14 +0000105{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000106 do_PyThread_exit_prog(status, 1);
Guido van Rossum62332931995-04-10 11:36:14 +0000107}
108#endif /* NO_EXIT_PROG */
109
110/*
111 * Lock support. It has too be implemented as semaphores.
112 * I [Dag] tried to implement it with mutex but I could find a way to
113 * tell whether a thread already own the lock or not.
114 */
Guido van Rossum65d5b571998-12-21 19:32:43 +0000115PyThread_type_lock PyThread_allocate_lock(void)
Guido van Rossum62332931995-04-10 11:36:14 +0000116{
117 HMTX aLock;
118 APIRET rc;
119
Guido van Rossum65d5b571998-12-21 19:32:43 +0000120 dprintf(("PyThread_allocate_lock called\n"));
Guido van Rossum62332931995-04-10 11:36:14 +0000121 if (!initialized)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000122 PyThread_init_thread();
Guido van Rossum62332931995-04-10 11:36:14 +0000123
124 DosCreateMutexSem(NULL, /* Sem name */
125 &aLock, /* the semaphone */
126 0, /* shared ? */
127 0); /* initial state */
128
Fred Drakea44d3532000-06-30 15:01:00 +0000129 dprintf(("%ld: PyThread_allocate_lock() -> %p\n", PyThread_get_thread_ident(), aLock));
Guido van Rossum62332931995-04-10 11:36:14 +0000130
Guido van Rossum65d5b571998-12-21 19:32:43 +0000131 return (PyThread_type_lock) aLock;
Guido van Rossum62332931995-04-10 11:36:14 +0000132}
133
Guido van Rossum65d5b571998-12-21 19:32:43 +0000134void PyThread_free_lock(PyThread_type_lock aLock)
Guido van Rossum62332931995-04-10 11:36:14 +0000135{
Fred Drakea44d3532000-06-30 15:01:00 +0000136 dprintf(("%ld: PyThread_free_lock(%p) called\n", PyThread_get_thread_ident(),aLock));
Guido van Rossum62332931995-04-10 11:36:14 +0000137
138 DosCloseMutexSem((HMTX)aLock);
139}
140
141/*
142 * Return 1 on success if the lock was acquired
143 *
144 * and 0 if the lock was not acquired. This means a 0 is returned
145 * if the lock has already been acquired by this thread!
146 */
Guido van Rossum65d5b571998-12-21 19:32:43 +0000147int PyThread_acquire_lock(PyThread_type_lock aLock, int waitflag)
Guido van Rossum62332931995-04-10 11:36:14 +0000148{
149 int success = 1;
150 ULONG rc, count;
151 PID pid = 0;
152 TID tid = 0;
153
Fred Drakea44d3532000-06-30 15:01:00 +0000154 dprintf(("%ld: PyThread_acquire_lock(%p, %d) called\n", PyThread_get_thread_ident(),
155 aLock, waitflag));
Guido van Rossum62332931995-04-10 11:36:14 +0000156
157 DosQueryMutexSem((HMTX)aLock,&pid,&tid,&count);
Guido van Rossum65d5b571998-12-21 19:32:43 +0000158 if( tid == PyThread_get_thread_ident() ) { /* if we own this lock */
Guido van Rossum62332931995-04-10 11:36:14 +0000159 success = 0;
160 } else {
161 rc = DosRequestMutexSem((HMTX) aLock,
162 (waitflag == 1 ? SEM_INDEFINITE_WAIT : 0));
163
164 if( rc != 0) {
165 success = 0; /* We failed */
166 }
167 }
168
Fred Drakea44d3532000-06-30 15:01:00 +0000169 dprintf(("%ld: PyThread_acquire_lock(%p, %d) -> %d\n",
170 PyThread_get_thread_ident(),aLock, waitflag, success));
Guido van Rossum62332931995-04-10 11:36:14 +0000171
172 return success;
173}
174
Guido van Rossum65d5b571998-12-21 19:32:43 +0000175void PyThread_release_lock(PyThread_type_lock aLock)
Guido van Rossum62332931995-04-10 11:36:14 +0000176{
Fred Drakea44d3532000-06-30 15:01:00 +0000177 dprintf(("%ld: PyThread_release_lock(%p) called\n", PyThread_get_thread_ident(),aLock));
Guido van Rossum62332931995-04-10 11:36:14 +0000178
179 if ( DosReleaseMutexSem( (HMTX) aLock ) != 0 ) {
Fred Drakea44d3532000-06-30 15:01:00 +0000180 dprintf(("%ld: Could not PyThread_release_lock(%p) error: %l\n",
181 PyThread_get_thread_ident(), aLock, GetLastError()));
Guido van Rossum62332931995-04-10 11:36:14 +0000182 }
183}
184
185/*
186 * Semaphore support.
187 */
Guido van Rossum65d5b571998-12-21 19:32:43 +0000188PyThread_type_sema PyThread_allocate_sema(int value)
Guido van Rossum62332931995-04-10 11:36:14 +0000189{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000190 return (PyThread_type_sema) 0;
Guido van Rossum62332931995-04-10 11:36:14 +0000191}
192
Guido van Rossum65d5b571998-12-21 19:32:43 +0000193void PyThread_free_sema(PyThread_type_sema aSemaphore)
Guido van Rossum62332931995-04-10 11:36:14 +0000194{
195
196}
197
Guido van Rossum65d5b571998-12-21 19:32:43 +0000198int PyThread_down_sema(PyThread_type_sema aSemaphore, int waitflag)
Guido van Rossum62332931995-04-10 11:36:14 +0000199{
Guido van Rossumcf1474b1996-10-08 14:17:53 +0000200 return -1;
Guido van Rossum62332931995-04-10 11:36:14 +0000201}
202
Guido van Rossum65d5b571998-12-21 19:32:43 +0000203void PyThread_up_sema(PyThread_type_sema aSemaphore)
Guido van Rossum62332931995-04-10 11:36:14 +0000204{
Fred Drakea44d3532000-06-30 15:01:00 +0000205 dprintf(("%ld: PyThread_up_sema(%p)\n", PyThread_get_thread_ident(), aSemaphore));
Guido van Rossum62332931995-04-10 11:36:14 +0000206}