--- libaitsched/src/hooks.c 2014/01/28 10:07:06 1.24.4.3 +++ libaitsched/src/hooks.c 2014/01/28 10:37:19 1.24.4.5 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: hooks.c,v 1.24.4.3 2014/01/28 10:07:06 misho Exp $ +* $Id: hooks.c,v 1.24.4.5 2014/01/28 10:37:19 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -529,6 +529,13 @@ sched_hook_proc(void *task, void *arg __unused) return NULL; } +#ifdef KQ_DISABLE +static void +_sched_sigHandler(int sig) +{ +} +#endif /* KQ_DISABLE */ + /* * sched_hook_signal() - Default SIGNAL hook * @@ -539,8 +546,8 @@ sched_hook_proc(void *task, void *arg __unused) void * sched_hook_signal(void *task, void *arg __unused) { -#ifndef KQ_DISABLE sched_task_t *t = task; +#ifndef KQ_DISABLE struct kevent chg[1]; struct timespec timeout = { 0, 0 }; @@ -562,7 +569,21 @@ sched_hook_signal(void *task, void *arg __unused) LOGERR; return (void*) -1; } +#else + struct sigaction sa; + memset(&sa, 0, sizeof sa); + sigemptyset(&sa.sa_mask); + sa.sa_handler = _sched_sigHandler; + sa.sa_flags = SA_RESETHAND | SA_RESTART; + + if (sigaction(TASK_VAL(t), &sa, NULL) == -1) { + if (TASK_ROOT(t)->root_hooks.hook_exec.exception) + TASK_ROOT(t)->root_hooks.hook_exec.exception(TASK_ROOT(t), NULL); + else + LOGERR; + return (void*) -1; + } #endif return NULL; } @@ -1231,6 +1252,13 @@ sched_hook_fetch(void *root, void *arg __unused) FD_CLR(i, &r->root_fds[1]); } } + + /* optimize select */ + for (i = r->root_kq - 1; i > 2; i--) + if (FD_ISSET(i, &r->root_fds[0]) || FD_ISSET(i, &r->root_fds[1])) + break; + if (i > 2) + r->root_kq = i + 1; #endif /* KQ_DISABLE */ skip_event: