39c103cdc48382fdb907b5c2d26cec7a869e283c
[kopensolaris-gnu/glibc.git] / linuxthreads / manager.c
1 /* Linuxthreads - a simple clone()-based implementation of Posix        */
2 /* threads for Linux.                                                   */
3 /* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr)              */
4 /*                                                                      */
5 /* This program is free software; you can redistribute it and/or        */
6 /* modify it under the terms of the GNU Library General Public License  */
7 /* as published by the Free Software Foundation; either version 2       */
8 /* of the License, or (at your option) any later version.               */
9 /*                                                                      */
10 /* This program is distributed in the hope that it will be useful,      */
11 /* but WITHOUT ANY WARRANTY; without even the implied warranty of       */
12 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        */
13 /* GNU Library General Public License for more details.                 */
14
15 /* The "thread manager" thread: manages creation and termination of threads */
16
17 #include <errno.h>
18 #include <sched.h>
19 #include <stddef.h>
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include <unistd.h>
24 #include <sys/poll.h>           /* for poll */
25 #include <sys/mman.h>           /* for mmap */
26 #include <sys/time.h>
27 #include <sys/wait.h>           /* for waitpid macros */
28 #include <linux/tasks.h>
29
30 #include "pthread.h"
31 #include "internals.h"
32 #include "spinlock.h"
33 #include "restart.h"
34 #include "semaphore.h"
35
36 /* Array of active threads. Entry 0 is reserved for the initial thread. */
37 struct pthread_handle_struct __pthread_handles[PTHREAD_THREADS_MAX] =
38 { { LOCK_INITIALIZER, &__pthread_initial_thread, 0}, /* All NULLs */ };
39
40 /* This is a list of terminated, but not detached threads.  This can happen
41    when pthread_join() is called and the pthread_reap_children() function
42    removes the thread from the live list before processing the FREE_REQ
43    request.  */
44 static pthread_descr non_detached;
45
46 /* Indicate whether at least one thread has a user-defined stack (if 1),
47    or if all threads have stacks supplied by LinuxThreads (if 0). */
48 int __pthread_nonstandard_stacks = 0;
49
50 /* Number of active entries in __pthread_handles (used by gdb) */
51 volatile int __pthread_handles_num = 1;
52
53 /* Whether to use debugger additional actions for thread creation
54    (set to 1 by gdb) */
55 volatile int __pthread_threads_debug = 0;
56
57 /* Mapping from stack segment to thread descriptor. */
58 /* Stack segment numbers are also indices into the __pthread_handles array. */
59 /* Stack segment number 0 is reserved for the initial thread. */
60
61 static inline pthread_descr thread_segment(int seg)
62 {
63   return (pthread_descr)(THREAD_STACK_START_ADDRESS - (seg - 1) * STACK_SIZE)
64          - 1;
65 }
66
67 /* Flag set in signal handler to record child termination */
68
69 static volatile int terminated_children = 0;
70
71 /* Flag set when the initial thread is blocked on pthread_exit waiting
72    for all other threads to terminate */
73
74 static int main_thread_exiting = 0;
75
76 /* Counter used to generate unique thread identifier.
77    Thread identifier is pthread_threads_counter + segment. */
78
79 static pthread_t pthread_threads_counter = 0;
80
81 /* Forward declarations */
82
83 static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
84                                  void * (*start_routine)(void *), void *arg,
85                                  sigset_t *mask, int father_pid);
86 static void pthread_handle_free(pthread_descr th);
87 static void pthread_handle_exit(pthread_descr issuing_thread, int exitcode);
88 static void pthread_reap_children(void);
89 static void pthread_kill_all_threads(int sig, int main_thread_also);
90
91 /* The server thread managing requests for thread creation and termination */
92
93 int __pthread_manager(void *arg)
94 {
95   int reqfd = (int)arg;
96   struct pollfd ufd;
97   sigset_t mask;
98   int n;
99   struct pthread_request request;
100
101   /* If we have special thread_self processing, initialize it.  */
102 #ifdef INIT_THREAD_SELF
103   INIT_THREAD_SELF(&__pthread_manager_thread);
104 #endif
105   /* Set the error variable.  */
106   __pthread_manager_thread.p_errnop = &__pthread_manager_thread.p_errno;
107   __pthread_manager_thread.p_h_errnop = &__pthread_manager_thread.p_h_errno;
108   /* Block all signals except PTHREAD_SIG_RESTART, PTHREAD_SIG_CANCEL
109      and SIGTRAP */
110   sigfillset(&mask);
111   sigdelset(&mask, PTHREAD_SIG_RESTART);
112   sigdelset(&mask, PTHREAD_SIG_CANCEL); /* for debugging new threads */
113   sigdelset(&mask, SIGTRAP);            /* for debugging purposes */
114   sigprocmask(SIG_SETMASK, &mask, NULL);
115   /* Raise our priority to match that of main thread */
116   __pthread_manager_adjust_prio(__pthread_main_thread->p_priority);
117   /* Synchronize debugging of the thread manager */
118   n = __libc_read(reqfd, (char *)&request, sizeof(request));
119   ASSERT(n == sizeof(request) && request.req_kind == REQ_DEBUG);
120   ufd.fd = reqfd;
121   ufd.events = POLLIN;
122   /* Enter server loop */
123   while(1) {
124     n = __poll(&ufd, 1, 2000);
125
126     /* Check for termination of the main thread */
127     if (getppid() == 1) {
128       pthread_kill_all_threads(SIGKILL, 0);
129       _exit(0);
130     }
131     /* Check for dead children */
132     if (terminated_children) {
133       terminated_children = 0;
134       pthread_reap_children();
135     }
136     /* Read and execute request */
137     if (n == 1 && (ufd.revents & POLLIN)) {
138       n = __libc_read(reqfd, (char *)&request, sizeof(request));
139       ASSERT(n == sizeof(request));
140       switch(request.req_kind) {
141       case REQ_CREATE:
142         request.req_thread->p_retcode =
143           pthread_handle_create((pthread_t *) &request.req_thread->p_retval,
144                                 request.req_args.create.attr,
145                                 request.req_args.create.fn,
146                                 request.req_args.create.arg,
147                                 &request.req_args.create.mask,
148                                 request.req_thread->p_pid);
149         restart(request.req_thread);
150         break;
151       case REQ_FREE:
152         pthread_handle_free(request.req_args.free.thread);
153         break;
154       case REQ_PROCESS_EXIT:
155         pthread_handle_exit(request.req_thread,
156                             request.req_args.exit.code);
157         break;
158       case REQ_MAIN_THREAD_EXIT:
159         main_thread_exiting = 1;
160         if (__pthread_main_thread->p_nextlive == __pthread_main_thread) {
161           restart(__pthread_main_thread);
162           return 0;
163         }
164         break;
165       case REQ_POST:
166         sem_post(request.req_args.post);
167         break;
168       case REQ_DEBUG:
169         /* Make gdb aware of new thread */
170         if (__pthread_threads_debug) raise(PTHREAD_SIG_CANCEL);
171         restart(request.req_thread);
172         break;
173       }
174     }
175   }
176 }
177
178 /* Process creation */
179
180 static int pthread_start_thread(void *arg)
181 {
182   pthread_descr self = (pthread_descr) arg;
183   struct pthread_request request;
184   void * outcome;
185   /* Initialize special thread_self processing, if any.  */
186 #ifdef INIT_THREAD_SELF
187   INIT_THREAD_SELF(self);
188 #endif
189   /* Make sure our pid field is initialized, just in case we get there
190      before our father has initialized it. */
191   self->p_pid = __getpid();
192   /* Initial signal mask is that of the creating thread. (Otherwise,
193      we'd just inherit the mask of the thread manager.) */
194   sigprocmask(SIG_SETMASK, &self->p_start_args.mask, NULL);
195   /* Set the scheduling policy and priority for the new thread, if needed */
196   if (self->p_start_args.schedpolicy >= 0)
197     __sched_setscheduler(self->p_pid, self->p_start_args.schedpolicy,
198                          &self->p_start_args.schedparam);
199   /* Make gdb aware of new thread */
200   if (__pthread_threads_debug) {
201     request.req_thread = self;
202     request.req_kind = REQ_DEBUG;
203     __libc_write(__pthread_manager_request,
204                  (char *) &request, sizeof(request));
205     suspend(self);
206   }
207   /* Run the thread code */
208   outcome = self->p_start_args.start_routine(self->p_start_args.arg);
209   /* Exit with the given return value */
210   pthread_exit(outcome);
211   return 0;
212 }
213
214 static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
215                                  void * (*start_routine)(void *), void *arg,
216                                  sigset_t * mask, int father_pid)
217 {
218   size_t sseg;
219   int pid;
220   pthread_descr new_thread;
221   char * new_thread_bottom;
222   pthread_t new_thread_id;
223   void *guardaddr = NULL;
224   size_t guardsize = 0;
225
226   /* Find a free stack segment for the current stack */
227   for (sseg = 1; ; sseg++)
228     {
229       if (sseg >= PTHREAD_THREADS_MAX)
230         return EAGAIN;
231       if (__pthread_handles[sseg].h_descr != NULL)
232         continue;
233
234       if (attr == NULL || !attr->stackaddr_set)
235         {
236           new_thread = thread_segment(sseg);
237           new_thread_bottom = (char *) new_thread - STACK_SIZE;
238           /* Allocate space for stack and thread descriptor. */
239           if (mmap((caddr_t)((char *)(new_thread+1) - INITIAL_STACK_SIZE),
240                    INITIAL_STACK_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC,
241                    MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED | MAP_GROWSDOWN,
242                    -1, 0) != MAP_FAILED)
243             {
244               /* We manage to get a stack.  Now see whether we need a guard
245                  and allocate it if necessary.  */
246               if (attr == NULL || attr->guardsize != 0)
247                 {
248                   guardsize = attr ? attr->guardsize : __getpagesize ();
249                   guardaddr = mmap ((caddr_t)((char *)(new_thread+1)
250                                               - STACK_SIZE),
251                                     guardsize, 0, MAP_FIXED, -1, 0);
252                   if (guardaddr == MAP_FAILED)
253                     {
254                       /* We don't make this an error.  */
255                       guardaddr = NULL;
256                       guardsize = 0;
257                     }
258                 }
259               break;
260             }
261           /* It seems part of this segment is already mapped. Try the next. */
262         }
263       else
264         {
265           new_thread = (pthread_descr) ((long) attr->stackaddr
266                                         & -sizeof(void *)) - 1;
267           new_thread_bottom = (char *) attr->stackaddr - attr->stacksize;
268           break;
269         }
270     }
271   /* Allocate new thread identifier */
272   pthread_threads_counter += PTHREAD_THREADS_MAX;
273   new_thread_id = sseg + pthread_threads_counter;
274   /* Initialize the thread descriptor */
275   new_thread->p_nextwaiting = NULL;
276   new_thread->p_tid = new_thread_id;
277   new_thread->p_priority = 0;
278   new_thread->p_lock = &(__pthread_handles[sseg].h_lock);
279   new_thread->p_signal = 0;
280   new_thread->p_signal_jmp = NULL;
281   new_thread->p_cancel_jmp = NULL;
282   new_thread->p_terminated = 0;
283   new_thread->p_detached = attr == NULL ? 0 : attr->detachstate;
284   new_thread->p_exited = 0;
285   new_thread->p_retval = NULL;
286   new_thread->p_joining = NULL;
287   new_thread->p_cleanup = NULL;
288   new_thread->p_cancelstate = PTHREAD_CANCEL_ENABLE;
289   new_thread->p_canceltype = PTHREAD_CANCEL_DEFERRED;
290   new_thread->p_canceled = 0;
291   new_thread->p_errnop = &new_thread->p_errno;
292   new_thread->p_errno = 0;
293   new_thread->p_h_errnop = &new_thread->p_h_errno;
294   new_thread->p_h_errno = 0;
295   new_thread->p_in_sighandler = NULL;
296   new_thread->p_sigwaiting = 0;
297   new_thread->p_guardaddr = guardaddr;
298   new_thread->p_guardsize = guardsize;
299   new_thread->p_userstack = attr != NULL && attr->stackaddr_set;
300   memset (new_thread->p_specific, '\0',
301           PTHREAD_KEY_1STLEVEL_SIZE * sizeof (new_thread->p_specific[0]));
302   /* Initialize the thread handle */
303   __pthread_init_lock(&__pthread_handles[sseg].h_lock);
304   __pthread_handles[sseg].h_descr = new_thread;
305   __pthread_handles[sseg].h_bottom = new_thread_bottom;
306   /* Determine scheduling parameters for the thread */
307   new_thread->p_start_args.schedpolicy = -1;
308   if (attr != NULL) {
309     switch(attr->inheritsched) {
310     case PTHREAD_EXPLICIT_SCHED:
311       new_thread->p_start_args.schedpolicy = attr->schedpolicy;
312       new_thread->p_start_args.schedparam = attr->schedparam;
313       break;
314     case PTHREAD_INHERIT_SCHED:
315       /* schedpolicy doesn't need to be set, only get priority */
316       __sched_getparam(father_pid, &new_thread->p_start_args.schedparam);
317       break;
318     }
319     new_thread->p_priority =
320       new_thread->p_start_args.schedparam.sched_priority;
321   }
322   /* Finish setting up arguments to pthread_start_thread */
323   new_thread->p_start_args.start_routine = start_routine;
324   new_thread->p_start_args.arg = arg;
325   new_thread->p_start_args.mask = *mask;
326   /* Raise priority of thread manager if needed */
327   __pthread_manager_adjust_prio(new_thread->p_priority);
328   /* Do the cloning */
329   pid = __clone(pthread_start_thread, (void **) new_thread,
330                 CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
331                 PTHREAD_SIG_RESTART,
332                 new_thread);
333   /* Check if cloning succeeded */
334   if (pid == -1) {
335     /* Free the stack if we allocated it */
336     if (attr == NULL || !attr->stackaddr_set)
337       {
338         munmap((caddr_t)((char *)(new_thread+1) - INITIAL_STACK_SIZE),
339                INITIAL_STACK_SIZE);
340         if (new_thread->p_guardsize != 0)
341           munmap(new_thread->p_guardaddr, new_thread->p_guardsize);
342       }
343     __pthread_handles[sseg].h_descr = NULL;
344     __pthread_handles[sseg].h_bottom = NULL;
345     __pthread_handles_num--;
346     return errno;
347   }
348   /* Insert new thread in doubly linked list of active threads */
349   new_thread->p_prevlive = __pthread_main_thread;
350   new_thread->p_nextlive = __pthread_main_thread->p_nextlive;
351   __pthread_main_thread->p_nextlive->p_prevlive = new_thread;
352   __pthread_main_thread->p_nextlive = new_thread;
353   /* Set pid field of the new thread, in case we get there before the
354      child starts. */
355   new_thread->p_pid = pid;
356   /* We're all set */
357   *thread = new_thread_id;
358   return 0;
359 }
360
361
362 /* Try to free the resources of a thread when requested by pthread_join
363    or pthread_detach on a terminated thread. */
364
365 static void pthread_free(pthread_descr th)
366 {
367   pthread_handle handle;
368   ASSERT(th->p_exited);
369   /* Make the handle invalid */
370   handle =  thread_handle(th->p_tid);
371   __pthread_lock(&handle->h_lock);
372   handle->h_descr = NULL;
373   handle->h_bottom = (char *)(-1L);
374   __pthread_unlock(&handle->h_lock);
375   /* One fewer threads in __pthread_handles */
376   __pthread_handles_num--;
377   /* If initial thread, nothing to free */
378   if (th == &__pthread_initial_thread) return;
379   if (!th->p_userstack)
380     {
381       /* Free the stack and thread descriptor area */
382       if (th->p_guardsize != 0)
383         munmap(th->p_guardaddr, th->p_guardsize);
384       munmap((caddr_t) ((char *)(th+1) - STACK_SIZE), STACK_SIZE);
385     }
386 }
387
388 /* Handle threads that have exited */
389
390 static void pthread_exited(pid_t pid)
391 {
392   pthread_descr th;
393   int detached;
394   /* Find thread with that pid */
395   for (th = __pthread_main_thread->p_nextlive;
396        th != __pthread_main_thread;
397        th = th->p_nextlive) {
398     if (th->p_pid == pid) {
399       /* Remove thread from list of active threads */
400       th->p_nextlive->p_prevlive = th->p_prevlive;
401       th->p_prevlive->p_nextlive = th->p_nextlive;
402       /* Mark thread as exited, and if detached, free its resources */
403       __pthread_lock(th->p_lock);
404       th->p_exited = 1;
405       detached = th->p_detached;
406       __pthread_unlock(th->p_lock);
407       if (detached)
408         pthread_free(th);
409       else {
410         /* Enqueue in the detached list.  */
411         th->p_nextlive = non_detached;
412         if (non_detached != NULL)
413           non_detached->p_prevlive = th;
414         th->p_prevlive = NULL;
415         non_detached = th;
416       }
417       break;
418     }
419   }
420   /* If all threads have exited and the main thread is pending on a
421      pthread_exit, wake up the main thread and terminate ourselves. */
422   if (main_thread_exiting &&
423       __pthread_main_thread->p_nextlive == __pthread_main_thread) {
424     restart(__pthread_main_thread);
425     _exit(0);
426   }
427 }
428
429 static void pthread_reap_children(void)
430 {
431   pid_t pid;
432   int status;
433
434   while ((pid = __libc_waitpid(-1, &status, WNOHANG | __WCLONE)) > 0) {
435     pthread_exited(pid);
436     if (WIFSIGNALED(status)) {
437       /* If a thread died due to a signal, send the same signal to
438          all other threads, including the main thread. */
439       pthread_kill_all_threads(WTERMSIG(status), 1);
440       _exit(0);
441     }
442   }
443 }
444
445 /* Try to free the resources of a thread when requested by pthread_join
446    or pthread_detach on a terminated thread. */
447
448 static void pthread_handle_free(pthread_descr th)
449 {
450   pthread_descr t;
451   /* Check that the thread th is still there -- pthread_reap_children
452      might have deallocated it already */
453   t = __pthread_main_thread;
454   do {
455     if (t == th) break;
456     t = t->p_nextlive;
457   } while (t != __pthread_main_thread);
458   if (t != th) {
459     /* Hum, it might be that the thread already was dequeued but
460        wasn't detached.  In the case the thread is already detached
461        and we cannot find it this is a user bug but we must be
462        gracious.  */
463     t = non_detached;
464     while (t != NULL) {
465       if (t == th) break;
466       t = t->p_nextlive;
467     }
468     if (t == th) {
469       if (th->p_prevlive == NULL)
470         non_detached = th->p_nextlive;
471       else
472         th->p_prevlive->p_nextlive = th->p_nextlive;
473       if (th->p_nextlive != NULL)
474         th->p_nextlive->p_prevlive = th->p_prevlive;
475
476       /* Finally free it.  */
477       pthread_free (th);
478     }
479     return;
480   }
481   __pthread_lock(th->p_lock);
482   if (th->p_exited) {
483     __pthread_unlock(th->p_lock);
484     pthread_free(th);
485   } else {
486     /* The Unix process of the thread is still running.
487        Mark the thread as detached so that the thread manager will
488        deallocate its resources when the Unix process exits. */
489     th->p_detached = 1;
490     __pthread_unlock(th->p_lock);
491   }
492 }
493
494 /* Send a signal to all running threads */
495
496 static void pthread_kill_all_threads(int sig, int main_thread_also)
497 {
498   pthread_descr th;
499   for (th = __pthread_main_thread->p_nextlive;
500        th != __pthread_main_thread;
501        th = th->p_nextlive) {
502     kill(th->p_pid, sig);
503   }
504   if (main_thread_also) {
505     kill(__pthread_main_thread->p_pid, sig);
506   }
507 }
508
509 /* Process-wide exit() */
510
511 static void pthread_handle_exit(pthread_descr issuing_thread, int exitcode)
512 {
513   pthread_descr th;
514   __pthread_exit_requested = 1;
515   __pthread_exit_code = exitcode;
516   /* Send the CANCEL signal to all running threads, including the main
517      thread, but excluding the thread from which the exit request originated
518      (that thread must complete the exit, e.g. calling atexit functions
519      and flushing stdio buffers). */
520   for (th = issuing_thread->p_nextlive;
521        th != issuing_thread;
522        th = th->p_nextlive) {
523     kill(th->p_pid, PTHREAD_SIG_CANCEL);
524   }
525   /* Now, wait for all these threads, so that they don't become zombies
526      and their times are properly added to the thread manager's times. */
527   for (th = issuing_thread->p_nextlive;
528        th != issuing_thread;
529        th = th->p_nextlive) {
530     waitpid(th->p_pid, NULL, __WCLONE);
531   }
532   restart(issuing_thread);
533   _exit(0);
534 }
535
536 /* Handler for PTHREAD_SIG_RESTART in thread manager thread */
537
538 void __pthread_manager_sighandler(int sig)
539 {
540   terminated_children = 1;
541 }
542
543 /* Adjust priority of thread manager so that it always run at a priority
544    higher than all threads */
545
546 void __pthread_manager_adjust_prio(int thread_prio)
547 {
548   struct sched_param param;
549
550   if (thread_prio <= __pthread_manager_thread.p_priority) return;
551   param.sched_priority =
552     thread_prio < __sched_get_priority_max(SCHED_FIFO)
553     ? thread_prio + 1 : thread_prio;
554   __sched_setscheduler(__pthread_manager_thread.p_pid, SCHED_FIFO, &param);
555   __pthread_manager_thread.p_priority = thread_prio;
556 }