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:=
|
||||
#
|
||||
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:= \
|
||||
acoshl.o \
|
||||
acosl.o \
|
||||
|
@ -251,11 +277,8 @@ TZCODE_OFILES:=localtime.o
|
|||
DLL_OFILES:= \
|
||||
advapi32.o \
|
||||
aio.o \
|
||||
arc4random_stir.o \
|
||||
assert.o \
|
||||
autoload.o \
|
||||
base64.o \
|
||||
bsdlib.o \
|
||||
clock.o \
|
||||
ctype.o \
|
||||
cxx.o \
|
||||
|
@ -313,21 +336,14 @@ DLL_OFILES:= \
|
|||
fhandler_windows.o \
|
||||
fhandler_zero.o \
|
||||
flock.o \
|
||||
fnmatch.o \
|
||||
fork.o \
|
||||
forkable.o \
|
||||
fts.o \
|
||||
ftw.o \
|
||||
getentropy.o \
|
||||
getopt.o \
|
||||
glob.o \
|
||||
glob_pattern_p.o \
|
||||
globals.o \
|
||||
grp.o \
|
||||
heap.o \
|
||||
hookapi.o \
|
||||
inet_addr.o \
|
||||
inet_network.o \
|
||||
init.o \
|
||||
ioctl.o \
|
||||
ipc.o \
|
||||
|
@ -337,19 +353,15 @@ DLL_OFILES:= \
|
|||
loadavg.o \
|
||||
lsearch.o \
|
||||
malloc_wrapper.o \
|
||||
minires-os-if.o \
|
||||
minires.o \
|
||||
miscfuncs.o \
|
||||
mktemp.o \
|
||||
mmap.o \
|
||||
mmap_alloc.o \
|
||||
msg.o \
|
||||
msgcat.o \
|
||||
mount.o \
|
||||
net.o \
|
||||
netdb.o \
|
||||
nfs.o \
|
||||
nftw.o \
|
||||
nlsfuncs.o \
|
||||
ntea.o \
|
||||
passwd.o \
|
||||
|
@ -368,8 +380,6 @@ DLL_OFILES:= \
|
|||
regfree.o \
|
||||
registry.o \
|
||||
resource.o \
|
||||
rexec.o \
|
||||
rcmd.o \
|
||||
scandir.o \
|
||||
sched.o \
|
||||
sec_acl.o \
|
||||
|
@ -388,9 +398,7 @@ DLL_OFILES:= \
|
|||
smallprint.o \
|
||||
spawn.o \
|
||||
strace.o \
|
||||
strfmon.o \
|
||||
strfuncs.o \
|
||||
strptime.o \
|
||||
strsep.o \
|
||||
strsig.o \
|
||||
sync.o \
|
||||
|
@ -409,9 +417,9 @@ DLL_OFILES:= \
|
|||
wincap.o \
|
||||
window.o \
|
||||
winf.o \
|
||||
xsique.o \
|
||||
$(EXTRA_OFILES) \
|
||||
$(MALLOC_OFILES) \
|
||||
$(LIBC_OFILES) \
|
||||
$(MATH_OFILES) \
|
||||
$(TZCODE_OFILES) \
|
||||
$(MT_SAFE_OBJECTS)
|
||||
|
|
|
@ -38,7 +38,6 @@ sys_sigabbrev DATA
|
|||
sys_siglist DATA
|
||||
|
||||
# Exported functions
|
||||
_Exit SIGFE
|
||||
__assert NOSIGFE
|
||||
__assert_func NOSIGFE
|
||||
__assertfail NOSIGFE
|
||||
|
@ -126,6 +125,7 @@ __xdrrec_getrec SIGFE
|
|||
__xdrrec_setnonblock SIGFE
|
||||
__xpg_sigpause SIGFE
|
||||
__xpg_strerror_r SIGFE
|
||||
_Exit SIGFE
|
||||
_exit SIGFE
|
||||
_feinitialise NOSIGFE
|
||||
_fscanf_r SIGFE
|
||||
|
@ -233,6 +233,7 @@ asinhl NOSIGFE
|
|||
asinl NOSIGFE
|
||||
asnprintf SIGFE
|
||||
asprintf SIGFE
|
||||
at_quick_exit SIGFE
|
||||
atan NOSIGFE
|
||||
atan2 NOSIGFE
|
||||
atan2f NOSIGFE
|
||||
|
@ -248,7 +249,6 @@ atoff SIGFE
|
|||
atoi NOSIGFE
|
||||
atol NOSIGFE
|
||||
atoll NOSIGFE
|
||||
at_quick_exit SIGFE
|
||||
basename NOSIGFE
|
||||
bcmp NOSIGFE
|
||||
bcopy NOSIGFE
|
||||
|
@ -267,6 +267,7 @@ cacosh NOSIGFE
|
|||
cacoshf NOSIGFE
|
||||
cacoshl NOSIGFE
|
||||
cacosl NOSIGFE
|
||||
call_once SIGFE
|
||||
calloc SIGFE
|
||||
canonicalize_file_name SIGFE
|
||||
carg NOSIGFE
|
||||
|
@ -335,6 +336,12 @@ clogl NOSIGFE
|
|||
close SIGFE
|
||||
closedir SIGFE
|
||||
closelog SIGFE
|
||||
cnd_broadcast SIGFE
|
||||
cnd_destroy SIGFE
|
||||
cnd_init SIGFE
|
||||
cnd_signal SIGFE
|
||||
cnd_timedwait SIGFE
|
||||
cnd_wait SIGFE
|
||||
confstr NOSIGFE
|
||||
conj NOSIGFE
|
||||
conjf NOSIGFE
|
||||
|
@ -635,8 +642,6 @@ gammaf NOSIGFE
|
|||
gammaf_r NOSIGFE
|
||||
gcvt SIGFE
|
||||
gcvtf SIGFE
|
||||
GetCommandLineA@0 = cygwin_GetCommandLineA@0 NOSIGFE
|
||||
GetCommandLineW@0 = cygwin_GetCommandLineW@0 NOSIGFE
|
||||
get_avphys_pages SIGFE
|
||||
get_current_dir_name SIGFE
|
||||
get_nprocs SIGFE
|
||||
|
@ -647,6 +652,8 @@ getc SIGFE
|
|||
getc_unlocked SIGFE
|
||||
getchar SIGFE
|
||||
getchar_unlocked SIGFE
|
||||
GetCommandLineA@0 = cygwin_GetCommandLineA@0 NOSIGFE
|
||||
GetCommandLineW@0 = cygwin_GetCommandLineW@0 NOSIGFE
|
||||
getcontext NOSIGFE
|
||||
getcwd SIGFE
|
||||
getdelim = __getdelim SIGFE
|
||||
|
@ -891,9 +898,9 @@ logb NOSIGFE
|
|||
logbf NOSIGFE
|
||||
logbl NOSIGFE
|
||||
logf NOSIGFE
|
||||
logl NOSIGFE
|
||||
login SIGFE
|
||||
login_tty SIGFE
|
||||
logl NOSIGFE
|
||||
logout SIGFE
|
||||
logwtmp SIGFE
|
||||
longjmp NOSIGFE
|
||||
|
@ -972,6 +979,12 @@ msgget SIGFE
|
|||
msgrcv SIGFE
|
||||
msgsnd SIGFE
|
||||
msync SIGFE
|
||||
mtx_destroy SIGFE
|
||||
mtx_init SIGFE
|
||||
mtx_lock SIGFE
|
||||
mtx_timedlock SIGFE
|
||||
mtx_trylock SIGFE
|
||||
mtx_unlock SIGFE
|
||||
munlock SIGFE
|
||||
munmap SIGFE
|
||||
nan NOSIGFE
|
||||
|
@ -1017,14 +1030,19 @@ posix_madvise SIGFE
|
|||
posix_memalign SIGFE
|
||||
posix_openpt 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_init SIGFE
|
||||
posix_spawnattr_getflags NOSIGFE
|
||||
posix_spawnattr_getpgroup NOSIGFE
|
||||
posix_spawnattr_getschedparam NOSIGFE
|
||||
posix_spawnattr_getschedpolicy NOSIGFE
|
||||
posix_spawnattr_getsigdefault NOSIGFE
|
||||
posix_spawnattr_getsigmask NOSIGFE
|
||||
posix_spawnattr_init SIGFE
|
||||
posix_spawnattr_setflags NOSIGFE
|
||||
posix_spawnattr_setpgroup NOSIGFE
|
||||
posix_spawnattr_setschedparam NOSIGFE
|
||||
|
@ -1032,11 +1050,6 @@ posix_spawnattr_setschedpolicy NOSIGFE
|
|||
posix_spawnattr_setsigdefault NOSIGFE
|
||||
posix_spawnattr_setsigmask NOSIGFE
|
||||
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
|
||||
pow10 NOSIGFE
|
||||
pow10f NOSIGFE
|
||||
|
@ -1070,13 +1083,13 @@ pthread_attr_setscope SIGFE
|
|||
pthread_attr_setstack SIGFE
|
||||
pthread_attr_setstackaddr 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_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_cond_broadcast SIGFE
|
||||
pthread_cond_destroy SIGFE
|
||||
|
@ -1176,9 +1189,9 @@ putwc_unlocked SIGFE
|
|||
putwchar SIGFE
|
||||
putwchar_unlocked SIGFE
|
||||
pwrite SIGFE
|
||||
quick_exit SIGFE
|
||||
qsort NOSIGFE
|
||||
qsort_r NOSIGFE
|
||||
quick_exit SIGFE
|
||||
quotactl SIGFE
|
||||
raise SIGFE
|
||||
rand NOSIGFE
|
||||
|
@ -1293,7 +1306,6 @@ sendto = cygwin_sendto SIGFE
|
|||
setbuf SIGFE
|
||||
setbuffer SIGFE
|
||||
setcontext NOSIGFE
|
||||
sethostname SIGFE
|
||||
setdtablesize SIGFE
|
||||
setegid SIGFE
|
||||
setenv SIGFE
|
||||
|
@ -1302,6 +1314,7 @@ setgid SIGFE
|
|||
setgrent NOSIGFE
|
||||
setgroups SIGFE
|
||||
sethostent NOSIGFE
|
||||
sethostname SIGFE
|
||||
setitimer SIGFE
|
||||
setjmp NOSIGFE
|
||||
setlinebuf SIGFE
|
||||
|
@ -1495,6 +1508,14 @@ tfind NOSIGFE
|
|||
tgamma NOSIGFE
|
||||
tgammaf 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
|
||||
timegm NOSIGFE
|
||||
timelocal SIGFE
|
||||
|
@ -1529,6 +1550,10 @@ truncate SIGFE
|
|||
truncf NOSIGFE
|
||||
truncl NOSIGFE
|
||||
tsearch SIGFE
|
||||
tss_create SIGFE
|
||||
tss_delete SIGFE
|
||||
tss_get SIGFE
|
||||
tss_set SIGFE
|
||||
ttyname SIGFE
|
||||
ttyname_r SIGFE
|
||||
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