-static int rsyscall(int nr, long a, long b, long c, long d, long e, long f)
-{
- int i, ret;
- sigset_t set = { 0 };
- struct pthread *self = __pthread_self();
- sigaddset(&set, SIGSYSCALL);
-
- LOCK(&rs.lock);
- while ((i=rs.blocks))
- __wait(&rs.blocks, 0, i, 1);
-
- __libc_sigprocmask(SIG_BLOCK, &set, 0);
-
- rs.nr = nr;
- 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;
-
- /* Dispatch signals until all threads respond */
- for (i=libc.threads_minus_1; i; i--)
- sigqueue(self->pid, SIGSYSCALL, (union sigval){0});
- while ((i=rs.cnt) < libc.threads_minus_1) {
- sigqueue(self->pid, SIGSYSCALL, (union sigval){0});
- __wait(&rs.cnt, 0, i, 1);
- }
+ /* Mark this thread dead before decrementing count */
+ __lock(self->killlock);
+ self->dead = 1;
+ __unlock(self->killlock);