+ pthread_t self = __pthread_self();
+ jmp_buf jb;
+ void (*notify)(union sigval) = (void (*)(union sigval))self->start;
+ union sigval val = { .sival_ptr = self->start_arg };
+
+ if (!setjmp(jb) && si->si_code == SI_TIMER) {
+ pthread_cleanup_push(cleanup_fromsig, jb);
+ notify(val);
+ pthread_cleanup_pop(1);
+ }
+}
+
+static void install_handler()
+{
+ struct sigaction sa = {
+ .sa_sigaction = timer_handler,
+ .sa_flags = SA_SIGINFO | SA_RESTART
+ };
+ __libc_sigaction(SIGTIMER, &sa, 0);