[Python-checkins] CVS: python/dist/src/Python thread_pthread.h,2.38,2.39

Martin v. L?wis loewis@users.sourceforge.net
Sun, 17 Mar 2002 01:53:53 -0800


Update of /cvsroot/python/python/dist/src/Python
In directory usw-pr-cvs1:/tmp/cvs-serv15131

Modified Files:
	thread_pthread.h 
Log Message:
Patch #525532: Add support for POSIX semaphores.


Index: thread_pthread.h
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/thread_pthread.h,v
retrieving revision 2.38
retrieving revision 2.39
diff -C2 -d -r2.38 -r2.39
*** thread_pthread.h	19 Jan 2002 22:02:55 -0000	2.38
--- thread_pthread.h	17 Mar 2002 09:53:51 -0000	2.39
***************
*** 12,15 ****
--- 12,19 ----
  #endif
  #include <signal.h>
+ #ifdef _POSIX_SEMAPHORES
+ #include <semaphore.h>
+ #include <errno.h>
+ #endif
  
  
***************
*** 77,80 ****
--- 81,94 ----
  
  
+ /* Whether or not to use semaphores directly rather than emulating them with
+  * mutexes and condition variables:
+  */
+ #ifdef _POSIX_SEMAPHORES
+ #  define USE_SEMAPHORES
+ #else
+ #  undef USE_SEMAPHORES
+ #endif
+ 
+ 
  /* On platforms that don't use standard POSIX threads pthread_sigmask()
   * isn't present.  DEC threads uses sigprocmask() instead as do most
***************
*** 295,298 ****
--- 309,415 ----
  #endif /* NO_EXIT_PROG */
  
+ #ifdef USE_SEMAPHORES
+ 
+ /*
+  * Lock support.
+  */
+ 
+ PyThread_type_lock 
+ PyThread_allocate_lock(void)
+ {
+ 	sem_t *lock;
+ 	int status, error = 0;
+ 
+ 	dprintf(("PyThread_allocate_lock called\n"));
+ 	if (!initialized)
+ 		PyThread_init_thread();
+ 
+ 	lock = (sem_t *)malloc(sizeof(sem_t));
+ 
+ 	if (lock) {
+ 		status = sem_init(lock,0,1);
+ 		CHECK_STATUS("sem_init");
+ 
+ 		if (error) {
+ 			free((void *)lock);
+ 			lock = NULL;
+ 		}
+ 	}
+ 
+ 	dprintf(("PyThread_allocate_lock() -> %p\n", lock));
+ 	return (PyThread_type_lock)lock;
+ }
+ 
+ void 
+ PyThread_free_lock(PyThread_type_lock lock)
+ {
+ 	sem_t *thelock = (sem_t *)lock;
+ 	int status, error = 0;
+ 
+ 	dprintf(("PyThread_free_lock(%p) called\n", lock));
+ 
+ 	if (!thelock)
+ 		return;
+ 
+ 	status = sem_destroy(thelock);
+ 	CHECK_STATUS("sem_destroy");
+ 
+ 	free((void *)thelock);
+ }
+ 
+ /*
+  * As of February 2002, Cygwin thread implementations mistakenly report error
+  * codes in the return value of the sem_ calls (like the pthread_ functions).
+  * Correct implementations return -1 and put the code in errno. This supports
+  * either.
+  */
+ static int
+ fix_status(int status)
+ {
+ 	return (status == -1) ? errno : status;
+ }
+ 
+ int 
+ PyThread_acquire_lock(PyThread_type_lock lock, int waitflag)
+ {
+ 	int success;
+ 	sem_t *thelock = (sem_t *)lock;
+ 	int status, error = 0;
+ 
+ 	dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag));
+ 
+ 	do {
+ 		if (waitflag)
+ 			status = fix_status(sem_wait(thelock));
+ 		else
+ 			status = fix_status(sem_trywait(thelock));
+ 	} while (status == EINTR); /* Retry if interrupted by a signal */
+ 
+ 	if (waitflag) {
+ 		CHECK_STATUS("sem_wait");
+ 	} else if (status != EAGAIN) {
+ 		CHECK_STATUS("sem_trywait");
+ 	}
+ 	
+ 	success = (status == 0) ? 1 : 0;
+ 
+ 	dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success));
+ 	return success;
+ }
+ 
+ void 
+ PyThread_release_lock(PyThread_type_lock lock)
+ {
+ 	sem_t *thelock = (sem_t *)lock;
+ 	int status, error = 0;
+ 
+ 	dprintf(("PyThread_release_lock(%p) called\n", lock));
+ 
+ 	status = sem_post(thelock);
+ 	CHECK_STATUS("sem_post");
+ }
+ 
+ #else /* USE_SEMAPHORES */
+ 
  /*
   * Lock support.
***************
*** 406,407 ****
--- 523,526 ----
  	CHECK_STATUS("pthread_cond_signal");
  }
+ 
+ #endif /* USE_SEMAPHORES */