mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-26 06:50:07 +00:00
ce7528f637
This patch adds the thrd_* definitions from C11 threads (ISO/IEC 9899:2011), more specifically thrd_create, thrd_curent, rhd_detach, thrd_equal, thrd_exit, thrd_join, thrd_sleep, thrd_yield, and required types. Mostly of the definitions are composed based on POSIX conterparts, such as thrd_t (using pthread_t). For thrd_* function internally direct POSIX pthread call are used with the exceptions: 1. thrd_start uses pthread_create internal implementation, but changes how to actually calls the start routine. This is due the difference in signature between POSIX and C11, where former return a 'void *' and latter 'int'. To avoid calling convention issues due 'void *' to int cast, routines from C11 threads are started slight different than default pthread one. Explicit cast to expected return are used internally on pthread_create and the result is stored back to void also with an explicit cast. 2. thrd_sleep uses nanosleep internal direct syscall to avoid clobbering errno and to handle expected standard return codes. It is a cancellation entrypoint to be consistent with both thrd_join and cnd_{timed}wait. 3. thrd_yield also uses internal direct syscall to avoid errno clobbering. Checked with a build for all major ABI (aarch64-linux-gnu, alpha-linux-gnu, arm-linux-gnueabi, i386-linux-gnu, ia64-linux-gnu, m68k-linux-gnu, microblaze-linux-gnu [1], mips{64}-linux-gnu, nios2-linux-gnu, powerpc{64le}-linux-gnu, s390{x}-linux-gnu, sparc{64}-linux-gnu, and x86_64-linux-gnu). Also ran a full check on aarch64-linux-gnu, x86_64-linux-gnu, i686-linux-gnu, arm-linux-gnueabhf, and powerpc64le-linux-gnu. [BZ #14092] * conform/Makefile (conformtest-headers-ISO11): Add threads.h. (linknamespace-libs-ISO11): Add libpthread.a. * conform/data/threads.h-data: New file: add C11 thrd_* types and functions. * include/stdc-predef.h (__STDC_NO_THREADS__): Remove definition. * nptl/Makefile (headers): Add threads.h. (libpthread-routines): Add new C11 thread thrd_create, thrd_current, thrd_detach, thrd_equal, thrd_exit, thrd_join, thrd_sleep, and thrd_yield. * nptl/Versions (libpthread) [GLIBC_2.28]): Add new C11 thread thrd_create, thrd_current, thrd_detach, thrd_equal, thrd_exit, thrd_join, thrd_sleep, and thrd_yield symbols. * nptl/descr.h (struct pthread): Add c11 field. * nptl/pthreadP.h (ATTR_C11_THREAD): New define. * nptl/pthread_create.c (START_THREAD_DEFN): Call C11 thread start routine with expected function prototype. (__pthread_create_2_1): Add C11 threads check based on attribute value. * sysdeps/unix/sysdep.h (INTERNAL_SYSCALL_CANCEL): New macro. * nptl/thrd_create.c: New file. * nptl/thrd_current.c: Likewise. * nptl/thrd_detach.c: Likewise. * nptl/thrd_equal.c: Likewise. * nptl/thrd_exit.c: Likewise. * nptl/thrd_join.c: Likewise. * nptl/thrd_priv.h: Likewise. * nptl/thrd_sleep.c: Likewise. * nptl/thrd_yield.c: Likewise. * include/threads.h: Likewise.
91 lines
2.9 KiB
C
91 lines
2.9 KiB
C
/* ISO C11 Standard: 7.26 - Thread support library <threads.h>.
|
|
Copyright (C) 2018 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the GNU C Library; if not, see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef _THREADS_H
|
|
#define _THREADS_H 1
|
|
|
|
#include <features.h>
|
|
#include <time.h>
|
|
|
|
__BEGIN_DECLS
|
|
|
|
#include <bits/types/struct_timespec.h>
|
|
|
|
typedef unsigned long int thrd_t;
|
|
typedef int (*thrd_start_t) (void*);
|
|
|
|
/* Exit and error codes. */
|
|
enum
|
|
{
|
|
thrd_success = 0,
|
|
thrd_busy = 1,
|
|
thrd_error = 2,
|
|
thrd_nomem = 3,
|
|
thrd_timedout = 4
|
|
};
|
|
|
|
/* Threads functions. */
|
|
|
|
/* Create a new thread executing the function __FUNC. Arguments for __FUNC
|
|
are passed through __ARG. If succesful, __THR is set to new thread
|
|
identifier. */
|
|
extern int thrd_create (thrd_t *__thr, thrd_start_t __func, void *__arg);
|
|
|
|
/* Check if __LHS and __RHS point to the same thread. */
|
|
extern int thrd_equal (thrd_t __lhs, thrd_t __rhs);
|
|
|
|
/* Return current thread identifier. */
|
|
extern thrd_t thrd_current (void);
|
|
|
|
/* Block current thread execution for at least the time pointed by
|
|
__TIME_POINT. The current thread may resume if receives a signal. In
|
|
that case, if __REMAINING is not NULL, the remaining time is stored in
|
|
the object pointed by it. */
|
|
extern int thrd_sleep (const struct timespec *__time_point,
|
|
struct timespec *__remaining);
|
|
|
|
/* Terminate current thread execution, cleaning up any thread local
|
|
storage and freeing resources. Returns the value specified in __RES. */
|
|
extern void thrd_exit (int __res) __attribute__ ((__noreturn__));
|
|
|
|
/* Detach the thread identified by __THR from the current environment
|
|
(it does not allow join or wait for it). */
|
|
extern int thrd_detach (thrd_t __thr);
|
|
|
|
/* Block current thread until execution of __THR is complete. In case that
|
|
__RES is not NULL, will store the return value of __THR when exiting. */
|
|
extern int thrd_join (thrd_t __thr, int *__res);
|
|
|
|
/* Stop current thread execution and call the scheduler to decide which
|
|
thread should execute next. The current thread may be selected by the
|
|
scheduler to keep running. */
|
|
extern void thrd_yield (void);
|
|
|
|
#ifdef __USE_EXTERN_INLINES
|
|
/* Optimizations. */
|
|
__extern_inline int
|
|
thrd_equal (thrd_t __thread1, thrd_t __thread2)
|
|
{
|
|
return __thread1 == __thread2;
|
|
}
|
|
#endif
|
|
|
|
__END_DECLS
|
|
|
|
#endif /* _THREADS_H */
|