diff options
author | Philip Guenthe <guenther@cvs.openbsd.org> | 2012-02-23 04:43:07 +0000 |
---|---|---|
committer | Philip Guenthe <guenther@cvs.openbsd.org> | 2012-02-23 04:43:07 +0000 |
commit | 5888f487d1e36a0b4564a83b469450a3901ce766 (patch) | |
tree | df8cadf19f8555779f3ddf27cd5db3d2bcc32dc6 /lib/librthread | |
parent | 5521952675f06d028f9843535c3c6accf4c10839 (diff) |
Add pthread_condattr_{get,set}clock(), requested by aja@
Add pthread_mutex_timedlock(), requested by dcoppa@
Diffstat (limited to 'lib/librthread')
-rw-r--r-- | lib/librthread/Makefile | 29 | ||||
-rw-r--r-- | lib/librthread/rthread.h | 5 | ||||
-rw-r--r-- | lib/librthread/rthread_condattr.c | 71 | ||||
-rw-r--r-- | lib/librthread/rthread_sync.c | 55 |
4 files changed, 115 insertions, 45 deletions
diff --git a/lib/librthread/Makefile b/lib/librthread/Makefile index 0f9d9811354..40823f7fe5d 100644 --- a/lib/librthread/Makefile +++ b/lib/librthread/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.26 2012/02/19 04:53:37 guenther Exp $ +# $OpenBSD: Makefile,v 1.27 2012/02/23 04:43:06 guenther Exp $ # For ``COMPILER_VERSION'' .include <bsd.own.mk> @@ -18,12 +18,27 @@ CFLAGS+=-I${LIBCSRCDIR}/arch/${MACHINE_CPU} -I${LIBCSRCDIR}/include LDADD = -Wl,-znodelete,-zinitfirst .PATH: ${.CURDIR}/arch/${MACHINE_CPU} -SRCS= rthread.c rthread_attr.c rthread_sched.c rthread_sync.c rthread_tls.c \ - rthread_sig.c rthread_np.c rthread_debug.c rthread_stack.c \ - rthread_libc.c rthread_fork.c rthread_file.c sched_prio.c \ - rthread_cancel.c rthread_mutexattr.c rthread_once.c \ - rthread_rwlock.c rthread_rwlockattr.c rthread_mutex_prio.c \ - rthread_sem.c +SRCS= rthread.c \ + rthread_attr.c \ + rthread_cancel.c \ + rthread_condattr.c \ + rthread_debug.c \ + rthread_file.c \ + rthread_fork.c \ + rthread_libc.c \ + rthread_mutex_prio.c \ + rthread_mutexattr.c \ + rthread_np.c \ + rthread_once.c \ + rthread_rwlock.c \ + rthread_rwlockattr.c \ + rthread_sched.c \ + rthread_sem.c \ + rthread_sig.c \ + rthread_stack.c \ + rthread_sync.c \ + rthread_tls.c \ + sched_prio.c OBJS+= _atomic_lock.o rfork_thread.o cerror.o diff --git a/lib/librthread/rthread.h b/lib/librthread/rthread.h index 570f22dc76e..d08819bd3ce 100644 --- a/lib/librthread/rthread.h +++ b/lib/librthread/rthread.h @@ -1,4 +1,4 @@ -/* $OpenBSD: rthread.h,v 1.34 2012/02/18 22:03:21 guenther Exp $ */ +/* $OpenBSD: rthread.h,v 1.35 2012/02/23 04:43:06 guenther Exp $ */ /* * Copyright (c) 2004,2005 Ted Unangst <tedu@openbsd.org> * All Rights Reserved. @@ -73,10 +73,11 @@ struct pthread_cond { _spinlock_lock_t lock; struct pthread_queue waiters; struct pthread_mutex *mutex; + clockid_t clock; }; struct pthread_cond_attr { - int shared; + clockid_t ca_clock; }; struct pthread_rwlock { diff --git a/lib/librthread/rthread_condattr.c b/lib/librthread/rthread_condattr.c new file mode 100644 index 00000000000..24c8e74089d --- /dev/null +++ b/lib/librthread/rthread_condattr.c @@ -0,0 +1,71 @@ +/* $OpenBSD: rthread_condattr.c,v 1.1 2012/02/23 04:43:06 guenther Exp $ */ +/* + * Copyright (c) 2004,2005 Ted Unangst <tedu@openbsd.org> + * Copyright (c) 2012 Philip Guenther <guenther@openbsd.org> + * All Rights Reserved. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Condition Variable Attributes + */ + +#include <assert.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <errno.h> + +#include <pthread.h> + +#include "rthread.h" + +int +pthread_condattr_init(pthread_condattr_t *attrp) +{ + pthread_condattr_t attr; + + attr = calloc(1, sizeof(*attr)); + if (!attr) + return (errno); + attr->ca_clock = CLOCK_REALTIME; + *attrp = attr; + + return (0); +} + +int +pthread_condattr_destroy(pthread_condattr_t *attrp) +{ + free(*attrp); + *attrp = NULL; + + return (0); +} + +int +pthread_condattr_getclock(const pthread_condattr_t *attr, clockid_t *clock_id) +{ + *clock_id = (*attr)->ca_clock; + return (0); +} + +int +pthread_condattr_setclock(pthread_condattr_t *attr, clockid_t clock_id) +{ + if (clock_id != CLOCK_REALTIME && clock_id != CLOCK_MONOTONIC) + return (EINVAL); + (*attr)->ca_clock = clock_id; + return (0); +} + diff --git a/lib/librthread/rthread_sync.c b/lib/librthread/rthread_sync.c index 917f700bf8e..9d412bd5a5b 100644 --- a/lib/librthread/rthread_sync.c +++ b/lib/librthread/rthread_sync.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rthread_sync.c,v 1.30 2012/01/25 06:55:08 guenther Exp $ */ +/* $OpenBSD: rthread_sync.c,v 1.31 2012/02/23 04:43:06 guenther Exp $ */ /* * Copyright (c) 2004,2005 Ted Unangst <tedu@openbsd.org> * Copyright (c) 2012 Philip Guenther <guenther@openbsd.org> @@ -81,7 +81,8 @@ pthread_mutex_destroy(pthread_mutex_t *mutexp) } static int -_rthread_mutex_lock(pthread_mutex_t *mutexp, int trywait) +_rthread_mutex_lock(pthread_mutex_t *mutexp, int trywait, + const struct timespec *abstime) { struct pthread_mutex *mutex; pthread_t self = pthread_self(); @@ -129,7 +130,8 @@ _rthread_mutex_lock(pthread_mutex_t *mutexp, int trywait) /* add to the wait queue and block until at the head */ TAILQ_INSERT_TAIL(&mutex->lockers, self, waiting); while (mutex->owner != self) { - __thrsleep(self, 0, NULL, &mutex->lock, NULL); + __thrsleep(self, CLOCK_REALTIME, abstime, + &mutex->lock, NULL); _spinlock(&mutex->lock); assert(mutex->owner != NULL); } @@ -144,13 +146,19 @@ _rthread_mutex_lock(pthread_mutex_t *mutexp, int trywait) int pthread_mutex_lock(pthread_mutex_t *p) { - return (_rthread_mutex_lock(p, 0)); + return (_rthread_mutex_lock(p, 0, NULL)); } int pthread_mutex_trylock(pthread_mutex_t *p) { - return (_rthread_mutex_lock(p, 1)); + return (_rthread_mutex_lock(p, 1, NULL)); +} + +int +pthread_mutex_timedlock(pthread_mutex_t *p, const struct timespec *abstime) +{ + return (_rthread_mutex_lock(p, 0, abstime)); } int @@ -183,10 +191,8 @@ pthread_mutex_unlock(pthread_mutex_t *mutexp) /* * condition variables */ -/* ARGSUSED1 */ int -pthread_cond_init(pthread_cond_t *condp, - const pthread_condattr_t *attrp __unused) +pthread_cond_init(pthread_cond_t *condp, const pthread_condattr_t *attr) { pthread_cond_t cond; @@ -195,7 +201,10 @@ pthread_cond_init(pthread_cond_t *condp, return (errno); cond->lock = _SPINLOCK_UNLOCKED; TAILQ_INIT(&cond->waiters); - + if (attr == NULL) + cond->clock = CLOCK_REALTIME; + else + cond->clock = (*attr)->ca_clock; *condp = cond; return (0); @@ -283,7 +292,7 @@ pthread_cond_timedwait(pthread_cond_t *condp, pthread_mutex_t *mutexp, /* wait until we're the owner of the mutex again */ while (mutex->owner != self) { - error = __thrsleep(self, CLOCK_REALTIME, abstime, &mutex->lock, + error = __thrsleep(self, cond->clock, abstime, &mutex->lock, &self->delayed_cancel); /* @@ -598,29 +607,3 @@ pthread_cond_broadcast(pthread_cond_t *condp) return (0); } - -/* - * condition variable attributes - */ -int -pthread_condattr_init(pthread_condattr_t *attrp) -{ - pthread_condattr_t attr; - - attr = calloc(1, sizeof(*attr)); - if (!attr) - return (errno); - *attrp = attr; - - return (0); -} - -int -pthread_condattr_destroy(pthread_condattr_t *attrp) -{ - free(*attrp); - *attrp = NULL; - - return (0); -} - |