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:
parent
b1a7102d83
commit
407d933052
4 changed files with 13 additions and 7 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue