[Python-checkins] CVS: python/dist/src/Python thread_os2.h,2.11,2.12
Tim Peters
tim_one@users.sourceforge.net
Tue, 30 Oct 2001 19:50:47 -0800
Update of /cvsroot/python/python/dist/src/Python
In directory usw-pr-cvs1:/tmp/cvs-serv25639/python/Python
Modified Files:
thread_os2.h
Log Message:
SF patch #474500: Make OS/2 locks work like posix locks, from Michael
Muller.
Index: thread_os2.h
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/thread_os2.h,v
retrieving revision 2.11
retrieving revision 2.12
diff -C2 -d -r2.11 -r2.12
*** thread_os2.h 2001/10/16 21:13:49 2.11
--- thread_os2.h 2001/10/31 03:50:45 2.12
***************
*** 102,114 ****
/*
! * Lock support. It has too be implemented as semaphores.
! * I [Dag] tried to implement it with mutex but I could find a way to
! * tell whether a thread already own the lock or not.
*/
PyThread_type_lock
PyThread_allocate_lock(void)
{
- HMTX aLock;
APIRET rc;
dprintf(("PyThread_allocate_lock called\n"));
--- 102,120 ----
/*
! * Lock support. This is implemented with an event semaphore and critical
! * sections to make it behave more like a posix mutex than its OS/2
! # counterparts.
*/
+
+ typedef struct os2_lock_t {
+ int is_set;
+ HEV changed;
+ } *type_os2_lock;
+
PyThread_type_lock
PyThread_allocate_lock(void)
{
APIRET rc;
+ type_os2_lock lock = (type_os2_lock)malloc(sizeof(struct os2_lock_t));
dprintf(("PyThread_allocate_lock called\n"));
***************
*** 116,127 ****
PyThread_init_thread();
! DosCreateMutexSem(NULL, /* Sem name */
! &aLock, /* the semaphore */
! 0, /* shared ? */
! 0); /* initial state */
! dprintf(("%ld: PyThread_allocate_lock() -> %p\n", PyThread_get_thread_ident(), aLock));
! return (PyThread_type_lock) aLock;
}
--- 122,134 ----
PyThread_init_thread();
! lock->is_set = 0;
! DosCreateEventSem(NULL, &lock->changed, 0, 0);
! dprintf(("%ld: PyThread_allocate_lock() -> %p\n",
! PyThread_get_thread_ident(),
! lock->changed));
!
! return (PyThread_type_lock) lock;
}
***************
*** 129,135 ****
PyThread_free_lock(PyThread_type_lock aLock)
{
dprintf(("%ld: PyThread_free_lock(%p) called\n", PyThread_get_thread_ident(),aLock));
! DosCloseMutexSem((HMTX)aLock);
}
--- 136,144 ----
PyThread_free_lock(PyThread_type_lock aLock)
{
+ type_os2_lock lock = (type_os2_lock)aLock;
dprintf(("%ld: PyThread_free_lock(%p) called\n", PyThread_get_thread_ident(),aLock));
! DosCloseEventSem(lock->changed);
! free(aLock);
}
***************
*** 137,181 ****
* Return 1 on success if the lock was acquired
*
! * and 0 if the lock was not acquired. This means a 0 is returned
! * if the lock has already been acquired by this thread!
*/
int
PyThread_acquire_lock(PyThread_type_lock aLock, int waitflag)
{
! int success = 1;
! ULONG rc, count;
PID pid = 0;
TID tid = 0;
dprintf(("%ld: PyThread_acquire_lock(%p, %d) called\n", PyThread_get_thread_ident(),
aLock, waitflag));
! DosQueryMutexSem((HMTX)aLock,&pid,&tid,&count);
! if( tid == PyThread_get_thread_ident() ) { /* if we own this lock */
! success = 0;
! } else {
! rc = DosRequestMutexSem((HMTX) aLock,
! (waitflag == 1 ? SEM_INDEFINITE_WAIT : 0));
! if( rc != 0) {
! success = 0; /* We failed */
}
- }
! dprintf(("%ld: PyThread_acquire_lock(%p, %d) -> %d\n",
! PyThread_get_thread_ident(),aLock, waitflag, success));
! return success;
}
! void
! PyThread_release_lock(PyThread_type_lock aLock)
{
dprintf(("%ld: PyThread_release_lock(%p) called\n", PyThread_get_thread_ident(),aLock));
! if ( DosReleaseMutexSem( (HMTX) aLock ) != 0 ) {
dprintf(("%ld: Could not PyThread_release_lock(%p) error: %l\n",
PyThread_get_thread_ident(), aLock, GetLastError()));
}
}
--- 146,212 ----
* Return 1 on success if the lock was acquired
*
! * and 0 if the lock was not acquired.
*/
int
PyThread_acquire_lock(PyThread_type_lock aLock, int waitflag)
{
! int done = 0;
! ULONG count;
PID pid = 0;
TID tid = 0;
+ type_os2_lock lock = (type_os2_lock)aLock;
dprintf(("%ld: PyThread_acquire_lock(%p, %d) called\n", PyThread_get_thread_ident(),
aLock, waitflag));
! while (!done) {
! /* if the lock is currently set, we have to wait for the state to change */
! if (lock->is_set) {
! if (!waitflag)
! return 0;
! DosWaitEventSem(lock->changed, SEM_INDEFINITE_WAIT);
! }
! /*
! * enter a critical section and try to get the semaphore. If
! * it is still locked, we will try again.
! */
! if (DosEnterCritSec())
! return 0;
!
! if (!lock->is_set) {
! lock->is_set = 1;
! DosResetEventSem(lock->changed, &count);
! done = 1;
}
! DosExitCritSec();
! }
! return 1;
}
! void PyThread_release_lock(PyThread_type_lock aLock)
{
+ type_os2_lock lock = (type_os2_lock)aLock;
dprintf(("%ld: PyThread_release_lock(%p) called\n", PyThread_get_thread_ident(),aLock));
! if (!lock->is_set) {
! dprintf(("%ld: Could not PyThread_release_lock(%p) error: %l\n",
! PyThread_get_thread_ident(), aLock, GetLastError()));
! return;
! }
!
!
! if (DosEnterCritSec()) {
dprintf(("%ld: Could not PyThread_release_lock(%p) error: %l\n",
PyThread_get_thread_ident(), aLock, GetLastError()));
+ return;
}
+
+ lock->is_set = 0;
+ DosPostEventSem(lock->changed);
+
+ DosExitCritSec();
}