projects
/
musl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
pthread_create need not set errno
[musl]
/
src
/
thread
/
pthread_create.c
diff --git
a/src/thread/pthread_create.c
b/src/thread/pthread_create.c
index
d058a1a
..
284b45a
100644
(file)
--- a/
src/thread/pthread_create.c
+++ b/
src/thread/pthread_create.c
@@
-80,13
+80,12
@@
static void rsyscall_handler(int sig, siginfo_t *si, void *ctx)
{
struct pthread *self = __pthread_self();
{
struct pthread *self = __pthread_self();
- if (si->si_code > 0 || si->si_pid != self->pid ||
- rs.cnt == libc.threads_minus_1) return;
+ if (!rs.hold || rs.cnt == libc.threads_minus_1) return;
/* Threads which have already decremented themselves from the
* thread count must not increment rs.cnt or otherwise act. */
if (self->dead) {
/* Threads which have already decremented themselves from the
* thread count must not increment rs.cnt or otherwise act. */
if (self->dead) {
-
__wait(&rs.hold, 0, 1, 1
);
+
sigfillset(&((ucontext_t *)ctx)->uc_sigmask
);
return;
}
return;
}
@@
-118,9
+117,9
@@
static int rsyscall(int nr, long a, long b, long c, long d, long e, long f)
rs.arg[0] = a; rs.arg[1] = b;
rs.arg[2] = c; rs.arg[3] = d;
rs.arg[4] = d; rs.arg[5] = f;
rs.arg[0] = a; rs.arg[1] = b;
rs.arg[2] = c; rs.arg[3] = d;
rs.arg[4] = d; rs.arg[5] = f;
- rs.hold = 1;
rs.err = 0;
rs.cnt = 0;
rs.err = 0;
rs.cnt = 0;
+ rs.hold = 1;
/* Dispatch signals until all threads respond */
for (i=libc.threads_minus_1; i; i--)
/* Dispatch signals until all threads respond */
for (i=libc.threads_minus_1; i; i--)
@@
-152,13
+151,18
@@
static void init_threads()
libc.lockfile = __lockfile;
libc.cancelpt = cancelpt;
libc.rsyscall = rsyscall;
libc.lockfile = __lockfile;
libc.cancelpt = cancelpt;
libc.rsyscall = rsyscall;
+
+ sigfillset(&sa.sa_mask);
+ sa.sa_sigaction = rsyscall_handler;
+ __libc_sigaction(SIGSYSCALL, &sa, 0);
+
+ sigemptyset(&sa.sa_mask);
sa.sa_sigaction = cancel_handler;
__libc_sigaction(SIGCANCEL, &sa, 0);
sa.sa_sigaction = cancel_handler;
__libc_sigaction(SIGCANCEL, &sa, 0);
+
sigaddset(&sa.sa_mask, SIGSYSCALL);
sigaddset(&sa.sa_mask, SIGCANCEL);
sigaddset(&sa.sa_mask, SIGSYSCALL);
sigaddset(&sa.sa_mask, SIGCANCEL);
- sa.sa_sigaction = rsyscall_handler;
- __libc_sigaction(SIGSYSCALL, &sa, 0);
- sigprocmask(SIG_UNBLOCK, &sa.sa_mask, 0);
+ __libc_sigprocmask(SIG_UNBLOCK, &sa.sa_mask, 0);
}
static int start(void *p)
}
static int start(void *p)
@@
-191,7
+195,7
@@
int pthread_create(pthread_t *res, const pthread_attr_t *attr, void *(*entry)(vo
unsigned char *map, *stack, *tsd;
static const pthread_attr_t default_attr;
unsigned char *map, *stack, *tsd;
static const pthread_attr_t default_attr;
- if (!self) return
errno =
ENOSYS;
+ if (!self) return ENOSYS;
if (!init && ++init) init_threads();
if (!attr) attr = &default_attr;
if (!init && ++init) init_threads();
if (!attr) attr = &default_attr;