summaryrefslogtreecommitdiffstats
path: root/cpukit/libstdthreads
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2015-09-10 17:12:06 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2015-10-14 07:47:12 +0200
commitcff773f5802d0b5b4d007be3f6f4adbb04ce0d41 (patch)
treeafada47b1eb3d9ebbe755c8cd7eca6e3e9eec632 /cpukit/libstdthreads
parentlibstdthreads: Import from FreeBSD (diff)
downloadrtems-cff773f5802d0b5b4d007be3f6f4adbb04ce0d41.tar.bz2
libstdthreads: Add C11 threads
Diffstat (limited to 'cpukit/libstdthreads')
-rw-r--r--cpukit/libstdthreads/Makefile.am21
-rw-r--r--cpukit/libstdthreads/call_once.c6
-rw-r--r--cpukit/libstdthreads/cnd.c31
-rw-r--r--cpukit/libstdthreads/mtx.c48
-rw-r--r--cpukit/libstdthreads/thrd.c9
-rw-r--r--cpukit/libstdthreads/tss.c7
6 files changed, 47 insertions, 75 deletions
diff --git a/cpukit/libstdthreads/Makefile.am b/cpukit/libstdthreads/Makefile.am
new file mode 100644
index 0000000000..8b4ffaae0f
--- /dev/null
+++ b/cpukit/libstdthreads/Makefile.am
@@ -0,0 +1,21 @@
+include $(top_srcdir)/automake/compile.am
+
+include_HEADERS =
+
+noinst_LIBRARIES = libstdthreads.a
+
+libstdthreads_a_CFLAGS = -std=c11
+libstdthreads_a_CPPFLAGS = $(AM_CPPFLAGS)
+
+libstdthreads_a_SOURCES =
+if HAVE_THREADS_H
+libstdthreads_a_SOURCES += call_once.c
+libstdthreads_a_SOURCES += cnd.c
+libstdthreads_a_SOURCES += mtx.c
+if HAS_PTHREADS
+libstdthreads_a_SOURCES += thrd.c
+endif
+libstdthreads_a_SOURCES += tss.c
+endif
+
+include $(top_srcdir)/automake/local.am
diff --git a/cpukit/libstdthreads/call_once.c b/cpukit/libstdthreads/call_once.c
index 2d7d6ff89e..9a577d68db 100644
--- a/cpukit/libstdthreads/call_once.c
+++ b/cpukit/libstdthreads/call_once.c
@@ -26,13 +26,9 @@
* $FreeBSD r228904 2011-12-26T21:51:53Z$
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
+#include <threads.h>
#include <pthread.h>
-#include "threads.h"
-
void
call_once(once_flag *flag, void (*func)(void))
{
diff --git a/cpukit/libstdthreads/cnd.c b/cpukit/libstdthreads/cnd.c
index cccf728c77..7ed750aee4 100644
--- a/cpukit/libstdthreads/cnd.c
+++ b/cpukit/libstdthreads/cnd.c
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2011 Ed Schouten <ed@FreeBSD.org>
+ * Copyright (c) 2015 embedded brains GmbH <info@embedded-brains.de>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -26,20 +27,14 @@
* $FreeBSD r228904 2011-12-26T21:51:53Z$
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
+#include <threads.h>
#include <errno.h>
-#include <pthread.h>
-
-#include "threads.h"
int
cnd_broadcast(cnd_t *cond)
{
- if (pthread_cond_broadcast(cond) != 0)
- return (thrd_error);
+ _Condition_Broadcast(cond);
return (thrd_success);
}
@@ -47,29 +42,22 @@ void
cnd_destroy(cnd_t *cond)
{
- (void)pthread_cond_destroy(cond);
+ _Condition_Destroy(cond);
}
int
cnd_init(cnd_t *cond)
{
- switch (pthread_cond_init(cond, NULL)) {
- case 0:
- return (thrd_success);
- case ENOMEM:
- return (thrd_nomem);
- default:
- return (thrd_error);
- }
+ _Condition_Initialize(cond);
+ return (thrd_success);
}
int
cnd_signal(cnd_t *cond)
{
- if (pthread_cond_signal(cond) != 0)
- return (thrd_error);
+ _Condition_Signal(cond);
return (thrd_success);
}
@@ -78,7 +66,7 @@ cnd_timedwait(cnd_t *restrict cond, mtx_t *restrict mtx,
const struct timespec *restrict ts)
{
- switch (pthread_cond_timedwait(cond, mtx, ts)) {
+ switch (_Condition_Wait_recursive_timed(cond, mtx, ts)) {
case 0:
return (thrd_success);
case ETIMEDOUT:
@@ -92,7 +80,6 @@ int
cnd_wait(cnd_t *cond, mtx_t *mtx)
{
- if (pthread_cond_wait(cond, mtx) != 0)
- return (thrd_error);
+ _Condition_Wait_recursive(cond, mtx);
return (thrd_success);
}
diff --git a/cpukit/libstdthreads/mtx.c b/cpukit/libstdthreads/mtx.c
index 2d42f8a8db..48369c2ed0 100644
--- a/cpukit/libstdthreads/mtx.c
+++ b/cpukit/libstdthreads/mtx.c
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2011 Ed Schouten <ed@FreeBSD.org>
+ * Copyright (c) 2015 embedded brains GmbH <info@embedded-brains.de>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -26,46 +27,23 @@
* $FreeBSD r279326 2015-02-26T16:39:57Z$
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
+#include <threads.h>
+#include <sys/lock.h>
#include <errno.h>
-#include <pthread.h>
-
-#include "threads.h"
void
mtx_destroy(mtx_t *mtx)
{
- (void)pthread_mutex_destroy(mtx);
+ _Mutex_recursive_Destroy(mtx);
}
int
mtx_init(mtx_t *mtx, int type)
{
- pthread_mutexattr_t attr;
- int mt;
- switch (type) {
- case mtx_plain:
- case mtx_timed:
- mt = PTHREAD_MUTEX_NORMAL;
- break;
- case mtx_plain | mtx_recursive:
- case mtx_timed | mtx_recursive:
- mt = PTHREAD_MUTEX_RECURSIVE;
- break;
- default:
- return (thrd_error);
- }
-
- if (pthread_mutexattr_init(&attr) != 0)
- return (thrd_error);
- if (pthread_mutexattr_settype(&attr, mt) != 0)
- return (thrd_error);
- if (pthread_mutex_init(mtx, &attr) != 0)
- return (thrd_error);
+ (void)type;
+ _Mutex_recursive_Initialize(mtx);
return (thrd_success);
}
@@ -73,8 +51,7 @@ int
mtx_lock(mtx_t *mtx)
{
- if (pthread_mutex_lock(mtx) != 0)
- return (thrd_error);
+ _Mutex_recursive_Acquire(mtx);
return (thrd_success);
}
@@ -82,7 +59,7 @@ int
mtx_timedlock(mtx_t *restrict mtx, const struct timespec *restrict ts)
{
- switch (pthread_mutex_timedlock(mtx, ts)) {
+ switch (_Mutex_recursive_Acquire_timed(mtx, ts)) {
case 0:
return (thrd_success);
case ETIMEDOUT:
@@ -96,13 +73,11 @@ int
mtx_trylock(mtx_t *mtx)
{
- switch (pthread_mutex_trylock(mtx)) {
+ switch (_Mutex_recursive_Try_acquire(mtx)) {
case 0:
return (thrd_success);
- case EBUSY:
- return (thrd_busy);
default:
- return (thrd_error);
+ return (thrd_busy);
}
}
@@ -110,7 +85,6 @@ int
mtx_unlock(mtx_t *mtx)
{
- if (pthread_mutex_unlock(mtx) != 0)
- return (thrd_error);
+ _Mutex_recursive_Release(mtx);
return (thrd_success);
}
diff --git a/cpukit/libstdthreads/thrd.c b/cpukit/libstdthreads/thrd.c
index 562e806226..c2e439f45c 100644
--- a/cpukit/libstdthreads/thrd.c
+++ b/cpukit/libstdthreads/thrd.c
@@ -26,15 +26,12 @@
* $FreeBSD r279318 2015-02-26T09:42:03Z$
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
+#include <threads.h>
#include <pthread.h>
+#include <sched.h>
#include <stdint.h>
#include <stdlib.h>
-#include "threads.h"
-
struct thrd_param {
thrd_start_t func;
void *arg;
@@ -124,5 +121,5 @@ void
thrd_yield(void)
{
- pthread_yield();
+ sched_yield();
}
diff --git a/cpukit/libstdthreads/tss.c b/cpukit/libstdthreads/tss.c
index 0d4eea7a2e..9ff9d3bd3a 100644
--- a/cpukit/libstdthreads/tss.c
+++ b/cpukit/libstdthreads/tss.c
@@ -26,13 +26,10 @@
* $FreeBSD r228904 2011-12-26T21:51:53Z$
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
+#include <threads.h>
+#include <limits.h>
#include <pthread.h>
-#include "threads.h"
-
int
tss_create(tss_t *key, tss_dtor_t dtor)
{