diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-09-10 17:12:06 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-10-14 07:47:12 +0200 |
commit | cff773f5802d0b5b4d007be3f6f4adbb04ce0d41 (patch) | |
tree | afada47b1eb3d9ebbe755c8cd7eca6e3e9eec632 /cpukit | |
parent | libstdthreads: Import from FreeBSD (diff) | |
download | rtems-cff773f5802d0b5b4d007be3f6f4adbb04ce0d41.tar.bz2 |
libstdthreads: Add C11 threads
Diffstat (limited to 'cpukit')
-rw-r--r-- | cpukit/Makefile.am | 1 | ||||
-rw-r--r-- | cpukit/configure.ac | 4 | ||||
-rw-r--r-- | cpukit/libstdthreads/Makefile.am | 21 | ||||
-rw-r--r-- | cpukit/libstdthreads/call_once.c | 6 | ||||
-rw-r--r-- | cpukit/libstdthreads/cnd.c | 31 | ||||
-rw-r--r-- | cpukit/libstdthreads/mtx.c | 48 | ||||
-rw-r--r-- | cpukit/libstdthreads/thrd.c | 9 | ||||
-rw-r--r-- | cpukit/libstdthreads/tss.c | 7 | ||||
-rw-r--r-- | cpukit/wrapup/Makefile.am | 1 |
9 files changed, 53 insertions, 75 deletions
diff --git a/cpukit/Makefile.am b/cpukit/Makefile.am index c9a4e0f506..063a795b7f 100644 --- a/cpukit/Makefile.am +++ b/cpukit/Makefile.am @@ -16,6 +16,7 @@ SUBDIRS += libmisc SUBDIRS += libmd SUBDIRS += libgnat SUBDIRS += libdl +SUBDIRS += libstdthreads SUBDIRS += wrapup SUBDIRS += zlib diff --git a/cpukit/configure.ac b/cpukit/configure.ac index 14ce0f1a4c..01da86d3e4 100644 --- a/cpukit/configure.ac +++ b/cpukit/configure.ac @@ -141,6 +141,9 @@ AS_IF([test -n "$rtems_missing_header"], AC_CHECK_HEADERS([semaphore.h]) AM_CONDITIONAL([HAVE_SEMAPHORE_H],[test x"$ac_cv_header_semaphore_h" = x"yes"]) +AC_CHECK_HEADERS([threads.h]) +AM_CONDITIONAL([HAVE_THREADS_H],[test x"$ac_cv_header_threads_h" = x"yes"]) + ## error out if libc doesn't provide stdint.h AS_IF([test x"${ac_cv_header_stdint_h}" != xyes], [AC_MSG_ERROR([Required header stdint.h not found])]) @@ -481,6 +484,7 @@ libmisc/Makefile libi2c/Makefile libmd/Makefile libdl/Makefile +libstdthreads/Makefile zlib/Makefile ftpd/Makefile telnetd/Makefile 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) { diff --git a/cpukit/wrapup/Makefile.am b/cpukit/wrapup/Makefile.am index 5fd6e33004..57ef83275c 100644 --- a/cpukit/wrapup/Makefile.am +++ b/cpukit/wrapup/Makefile.am @@ -20,6 +20,7 @@ TMP_LIBS += ../libgnat/libgnat.a endif TMP_LIBS += ../libcrypt/libcrypt.a +TMP_LIBS += ../libstdthreads/libstdthreads.a TMP_LIBS += ../libcsupport/libcsupport.a TMP_LIBS += ../libcsupport/libcalloc.a TMP_LIBS += ../libblock/libblock.a |