Cygwin: Add C11 threads API
Code taken from FreeBSD, which implements C11 threads as wrapper around pthreads. Fix up machine/_threads.h which is called from newlib's machine-independent threads.h to match Cygwin's pthreads types. Add the FreeBSD source files to libc subdir and take opportunity to define LIBC_OFILES var in Makefile. Add new symbols to common.din and sort symbols. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
parent
5999c433bb
commit
75a669790e
|
@ -151,6 +151,32 @@ DLL_IMPORTS:=${shell $(CC) -print-file-name=w32api/libkernel32.a} ${shell $(CC)
|
||||||
|
|
||||||
MT_SAFE_OBJECTS:=
|
MT_SAFE_OBJECTS:=
|
||||||
#
|
#
|
||||||
|
LIBC_OFILES:= \
|
||||||
|
arc4random_stir.o \
|
||||||
|
base64.o \
|
||||||
|
bsdlib.o \
|
||||||
|
call_once.o \
|
||||||
|
cnd.o \
|
||||||
|
fnmatch.o \
|
||||||
|
fts.o \
|
||||||
|
ftw.o \
|
||||||
|
getentropy.o \
|
||||||
|
getopt.o \
|
||||||
|
inet_addr.o \
|
||||||
|
inet_network.o \
|
||||||
|
minires-os-if.o \
|
||||||
|
minires.o \
|
||||||
|
msgcat.o \
|
||||||
|
mtx.o \
|
||||||
|
nftw.o \
|
||||||
|
rcmd.o \
|
||||||
|
rexec.o \
|
||||||
|
strfmon.o \
|
||||||
|
strptime.o \
|
||||||
|
thrd.o \
|
||||||
|
tss.o \
|
||||||
|
xsique.o
|
||||||
|
|
||||||
MATH_OFILES:= \
|
MATH_OFILES:= \
|
||||||
acoshl.o \
|
acoshl.o \
|
||||||
acosl.o \
|
acosl.o \
|
||||||
|
@ -251,11 +277,8 @@ TZCODE_OFILES:=localtime.o
|
||||||
DLL_OFILES:= \
|
DLL_OFILES:= \
|
||||||
advapi32.o \
|
advapi32.o \
|
||||||
aio.o \
|
aio.o \
|
||||||
arc4random_stir.o \
|
|
||||||
assert.o \
|
assert.o \
|
||||||
autoload.o \
|
autoload.o \
|
||||||
base64.o \
|
|
||||||
bsdlib.o \
|
|
||||||
clock.o \
|
clock.o \
|
||||||
ctype.o \
|
ctype.o \
|
||||||
cxx.o \
|
cxx.o \
|
||||||
|
@ -313,21 +336,14 @@ DLL_OFILES:= \
|
||||||
fhandler_windows.o \
|
fhandler_windows.o \
|
||||||
fhandler_zero.o \
|
fhandler_zero.o \
|
||||||
flock.o \
|
flock.o \
|
||||||
fnmatch.o \
|
|
||||||
fork.o \
|
fork.o \
|
||||||
forkable.o \
|
forkable.o \
|
||||||
fts.o \
|
|
||||||
ftw.o \
|
|
||||||
getentropy.o \
|
|
||||||
getopt.o \
|
|
||||||
glob.o \
|
glob.o \
|
||||||
glob_pattern_p.o \
|
glob_pattern_p.o \
|
||||||
globals.o \
|
globals.o \
|
||||||
grp.o \
|
grp.o \
|
||||||
heap.o \
|
heap.o \
|
||||||
hookapi.o \
|
hookapi.o \
|
||||||
inet_addr.o \
|
|
||||||
inet_network.o \
|
|
||||||
init.o \
|
init.o \
|
||||||
ioctl.o \
|
ioctl.o \
|
||||||
ipc.o \
|
ipc.o \
|
||||||
|
@ -337,19 +353,15 @@ DLL_OFILES:= \
|
||||||
loadavg.o \
|
loadavg.o \
|
||||||
lsearch.o \
|
lsearch.o \
|
||||||
malloc_wrapper.o \
|
malloc_wrapper.o \
|
||||||
minires-os-if.o \
|
|
||||||
minires.o \
|
|
||||||
miscfuncs.o \
|
miscfuncs.o \
|
||||||
mktemp.o \
|
mktemp.o \
|
||||||
mmap.o \
|
mmap.o \
|
||||||
mmap_alloc.o \
|
mmap_alloc.o \
|
||||||
msg.o \
|
msg.o \
|
||||||
msgcat.o \
|
|
||||||
mount.o \
|
mount.o \
|
||||||
net.o \
|
net.o \
|
||||||
netdb.o \
|
netdb.o \
|
||||||
nfs.o \
|
nfs.o \
|
||||||
nftw.o \
|
|
||||||
nlsfuncs.o \
|
nlsfuncs.o \
|
||||||
ntea.o \
|
ntea.o \
|
||||||
passwd.o \
|
passwd.o \
|
||||||
|
@ -368,8 +380,6 @@ DLL_OFILES:= \
|
||||||
regfree.o \
|
regfree.o \
|
||||||
registry.o \
|
registry.o \
|
||||||
resource.o \
|
resource.o \
|
||||||
rexec.o \
|
|
||||||
rcmd.o \
|
|
||||||
scandir.o \
|
scandir.o \
|
||||||
sched.o \
|
sched.o \
|
||||||
sec_acl.o \
|
sec_acl.o \
|
||||||
|
@ -388,9 +398,7 @@ DLL_OFILES:= \
|
||||||
smallprint.o \
|
smallprint.o \
|
||||||
spawn.o \
|
spawn.o \
|
||||||
strace.o \
|
strace.o \
|
||||||
strfmon.o \
|
|
||||||
strfuncs.o \
|
strfuncs.o \
|
||||||
strptime.o \
|
|
||||||
strsep.o \
|
strsep.o \
|
||||||
strsig.o \
|
strsig.o \
|
||||||
sync.o \
|
sync.o \
|
||||||
|
@ -409,9 +417,9 @@ DLL_OFILES:= \
|
||||||
wincap.o \
|
wincap.o \
|
||||||
window.o \
|
window.o \
|
||||||
winf.o \
|
winf.o \
|
||||||
xsique.o \
|
|
||||||
$(EXTRA_OFILES) \
|
$(EXTRA_OFILES) \
|
||||||
$(MALLOC_OFILES) \
|
$(MALLOC_OFILES) \
|
||||||
|
$(LIBC_OFILES) \
|
||||||
$(MATH_OFILES) \
|
$(MATH_OFILES) \
|
||||||
$(TZCODE_OFILES) \
|
$(TZCODE_OFILES) \
|
||||||
$(MT_SAFE_OBJECTS)
|
$(MT_SAFE_OBJECTS)
|
||||||
|
|
|
@ -38,7 +38,6 @@ sys_sigabbrev DATA
|
||||||
sys_siglist DATA
|
sys_siglist DATA
|
||||||
|
|
||||||
# Exported functions
|
# Exported functions
|
||||||
_Exit SIGFE
|
|
||||||
__assert NOSIGFE
|
__assert NOSIGFE
|
||||||
__assert_func NOSIGFE
|
__assert_func NOSIGFE
|
||||||
__assertfail NOSIGFE
|
__assertfail NOSIGFE
|
||||||
|
@ -126,6 +125,7 @@ __xdrrec_getrec SIGFE
|
||||||
__xdrrec_setnonblock SIGFE
|
__xdrrec_setnonblock SIGFE
|
||||||
__xpg_sigpause SIGFE
|
__xpg_sigpause SIGFE
|
||||||
__xpg_strerror_r SIGFE
|
__xpg_strerror_r SIGFE
|
||||||
|
_Exit SIGFE
|
||||||
_exit SIGFE
|
_exit SIGFE
|
||||||
_feinitialise NOSIGFE
|
_feinitialise NOSIGFE
|
||||||
_fscanf_r SIGFE
|
_fscanf_r SIGFE
|
||||||
|
@ -233,6 +233,7 @@ asinhl NOSIGFE
|
||||||
asinl NOSIGFE
|
asinl NOSIGFE
|
||||||
asnprintf SIGFE
|
asnprintf SIGFE
|
||||||
asprintf SIGFE
|
asprintf SIGFE
|
||||||
|
at_quick_exit SIGFE
|
||||||
atan NOSIGFE
|
atan NOSIGFE
|
||||||
atan2 NOSIGFE
|
atan2 NOSIGFE
|
||||||
atan2f NOSIGFE
|
atan2f NOSIGFE
|
||||||
|
@ -248,7 +249,6 @@ atoff SIGFE
|
||||||
atoi NOSIGFE
|
atoi NOSIGFE
|
||||||
atol NOSIGFE
|
atol NOSIGFE
|
||||||
atoll NOSIGFE
|
atoll NOSIGFE
|
||||||
at_quick_exit SIGFE
|
|
||||||
basename NOSIGFE
|
basename NOSIGFE
|
||||||
bcmp NOSIGFE
|
bcmp NOSIGFE
|
||||||
bcopy NOSIGFE
|
bcopy NOSIGFE
|
||||||
|
@ -267,6 +267,7 @@ cacosh NOSIGFE
|
||||||
cacoshf NOSIGFE
|
cacoshf NOSIGFE
|
||||||
cacoshl NOSIGFE
|
cacoshl NOSIGFE
|
||||||
cacosl NOSIGFE
|
cacosl NOSIGFE
|
||||||
|
call_once SIGFE
|
||||||
calloc SIGFE
|
calloc SIGFE
|
||||||
canonicalize_file_name SIGFE
|
canonicalize_file_name SIGFE
|
||||||
carg NOSIGFE
|
carg NOSIGFE
|
||||||
|
@ -335,6 +336,12 @@ clogl NOSIGFE
|
||||||
close SIGFE
|
close SIGFE
|
||||||
closedir SIGFE
|
closedir SIGFE
|
||||||
closelog SIGFE
|
closelog SIGFE
|
||||||
|
cnd_broadcast SIGFE
|
||||||
|
cnd_destroy SIGFE
|
||||||
|
cnd_init SIGFE
|
||||||
|
cnd_signal SIGFE
|
||||||
|
cnd_timedwait SIGFE
|
||||||
|
cnd_wait SIGFE
|
||||||
confstr NOSIGFE
|
confstr NOSIGFE
|
||||||
conj NOSIGFE
|
conj NOSIGFE
|
||||||
conjf NOSIGFE
|
conjf NOSIGFE
|
||||||
|
@ -635,8 +642,6 @@ gammaf NOSIGFE
|
||||||
gammaf_r NOSIGFE
|
gammaf_r NOSIGFE
|
||||||
gcvt SIGFE
|
gcvt SIGFE
|
||||||
gcvtf SIGFE
|
gcvtf SIGFE
|
||||||
GetCommandLineA@0 = cygwin_GetCommandLineA@0 NOSIGFE
|
|
||||||
GetCommandLineW@0 = cygwin_GetCommandLineW@0 NOSIGFE
|
|
||||||
get_avphys_pages SIGFE
|
get_avphys_pages SIGFE
|
||||||
get_current_dir_name SIGFE
|
get_current_dir_name SIGFE
|
||||||
get_nprocs SIGFE
|
get_nprocs SIGFE
|
||||||
|
@ -647,6 +652,8 @@ getc SIGFE
|
||||||
getc_unlocked SIGFE
|
getc_unlocked SIGFE
|
||||||
getchar SIGFE
|
getchar SIGFE
|
||||||
getchar_unlocked SIGFE
|
getchar_unlocked SIGFE
|
||||||
|
GetCommandLineA@0 = cygwin_GetCommandLineA@0 NOSIGFE
|
||||||
|
GetCommandLineW@0 = cygwin_GetCommandLineW@0 NOSIGFE
|
||||||
getcontext NOSIGFE
|
getcontext NOSIGFE
|
||||||
getcwd SIGFE
|
getcwd SIGFE
|
||||||
getdelim = __getdelim SIGFE
|
getdelim = __getdelim SIGFE
|
||||||
|
@ -891,9 +898,9 @@ logb NOSIGFE
|
||||||
logbf NOSIGFE
|
logbf NOSIGFE
|
||||||
logbl NOSIGFE
|
logbl NOSIGFE
|
||||||
logf NOSIGFE
|
logf NOSIGFE
|
||||||
logl NOSIGFE
|
|
||||||
login SIGFE
|
login SIGFE
|
||||||
login_tty SIGFE
|
login_tty SIGFE
|
||||||
|
logl NOSIGFE
|
||||||
logout SIGFE
|
logout SIGFE
|
||||||
logwtmp SIGFE
|
logwtmp SIGFE
|
||||||
longjmp NOSIGFE
|
longjmp NOSIGFE
|
||||||
|
@ -972,6 +979,12 @@ msgget SIGFE
|
||||||
msgrcv SIGFE
|
msgrcv SIGFE
|
||||||
msgsnd SIGFE
|
msgsnd SIGFE
|
||||||
msync SIGFE
|
msync SIGFE
|
||||||
|
mtx_destroy SIGFE
|
||||||
|
mtx_init SIGFE
|
||||||
|
mtx_lock SIGFE
|
||||||
|
mtx_timedlock SIGFE
|
||||||
|
mtx_trylock SIGFE
|
||||||
|
mtx_unlock SIGFE
|
||||||
munlock SIGFE
|
munlock SIGFE
|
||||||
munmap SIGFE
|
munmap SIGFE
|
||||||
nan NOSIGFE
|
nan NOSIGFE
|
||||||
|
@ -1017,14 +1030,19 @@ posix_madvise SIGFE
|
||||||
posix_memalign SIGFE
|
posix_memalign SIGFE
|
||||||
posix_openpt SIGFE
|
posix_openpt SIGFE
|
||||||
posix_spawn SIGFE
|
posix_spawn SIGFE
|
||||||
|
posix_spawn_file_actions_addclose SIGFE
|
||||||
|
posix_spawn_file_actions_adddup2 SIGFE
|
||||||
|
posix_spawn_file_actions_addopen SIGFE
|
||||||
|
posix_spawn_file_actions_destroy SIGFE
|
||||||
|
posix_spawn_file_actions_init SIGFE
|
||||||
posix_spawnattr_destroy SIGFE
|
posix_spawnattr_destroy SIGFE
|
||||||
posix_spawnattr_init SIGFE
|
|
||||||
posix_spawnattr_getflags NOSIGFE
|
posix_spawnattr_getflags NOSIGFE
|
||||||
posix_spawnattr_getpgroup NOSIGFE
|
posix_spawnattr_getpgroup NOSIGFE
|
||||||
posix_spawnattr_getschedparam NOSIGFE
|
posix_spawnattr_getschedparam NOSIGFE
|
||||||
posix_spawnattr_getschedpolicy NOSIGFE
|
posix_spawnattr_getschedpolicy NOSIGFE
|
||||||
posix_spawnattr_getsigdefault NOSIGFE
|
posix_spawnattr_getsigdefault NOSIGFE
|
||||||
posix_spawnattr_getsigmask NOSIGFE
|
posix_spawnattr_getsigmask NOSIGFE
|
||||||
|
posix_spawnattr_init SIGFE
|
||||||
posix_spawnattr_setflags NOSIGFE
|
posix_spawnattr_setflags NOSIGFE
|
||||||
posix_spawnattr_setpgroup NOSIGFE
|
posix_spawnattr_setpgroup NOSIGFE
|
||||||
posix_spawnattr_setschedparam NOSIGFE
|
posix_spawnattr_setschedparam NOSIGFE
|
||||||
|
@ -1032,11 +1050,6 @@ posix_spawnattr_setschedpolicy NOSIGFE
|
||||||
posix_spawnattr_setsigdefault NOSIGFE
|
posix_spawnattr_setsigdefault NOSIGFE
|
||||||
posix_spawnattr_setsigmask NOSIGFE
|
posix_spawnattr_setsigmask NOSIGFE
|
||||||
posix_spawnp SIGFE
|
posix_spawnp SIGFE
|
||||||
posix_spawn_file_actions_destroy SIGFE
|
|
||||||
posix_spawn_file_actions_init SIGFE
|
|
||||||
posix_spawn_file_actions_addclose SIGFE
|
|
||||||
posix_spawn_file_actions_adddup2 SIGFE
|
|
||||||
posix_spawn_file_actions_addopen SIGFE
|
|
||||||
pow NOSIGFE
|
pow NOSIGFE
|
||||||
pow10 NOSIGFE
|
pow10 NOSIGFE
|
||||||
pow10f NOSIGFE
|
pow10f NOSIGFE
|
||||||
|
@ -1070,13 +1083,13 @@ pthread_attr_setscope SIGFE
|
||||||
pthread_attr_setstack SIGFE
|
pthread_attr_setstack SIGFE
|
||||||
pthread_attr_setstackaddr SIGFE
|
pthread_attr_setstackaddr SIGFE
|
||||||
pthread_attr_setstacksize SIGFE
|
pthread_attr_setstacksize SIGFE
|
||||||
|
pthread_barrier_destroy SIGFE
|
||||||
|
pthread_barrier_init SIGFE
|
||||||
|
pthread_barrier_wait SIGFE
|
||||||
|
pthread_barrierattr_destroy SIGFE
|
||||||
|
pthread_barrierattr_getpshared SIGFE
|
||||||
pthread_barrierattr_init SIGFE
|
pthread_barrierattr_init SIGFE
|
||||||
pthread_barrierattr_setpshared SIGFE
|
pthread_barrierattr_setpshared SIGFE
|
||||||
pthread_barrierattr_getpshared SIGFE
|
|
||||||
pthread_barrierattr_destroy SIGFE
|
|
||||||
pthread_barrier_init SIGFE
|
|
||||||
pthread_barrier_destroy SIGFE
|
|
||||||
pthread_barrier_wait SIGFE
|
|
||||||
pthread_cancel SIGFE
|
pthread_cancel SIGFE
|
||||||
pthread_cond_broadcast SIGFE
|
pthread_cond_broadcast SIGFE
|
||||||
pthread_cond_destroy SIGFE
|
pthread_cond_destroy SIGFE
|
||||||
|
@ -1176,9 +1189,9 @@ putwc_unlocked SIGFE
|
||||||
putwchar SIGFE
|
putwchar SIGFE
|
||||||
putwchar_unlocked SIGFE
|
putwchar_unlocked SIGFE
|
||||||
pwrite SIGFE
|
pwrite SIGFE
|
||||||
quick_exit SIGFE
|
|
||||||
qsort NOSIGFE
|
qsort NOSIGFE
|
||||||
qsort_r NOSIGFE
|
qsort_r NOSIGFE
|
||||||
|
quick_exit SIGFE
|
||||||
quotactl SIGFE
|
quotactl SIGFE
|
||||||
raise SIGFE
|
raise SIGFE
|
||||||
rand NOSIGFE
|
rand NOSIGFE
|
||||||
|
@ -1293,7 +1306,6 @@ sendto = cygwin_sendto SIGFE
|
||||||
setbuf SIGFE
|
setbuf SIGFE
|
||||||
setbuffer SIGFE
|
setbuffer SIGFE
|
||||||
setcontext NOSIGFE
|
setcontext NOSIGFE
|
||||||
sethostname SIGFE
|
|
||||||
setdtablesize SIGFE
|
setdtablesize SIGFE
|
||||||
setegid SIGFE
|
setegid SIGFE
|
||||||
setenv SIGFE
|
setenv SIGFE
|
||||||
|
@ -1302,6 +1314,7 @@ setgid SIGFE
|
||||||
setgrent NOSIGFE
|
setgrent NOSIGFE
|
||||||
setgroups SIGFE
|
setgroups SIGFE
|
||||||
sethostent NOSIGFE
|
sethostent NOSIGFE
|
||||||
|
sethostname SIGFE
|
||||||
setitimer SIGFE
|
setitimer SIGFE
|
||||||
setjmp NOSIGFE
|
setjmp NOSIGFE
|
||||||
setlinebuf SIGFE
|
setlinebuf SIGFE
|
||||||
|
@ -1495,6 +1508,14 @@ tfind NOSIGFE
|
||||||
tgamma NOSIGFE
|
tgamma NOSIGFE
|
||||||
tgammaf NOSIGFE
|
tgammaf NOSIGFE
|
||||||
tgammal NOSIGFE
|
tgammal NOSIGFE
|
||||||
|
thrd_create SIGFE
|
||||||
|
thrd_current SIGFE
|
||||||
|
thrd_detach SIGFE
|
||||||
|
thrd_equal SIGFE
|
||||||
|
thrd_exit SIGFE
|
||||||
|
thrd_join SIGFE
|
||||||
|
thrd_sleep SIGFE
|
||||||
|
thrd_yield SIGFE
|
||||||
time SIGFE
|
time SIGFE
|
||||||
timegm NOSIGFE
|
timegm NOSIGFE
|
||||||
timelocal SIGFE
|
timelocal SIGFE
|
||||||
|
@ -1529,6 +1550,10 @@ truncate SIGFE
|
||||||
truncf NOSIGFE
|
truncf NOSIGFE
|
||||||
truncl NOSIGFE
|
truncl NOSIGFE
|
||||||
tsearch SIGFE
|
tsearch SIGFE
|
||||||
|
tss_create SIGFE
|
||||||
|
tss_delete SIGFE
|
||||||
|
tss_get SIGFE
|
||||||
|
tss_set SIGFE
|
||||||
ttyname SIGFE
|
ttyname SIGFE
|
||||||
ttyname_r SIGFE
|
ttyname_r SIGFE
|
||||||
ttyslot NOSIGFE
|
ttyslot NOSIGFE
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
/*-
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011 Ed Schouten <ed@FreeBSD.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* $FreeBSD$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _MACHINE__THREADS_H_
|
||||||
|
#define _MACHINE__THREADS_H_
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/lock.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The C11 threads interface.
|
||||||
|
*
|
||||||
|
* This interface is implemented as a light-weight wrapper around
|
||||||
|
* <pthread.h>. To prevent namespace pollution, the once_flag object,
|
||||||
|
* its corresponding ONCE_FLAG_INIT and TSS_DTOR_ITERATIONS have been
|
||||||
|
* copied from this header file. They must be kept in sync.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef pthread_cond_t cnd_t;
|
||||||
|
typedef pthread_mutex_t mtx_t;
|
||||||
|
typedef pthread_t thrd_t;
|
||||||
|
typedef pthread_key_t tss_t;
|
||||||
|
|
||||||
|
/* pthread_once_t */
|
||||||
|
typedef struct {
|
||||||
|
mtx_t mutex;
|
||||||
|
int state;
|
||||||
|
} once_flag;
|
||||||
|
|
||||||
|
/* PTHREAD_ONCE_INIT */
|
||||||
|
#define ONCE_FLAG_INIT { ((pthread_mutex_t)19), 0 }
|
||||||
|
|
||||||
|
/* PTHREAD_DESTRUCTOR_ITERATIONS */
|
||||||
|
#define TSS_DTOR_ITERATIONS 4
|
||||||
|
|
||||||
|
#endif /* _MACHINE__THREADS_H_ */
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*-
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011 Ed Schouten <ed@FreeBSD.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* $FreeBSD$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
#include "threads.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
call_once(once_flag *flag, void (*func)(void))
|
||||||
|
{
|
||||||
|
|
||||||
|
(void)pthread_once((pthread_once_t *)flag, func);
|
||||||
|
}
|
||||||
|
|
||||||
|
_Static_assert(sizeof(once_flag) == sizeof(pthread_once_t),
|
||||||
|
"once_flag must be of the same size as pthread_once_t");
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*-
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011 Ed Schouten <ed@FreeBSD.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* $FreeBSD$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
#include "threads.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
cnd_broadcast(cnd_t *cond)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (pthread_cond_broadcast(cond) != 0)
|
||||||
|
return (thrd_error);
|
||||||
|
return (thrd_success);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cnd_destroy(cnd_t *cond)
|
||||||
|
{
|
||||||
|
|
||||||
|
(void)pthread_cond_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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
cnd_signal(cnd_t *cond)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (pthread_cond_signal(cond) != 0)
|
||||||
|
return (thrd_error);
|
||||||
|
return (thrd_success);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
cnd_timedwait(cnd_t *restrict cond, mtx_t *restrict mtx,
|
||||||
|
const struct timespec *restrict ts)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch (pthread_cond_timedwait(cond, mtx, ts)) {
|
||||||
|
case 0:
|
||||||
|
return (thrd_success);
|
||||||
|
case ETIMEDOUT:
|
||||||
|
return (thrd_timedout);
|
||||||
|
default:
|
||||||
|
return (thrd_error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
cnd_wait(cnd_t *cond, mtx_t *mtx)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (pthread_cond_wait(cond, mtx) != 0)
|
||||||
|
return (thrd_error);
|
||||||
|
return (thrd_success);
|
||||||
|
}
|
|
@ -0,0 +1,125 @@
|
||||||
|
/*-
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011 Ed Schouten <ed@FreeBSD.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* $FreeBSD$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
#include "threads.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
mtx_destroy(mtx_t *mtx)
|
||||||
|
{
|
||||||
|
|
||||||
|
(void)pthread_mutex_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;
|
||||||
|
#ifdef __CYGWIN__
|
||||||
|
/* This is a hack to support apps running under GLibc. mtx_plain is
|
||||||
|
defined as 0 in GLibc, so apps calling mtx_init with just the
|
||||||
|
mtx_recursive flag don't fail, as they should. Rather they run
|
||||||
|
as if mtx_plain | mtx_recursive has been given as type. */
|
||||||
|
case mtx_recursive:
|
||||||
|
#endif
|
||||||
|
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);
|
||||||
|
return (thrd_success);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
mtx_lock(mtx_t *mtx)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (pthread_mutex_lock(mtx) != 0)
|
||||||
|
return (thrd_error);
|
||||||
|
return (thrd_success);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
mtx_timedlock(mtx_t *restrict mtx, const struct timespec *restrict ts)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch (pthread_mutex_timedlock(mtx, ts)) {
|
||||||
|
case 0:
|
||||||
|
return (thrd_success);
|
||||||
|
case ETIMEDOUT:
|
||||||
|
return (thrd_timedout);
|
||||||
|
default:
|
||||||
|
return (thrd_error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
mtx_trylock(mtx_t *mtx)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch (pthread_mutex_trylock(mtx)) {
|
||||||
|
case 0:
|
||||||
|
return (thrd_success);
|
||||||
|
case EBUSY:
|
||||||
|
return (thrd_busy);
|
||||||
|
default:
|
||||||
|
return (thrd_error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
mtx_unlock(mtx_t *mtx)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (pthread_mutex_unlock(mtx) != 0)
|
||||||
|
return (thrd_error);
|
||||||
|
return (thrd_success);
|
||||||
|
}
|
|
@ -0,0 +1,150 @@
|
||||||
|
/*-
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011 Ed Schouten <ed@FreeBSD.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* $FreeBSD$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __CYGWIN__
|
||||||
|
#include <errno.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "threads.h"
|
||||||
|
|
||||||
|
struct thrd_param {
|
||||||
|
thrd_start_t func;
|
||||||
|
void *arg;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void *
|
||||||
|
thrd_entry(void *arg)
|
||||||
|
{
|
||||||
|
struct thrd_param tp;
|
||||||
|
|
||||||
|
tp = *(struct thrd_param *)arg;
|
||||||
|
free(arg);
|
||||||
|
return ((void *)(intptr_t)tp.func(tp.arg));
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
thrd_create(thrd_t *thr, thrd_start_t func, void *arg)
|
||||||
|
{
|
||||||
|
struct thrd_param *tp;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Work around return type inconsistency. Wrap execution using
|
||||||
|
* a function conforming to pthread_create()'s start_routine.
|
||||||
|
*/
|
||||||
|
tp = malloc(sizeof(*tp));
|
||||||
|
if (tp == NULL)
|
||||||
|
return (thrd_nomem);
|
||||||
|
tp->func = func;
|
||||||
|
tp->arg = arg;
|
||||||
|
if (pthread_create(thr, NULL, thrd_entry, tp) != 0) {
|
||||||
|
free(tp);
|
||||||
|
return (thrd_error);
|
||||||
|
}
|
||||||
|
return (thrd_success);
|
||||||
|
}
|
||||||
|
|
||||||
|
thrd_t
|
||||||
|
thrd_current(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
return (pthread_self());
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
thrd_detach(thrd_t thr)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (pthread_detach(thr) != 0)
|
||||||
|
return (thrd_error);
|
||||||
|
return (thrd_success);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
thrd_equal(thrd_t thr0, thrd_t thr1)
|
||||||
|
{
|
||||||
|
|
||||||
|
return (pthread_equal(thr0, thr1));
|
||||||
|
}
|
||||||
|
|
||||||
|
_Noreturn void
|
||||||
|
thrd_exit(int res)
|
||||||
|
{
|
||||||
|
|
||||||
|
pthread_exit((void *)(intptr_t)res);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
thrd_join(thrd_t thr, int *res)
|
||||||
|
{
|
||||||
|
void *value_ptr;
|
||||||
|
|
||||||
|
if (pthread_join(thr, &value_ptr) != 0)
|
||||||
|
return (thrd_error);
|
||||||
|
if (res != NULL)
|
||||||
|
*res = (intptr_t)value_ptr;
|
||||||
|
return (thrd_success);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
thrd_sleep(const struct timespec *duration, struct timespec *remaining)
|
||||||
|
{
|
||||||
|
#ifdef __CYGWIN__
|
||||||
|
/* Return value per POSIX:
|
||||||
|
0 on successful sleep,
|
||||||
|
-1 if a signal occurred,
|
||||||
|
other negative value if an error occurred. */
|
||||||
|
int ret = clock_nanosleep(CLOCK_REALTIME, 0, duration, remaining);
|
||||||
|
switch (ret) {
|
||||||
|
case 0:
|
||||||
|
return 0;
|
||||||
|
case EINTR:
|
||||||
|
return -1;
|
||||||
|
default:
|
||||||
|
return -ret; /* EPERM isn't generated by clock_nanosleep
|
||||||
|
so this is safe. */
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
int ret = nanosleep(duration, remaining);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
thrd_yield(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
pthread_yield();
|
||||||
|
}
|
|
@ -0,0 +1,73 @@
|
||||||
|
/*-
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011 Ed Schouten <ed@FreeBSD.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* $FreeBSD$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
|
#ifdef __CYGWIN__
|
||||||
|
#include <limits.h>
|
||||||
|
#endif
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
#include "threads.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
tss_create(tss_t *key, tss_dtor_t dtor)
|
||||||
|
{
|
||||||
|
if (pthread_key_create(key, dtor) != 0)
|
||||||
|
return (thrd_error);
|
||||||
|
return (thrd_success);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
tss_delete(tss_t key)
|
||||||
|
{
|
||||||
|
|
||||||
|
(void)pthread_key_delete(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
tss_get(tss_t key)
|
||||||
|
{
|
||||||
|
|
||||||
|
return (pthread_getspecific(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
tss_set(tss_t key, void *val)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (pthread_setspecific(key, val) != 0)
|
||||||
|
return (thrd_error);
|
||||||
|
return (thrd_success);
|
||||||
|
}
|
||||||
|
|
||||||
|
_Static_assert(TSS_DTOR_ITERATIONS == PTHREAD_DESTRUCTOR_ITERATIONS,
|
||||||
|
"TSS_DTOR_ITERATIONS must be identical to PTHREAD_DESTRUCTOR_ITERATIONS");
|
Loading…
Reference in New Issue