libstdthreads: Add C11 threads

This commit is contained in:
Sebastian Huber
2015-10-14 07:47:12 +02:00
parent e3330899f3
commit cff773f580
15 changed files with 554 additions and 75 deletions
+21
View File
@@ -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
+1 -5
View File
@@ -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))
{
+9 -22
View File
@@ -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);
}
+11 -37
View File
@@ -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);
}
+3 -6
View File
@@ -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();
}
+2 -5
View File
@@ -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)
{