From cff773f5802d0b5b4d007be3f6f4adbb04ce0d41 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 10 Sep 2015 17:12:06 +0200 Subject: libstdthreads: Add C11 threads --- cpukit/libstdthreads/Makefile.am | 21 ++++++++++++++++++ cpukit/libstdthreads/call_once.c | 6 +---- cpukit/libstdthreads/cnd.c | 31 ++++++++------------------ cpukit/libstdthreads/mtx.c | 48 +++++++++------------------------------- cpukit/libstdthreads/thrd.c | 9 +++----- cpukit/libstdthreads/tss.c | 7 ++---- 6 files changed, 47 insertions(+), 75 deletions(-) create mode 100644 cpukit/libstdthreads/Makefile.am (limited to 'cpukit/libstdthreads') 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 -__FBSDID("$FreeBSD$"); - +#include #include -#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 + * Copyright (c) 2015 embedded brains GmbH * 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 -__FBSDID("$FreeBSD$"); - +#include #include -#include - -#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 + * Copyright (c) 2015 embedded brains GmbH * 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 -__FBSDID("$FreeBSD$"); - +#include +#include #include -#include - -#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 -__FBSDID("$FreeBSD$"); - +#include #include +#include #include #include -#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 -__FBSDID("$FreeBSD$"); - +#include +#include #include -#include "threads.h" - int tss_create(tss_t *key, tss_dtor_t dtor) { -- cgit v1.2.3