summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/libpthread/include/pthread.h8
-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
5 files changed, 122 insertions, 46 deletions
diff --git a/lib/libpthread/include/pthread.h b/lib/libpthread/include/pthread.h
index 71687aa5cba..0a3cde4f753 100644
--- a/lib/libpthread/include/pthread.h
+++ b/lib/libpthread/include/pthread.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: pthread.h,v 1.31 2012/01/03 16:53:48 kettenis Exp $ */
+/* $OpenBSD: pthread.h,v 1.32 2012/02/23 04:43:06 guenther Exp $ */
/*
* Copyright (c) 1993, 1994 by Chris Provenzano, proven@mit.edu
@@ -243,6 +243,8 @@ int pthread_mutex_destroy(pthread_mutex_t *);
int pthread_mutex_init(pthread_mutex_t *,
const pthread_mutexattr_t *);
int pthread_mutex_lock(pthread_mutex_t *);
+int pthread_mutex_timedlock(pthread_mutex_t *,
+ const struct timespec *);
int pthread_mutex_trylock(pthread_mutex_t *);
int pthread_mutex_unlock(pthread_mutex_t *);
int pthread_once(pthread_once_t *, void (*) (void));
@@ -285,6 +287,10 @@ int pthread_mutex_setprioceiling(pthread_mutex_t *, int, int *);
int pthread_mutexattr_getprotocol(pthread_mutexattr_t *, int *);
int pthread_mutexattr_setprotocol(pthread_mutexattr_t *, int);
+int pthread_condattr_getclock(const pthread_condattr_t *,
+ clockid_t *);
+int pthread_condattr_setclock(pthread_condattr_t *, clockid_t);
+
int pthread_attr_getinheritsched(const pthread_attr_t *, int *);
int pthread_attr_getschedparam(const pthread_attr_t *,
struct sched_param *);
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);
-}
-