Commit Graph
13 Commits
Author SHA1 Message Date
Rich Felker 4c4e22d781 optimize compound-literal sigset_t's not to contain useless hurd bits 2011-05-07 23:37:10 -04:00
Rich Felker 99b8a25e94 overhaul implementation-internal signal protections
the new approach relies on the fact that the only ways to create
sigset_t objects without invoking UB are to use the sig*set()
functions, or from the masks returned by sigprocmask, sigaction, etc.
or in the ucontext_t argument to a signal handler. thus, as long as
sigfillset and sigaddset avoid adding the "protected" signals, there
is no way the application will ever obtain a sigset_t including these
bits, and thus no need to add the overhead of checking/clearing them
when sigprocmask or sigaction is called.

note that the old code actually *failed* to remove the bits from
sa_mask when sigaction was called.

the new implementations are also significantly smaller, simpler, and
faster due to ignoring the useless "GNU HURD signals" 65-1024, which
are not used and, if there's any sanity in the world, never will be
used.
2011-05-07 23:23:58 -04:00
Rich Felker 016a5dc192 use a separate signal from SIGCANCEL for SIGEV_THREAD timers
otherwise we cannot support an application's desire to use
asynchronous cancellation within the callback function. this change
also slightly debloats pthread_create.c.
2011-04-14 12:51:00 -04:00
Rich Felker 2063c4cac2 run pthread tsd destructors when a timer thread pretends to exit 2011-04-09 02:26:55 -04:00
Rich Felker 82171d6ac0 greatly improve SIGEV_THREAD timers
calling pthread_exit from, or pthread_cancel on, the timer callback
thread will no longer destroy the timer.
2011-04-09 02:23:33 -04:00
Rich Felker cd3bb38412 fix signal-based timers with null sigevent argument
since timer_create is no longer allocating a structure for the timer_t
and simply using the kernel timer id, it was impossible to specify the
timer_t as the argument to the signal handler. the solution is to pass
the null sigevent pointer on to the kernel, rather than filling it in
userspace, so that the kernel does the right thing. however, that
precludes the clever timerid-versus-threadid encoding we were doing.

instead, just assume timerids are below 1M and thread pointers are
above 1M. (in perspective: timerids are sequentially allocated and
seem limited to 32k, and thread pointers are at roughly 3G.)
2011-04-06 09:26:41 -04:00
Rich Felker 6e9ed66d0d timer threads should sleep and stay asleep... a long time 2011-04-03 12:10:24 -04:00
Rich Felker 6f1414e102 revert to deleting kernel-level timer from cancellation handler
this is necessary in order to avoid breaking timer_getoverrun in the
last run of the timer event handler, if it has not yet finished.
2011-04-03 12:08:34 -04:00
Rich Felker f01d351842 simplify calling of timer signal handler 2011-04-03 12:03:58 -04:00
Rich Felker 3990c5c6a4 avoid all malloc/free in timer creation/destruction
instead of allocating a userspace structure for signal-based timers,
simply use the kernel timer id. we use the fact that thread pointers
will always be zero in the low bit (actually more) to encode integer
timerid values as pointers.

also, this change ensures that the timer_destroy syscall has completed
before the library timer_destroy function returns, in case it matters.
2011-03-30 13:04:55 -04:00
Rich Felker b8be64c43d optimize timer creation and possibly protect against some minor races
the major idea of this patch is not to depend on having the timer
pointer delivered to the signal handler, and instead use the thread
pointer to get the callback function address and argument. this way,
the parent thread can make the timer_create syscall while the child
thread is starting, and it should never have to block waiting for the
barrier.
2011-03-30 12:06:39 -04:00
Rich Felker 680630011d reorder timer initialization so that timer_create does not depend on free
this allows small programs which only create times, but never delete
them, to use simple_malloc instead of the full malloc.
2011-03-29 22:43:13 -04:00
Rich Felker 80c4dcd253 implement POSIX timers
this implementation is superior to the glibc/nptl implementation, in
that it gives true realtime behavior. there is no risk of timer
expiration events being lost due to failed thread creation or failed
malloc, because the thread is created as time creation time, and
reused until the timer is deleted.
2011-03-29 13:01:25 -04:00