summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2012-05-22 22:43:27 -0400
committerRich Felker <dalias@aerifal.cx>2012-05-22 22:43:27 -0400
commit0c29adfe427ab6ed98cb73644f8f52a76045245c (patch)
tree5703af4273b5341688b84472cdcef2c63b5c84b0
parentaf3330d7648627816fbc82aa3247419e8a528230 (diff)
downloadmusl-0c29adfe427ab6ed98cb73644f8f52a76045245c.tar.gz
remove everything related to forkall
i made a best attempt, but the intended semantics of this function are fundamentally contradictory. there is no consistent way to handle ownership of locks when forking a multi-threaded process. the code could have worked by accident for programs that only used normal mutexes and nothing else (since they don't actually store or care about their owner), but that's about it. broken-by-design interfaces that aren't even in glibc (only solaris) don't belong in musl.
-rw-r--r--include/unistd.h1
-rw-r--r--src/internal/libc.h1
-rw-r--r--src/thread/forkall.c68
-rw-r--r--src/thread/synccall.c8
4 files changed, 0 insertions, 78 deletions
diff --git a/include/unistd.h b/include/unistd.h
index 693c54dc..e4e3ac59 100644
--- a/include/unistd.h
+++ b/include/unistd.h
@@ -168,7 +168,6 @@ char *getusershell(void);
#endif
#ifdef _GNU_SOURCE
-pid_t forkall(void);
int setresuid(uid_t, uid_t, uid_t);
int setresgid(gid_t, gid_t, gid_t);
int getresuid(uid_t *, uid_t *, uid_t *);
diff --git a/src/internal/libc.h b/src/internal/libc.h
index 78fca47f..0ec3691e 100644
--- a/src/internal/libc.h
+++ b/src/internal/libc.h
@@ -52,7 +52,6 @@ void __unlockfile(FILE *);
#define UNLOCK(x) (libc.threads_minus_1 ? (__unlock(x),1) : ((void)(x),1))
void __synccall(void (*)(void *), void *);
-void __synccall_wait(void);
int __setxid(int, int, int, int);
extern char **__environ;
diff --git a/src/thread/forkall.c b/src/thread/forkall.c
deleted file mode 100644
index 6810ea50..00000000
--- a/src/thread/forkall.c
+++ /dev/null
@@ -1,68 +0,0 @@
-#if 0
-#include "pthread_impl.h"
-#include <setjmp.h>
-
-struct thread {
- struct thread *next;
- pthread_t td;
- jmp_buf jb;
- void *tmp, *stack;
-};
-
-struct ctx {
- struct thread *list;
- pthread_t caller;
- pid_t pid;
- size_t cnt;
- pthread_barrier_t barrier;
-};
-
-static void restart_thread(pthread_t self)
-{
- struct thread *t = self->start_arg;
- self->start_arg = t->tmp;
- self->pid = getpid();
- longjmp(t->jb, 1);
-}
-
-static void do_forkall(void *p)
-{
- struct ctx *c = p, *volatile cv = c;
- char tmpstack[2048];
- struct thread *tp, t = {
- .td = __pthread_self(),
- .next = c->list,
- .stack = tmpstack+1024
- };
-
- if (t.td != c->caller) {
- c->cnt++;
- t.tmp = t.td->start_arg;
- t.td->start_arg = &t;
- if (setjmp(t.jb)) {
- c = cv;
- if (c->pid) return;
- pthread_barrier_wait(&c->barrier);
- return;
- }
- c->list = &t;
- __synccall_wait();
- return;
- }
- c->pid = syscall(SYS_fork);
- if (c->pid) return;
-
- pthread_barrier_init(&c->barrier, 0, c->cnt);
- for (tp=c->list; tp; tp=tp->next)
- if (__uniclone(tp->stack, restart_thread, tp->td) < 0)
- _exit(127);
- pthread_barrier_wait(&c->barrier);
-}
-
-pid_t forkall()
-{
- struct ctx c = { .caller = pthread_self() };
- __synccall(do_forkall, &c);
- return c.pid;
-}
-#endif
diff --git a/src/thread/synccall.c b/src/thread/synccall.c
index 2cd25e4b..1520b3b4 100644
--- a/src/thread/synccall.c
+++ b/src/thread/synccall.c
@@ -47,14 +47,6 @@ 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;