123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- #include <errno.h>
- #include <stdlib.h>
- #include "fork.h"
- #include <atomic.h>
- void
- __unregister_atfork (void *dso_handle)
- {
-
- struct fork_handler *runp = __fork_handlers;
- struct fork_handler *lastp = NULL;
- while (runp != NULL)
- if (runp->dso_handle == dso_handle)
- break;
- else
- {
- lastp = runp;
- runp = runp->next;
- }
- if (runp == NULL)
-
- return;
-
- lll_lock (__fork_lock);
-
- struct deleted_handler
- {
- struct fork_handler *handler;
- struct deleted_handler *next;
- } *deleted = NULL;
-
- do
- {
- if (runp->dso_handle == dso_handle)
- {
- if (lastp == NULL)
- __fork_handlers = runp->next;
- else
- lastp->next = runp->next;
-
- struct deleted_handler *newp = alloca (sizeof (*newp));
- newp->handler = runp;
- newp->next = deleted;
- deleted = newp;
- }
- else
- lastp = runp;
- runp = runp->next;
- }
- while (runp != NULL);
-
- lll_unlock (__fork_lock);
-
- while (deleted != NULL)
- {
-
- deleted->handler->need_signal = 1;
-
- atomic_write_barrier ();
-
- atomic_decrement (&deleted->handler->refcntr);
- unsigned int val;
- while ((val = deleted->handler->refcntr) != 0)
- lll_futex_wait (&deleted->handler->refcntr, val);
- deleted = deleted->next;
- }
- }
|