summaryrefslogtreecommitdiff
path: root/lib/librthread
diff options
context:
space:
mode:
authorPhilip Guenthe <guenther@cvs.openbsd.org>2012-02-23 04:43:07 +0000
committerPhilip Guenthe <guenther@cvs.openbsd.org>2012-02-23 04:43:07 +0000
commit5888f487d1e36a0b4564a83b469450a3901ce766 (patch)
treedf8cadf19f8555779f3ddf27cd5db3d2bcc32dc6 /lib/librthread
parent5521952675f06d028f9843535c3c6accf4c10839 (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/Makefile29
-rw-r--r--lib/librthread/rthread.h5
-rw-r--r--lib/librthread/rthread_condattr.c71
-rw-r--r--lib/librthread/rthread_sync.c55
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);
-}
-