summaryrefslogtreecommitdiff
path: root/semaphore.c
diff options
context:
space:
mode:
authorrpj <rpj>1999-01-14 22:33:54 +0000
committerrpj <rpj>1999-01-14 22:33:54 +0000
commit677bfb0881c56dad767a07b31ac543db284e16c6 (patch)
tree1a25c36c4291cb435b1196ffad2ae80f31829ce7 /semaphore.c
parentd0b36781d64a52a93ffec89d7b89a243793ea835 (diff)
Fri Jan 15 15:41:28 1999 Ross Johnson <rpj@swan.canberra.edu.au>
* pthread.h: Add new 'abstime' arg to pthreadCancelableWait() prototype. * condvar.c (cond_timedwait): New generalised function called by both pthread_cond_wait() and pthread_cond_timedwait(). This is essentially pthread_cond_wait() renamed and modified to add the 'abstime' arg and call the new _pthread_sem_timedwait() instead of sem_wait(). (pthread_cond_wait): Now just calls the internal static function cond_timedwait() with an INFINITE wait. (pthread_cond_timedwait): Now implemented. Calls the internal static function cond_timedwait(). * implement.h (_pthread_sem_timedwait): New internal function prototype. * misc.c (pthreadCancelableWait): Added new 'abstime' argument to allow shorter than INFINITE wait. * semaphore.c (_pthread_sem_timedwait): New function for internal use. This is essentially sem_wait() modified to add the 'abstime' arg and call the modified (see above) pthreadCancelableWait().
Diffstat (limited to 'semaphore.c')
-rw-r--r--semaphore.c61
1 files changed, 60 insertions, 1 deletions
diff --git a/semaphore.c b/semaphore.c
index 8ab326b..fc24b1a 100644
--- a/semaphore.c
+++ b/semaphore.c
@@ -203,7 +203,7 @@ sem_wait (sem_t * sem)
* a signal.
*
* RESULTS
- * 0 successfully destroyed semaphore,
+ * 0 successfully decreased semaphore,
* EINVAL 'sem' is not a valid semaphore,
* ENOSYS semaphores are not supported,
* EINTR the function was interrupted by a signal,
@@ -222,6 +222,65 @@ sem_wait (sem_t * sem)
int
+_pthread_sem_timedwait (sem_t * sem, const struct timespec * abstime)
+ /*
+ * ------------------------------------------------------
+ * DOCPUBLIC
+ * This function waits on a semaphore for at most
+ * 'abstime'.
+ *
+ * PARAMETERS
+ * sem
+ * pointer to an instance of sem_t
+ *
+ * abstime
+ * pointer to an instance of struct timespec
+ *
+ * DESCRIPTION
+ * This function waits on a semaphore. If the
+ * semaphore value is greater than zero, it decreases
+ * its value by one. If the semaphore value is zero, then
+ * the calling thread (or process) is blocked until it can
+ * successfully decrease the value or until interrupted by
+ * a signal.
+ *
+ * If 'abstime' is a NULL pointer then this function will
+ * block until it can successfully decrease the value or
+ * until interrupted by a signal.
+ *
+ * RESULTS
+ * 0 successfully decreased semaphore,
+ * EINVAL 'sem' is not a valid semaphore,
+ * ENOSYS semaphores are not supported,
+ * EINTR the function was interrupted by a signal,
+ * EDEADLK a deadlock condition was detected.
+ * ETIMEDOUT abstime elapsed before success.
+ *
+ * ------------------------------------------------------
+ */
+{
+ DWORD msecs;
+
+ if (abstime == NULL)
+ {
+ msecs = INFINITE;
+ }
+ else
+ {
+ /* Calculate the number of milliseconds in abstime. */
+ msecs = abstime->tv_sec * 1000;
+ msecs += abstime->tv_nsec / 1000000;
+ }
+
+ return ((sem == NULL)
+ ? EINVAL
+ : pthreadCancelableWait (*sem, msecs)
+ );
+
+} /* sem_wait */
+
+
+int
sem_post (sem_t * sem)
/*
* ------------------------------------------------------