diff options
author | rpj <rpj> | 1999-01-18 23:50:07 +0000 |
---|---|---|
committer | rpj <rpj> | 1999-01-18 23:50:07 +0000 |
commit | 20f77eda55f874b939719ac0abda4405ecd20bf8 (patch) | |
tree | e81393914f1a89d055b2384cc1c612d48c4a2a2c | |
parent | 9b75468a10363ada39a17563cca6bcd819ec8fcd (diff) |
Tue Jan 19 18:27:42 1999 Ross Johnson <rpj@swan.canberra.edu.au>
* pthread.h (pthreadCancelableTimedWait): New prototype.
(pthreadCancelableWait): Remove second argument.
* misc.c (CancelableWait): New static function is
pthreadCancelableWait() renamed.
(pthreadCancelableWait): Now just calls CancelableWait() with
INFINITE timeout.
(pthreadCancelableTimedWait): Just calls CancelableWait()
with passed in timeout.
* private.c (_pthread_sem_timedwait): 'abstime' arg really is
absolute time. Calculate relative time to wait from current
time before passing timeout to new routine
pthreadCancelableTimedWait().
- Scott Lightner <scott@curriculum.com>
-rw-r--r-- | ChangeLog | 18 | ||||
-rw-r--r-- | misc.c | 25 | ||||
-rw-r--r-- | private.c | 25 | ||||
-rw-r--r-- | pthread.h | 8 |
4 files changed, 60 insertions, 16 deletions
@@ -1,3 +1,21 @@ +Tue Jan 19 18:27:42 1999 Ross Johnson <rpj@swan.canberra.edu.au> + + * pthread.h (pthreadCancelableTimedWait): New prototype. + (pthreadCancelableWait): Remove second argument. + + * misc.c (CancelableWait): New static function is + pthreadCancelableWait() renamed. + (pthreadCancelableWait): Now just calls CancelableWait() with + INFINITE timeout. + (pthreadCancelableTimedWait): Just calls CancelableWait() + with passed in timeout. + + * private.c (_pthread_sem_timedwait): 'abstime' arg really is + absolute time. Calculate relative time to wait from current + time before passing timeout to new routine + pthreadCancelableTimedWait(). + - Scott Lightner <scott@curriculum.com> + Sun Jan 17 12:01:26 1999 Ross Johnson <rpj@ixobrychus.canberra.edu.au> * private.c (_pthread_sem_timedwait): Move from semaphore.c. @@ -129,8 +129,8 @@ pthread_equal (pthread_t t1, pthread_t t2) } /* pthread_equal */ -int -pthreadCancelableWait (HANDLE waitHandle, DWORD abstime) +static int +CancelableWait (HANDLE waitHandle, DWORD timeout) /* * ------------------------------------------------------------------- * This provides an extra hook into the pthread_cancel @@ -151,7 +151,6 @@ pthreadCancelableWait (HANDLE waitHandle, DWORD abstime) DWORD nHandles = 1; DWORD status; - handles[0] = waitHandle; if ((self = pthread_getspecific (_pthread_selfThreadKey)) != NULL) @@ -177,7 +176,7 @@ pthreadCancelableWait (HANDLE waitHandle, DWORD abstime) nHandles, handles, FALSE, - abstime); + timeout); if (status == WAIT_FAILED) @@ -185,10 +184,13 @@ pthreadCancelableWait (HANDLE waitHandle, DWORD abstime) result = EINVAL; } - else if (status == WAIT_ABANDONED_0) + else if (status == WAIT_TIMEOUT) { result = ETIMEDOUT; - + } + else if (status == WAIT_ABANDONED_0) + { + result = EINVAL; } else { @@ -243,6 +245,17 @@ pthreadCancelableWait (HANDLE waitHandle, DWORD abstime) } /* pthreadCancelableWait */ +int +pthreadCancelableWait (HANDLE waitHandle) +{ + return (CancelableWait(waitHandle, INFINITE)); +} + +int +pthreadCancelableTimedWait (HANDLE waitHandle, DWORD timeout) +{ + return (CancelableWait(waitHandle, timeout)); +} /* </JEB> */ @@ -443,8 +443,8 @@ _pthread_sem_timedwait (sem_t * sem, const struct timespec * abstime) /* * ------------------------------------------------------ * DOCPUBLIC - * This function waits on a semaphore for at most - * 'abstime'. + * This function waits on a semaphore possibly until + * 'abstime' time. * * PARAMETERS * sem @@ -476,7 +476,10 @@ _pthread_sem_timedwait (sem_t * sem, const struct timespec * abstime) * ------------------------------------------------------ */ { - DWORD msecs; + struct _timeb currSysTime; + const DWORD NANOSEC_PER_MILLISEC = 1000000; + const DWORD MILLISEC_PER_SEC = 1000; + DWORD milliseconds; if (abstime == NULL) { @@ -484,14 +487,22 @@ _pthread_sem_timedwait (sem_t * sem, const struct timespec * abstime) } else { - /* Calculate the number of milliseconds in abstime. */ - msecs = abstime->tv_sec * 1000; - msecs += abstime->tv_nsec / 1000000; + /* + * Calculate timeout as milliseconds from current system time. + */ + + /* get current system time */ + _ftime(&currSysTime); + + /* subtract current system time from abstime */ + milliseconds = (abstime->tv_sec - currSysTime.time) * MILLISEC_PER_SEC; + milliseconds += (abstime->tv_nsec / NANOSEC_PER_MILLISEC) - + currSysTime.millitm; } return ((sem == NULL) ? EINVAL - : pthreadCancelableWait (*sem, msecs) + : pthreadCancelableTimedWait (*sem, milliseconds) ); } /* _pthread_sem_timedwait */ @@ -918,10 +918,12 @@ int pthread_attr_setschedparam (pthread_attr_t *attr, * WaitForMultipleObjects * * on 'waitHandle' and a manually reset WIN32 Event - * used to implement pthread_cancel. The 'abstime' - * argument is simply passed to WaitForMultipleObjects. + * used to implement pthread_cancel. The 'timeout' + * argument to TimedWait is simply passed to + * WaitForMultipleObjects. */ -int pthreadCancelableWait (HANDLE waitHandle, DWORD abstime); +int pthreadCancelableWait (HANDLE waitHandle); +int pthreadCancelableTimedWait (HANDLE waitHandle, DWORD timeout); /* * Thread-Safe C Runtime Library Mappings |