mirror of
https://github.com/fluencelabs/musl
synced 2025-06-19 18:01:43 +00:00
pthread and synccall cleanup, new __synccall_wait op
fix up clone signature to match the actual behavior. the new __syncall_wait function allows a __synccall callback to wait for other threads to continue without returning, so that it can resume action after the caller finishes. this interface could be made significantly more general/powerful with minimal effort, but i'll wait to do that until it's actually useful for something.
This commit is contained in:
@ -4,7 +4,7 @@
|
||||
static struct chain {
|
||||
struct chain *next;
|
||||
sem_t sem, sem2;
|
||||
} *head;
|
||||
} *head, *cur;
|
||||
|
||||
static void (*callback)(void *), *context;
|
||||
static int chainlen;
|
||||
@ -47,11 +47,19 @@ static void handler(int sig, siginfo_t *si, void *ctx)
|
||||
errno = old_errno;
|
||||
}
|
||||
|
||||
void __synccall_wait()
|
||||
{
|
||||
struct chain *ch = cur;
|
||||
sem_post(&ch->sem2);
|
||||
while (sem_wait(&ch->sem));
|
||||
sem_post(&ch->sem);
|
||||
}
|
||||
|
||||
void __synccall(void (*func)(void *), void *ctx)
|
||||
{
|
||||
pthread_t self;
|
||||
struct sigaction sa;
|
||||
struct chain *cur, *next;
|
||||
struct chain *next;
|
||||
uint64_t oldmask;
|
||||
|
||||
if (!libc.threads_minus_1) {
|
||||
|
Reference in New Issue
Block a user