--- libaitsched/src/hooks.c 2022/11/28 23:48:33 1.37.2.3 +++ libaitsched/src/hooks.c 2022/11/29 11:55:58 1.37.2.4 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: hooks.c,v 1.37.2.3 2022/11/28 23:48:33 misho Exp $ +* $Id: hooks.c,v 1.37.2.4 2022/11/29 11:55:58 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -622,10 +622,11 @@ sched_hook_read(void *task, void *arg) * return: <0 errors and 0 ok */ void * -sched_hook_write(void *task, void *arg __unused) +sched_hook_write(void *task, void *arg) { sched_task_t *t = task; sched_root_task_t *r = NULL; + uintptr_t mask = (uintptr_t) arg; #if SUP_ENABLE == KQ_SUPPORT struct kevent chg[1]; struct timespec timeout = { 0, 0 }; @@ -641,9 +642,11 @@ sched_hook_write(void *task, void *arg __unused) #if SUP_ENABLE == KQ_SUPPORT #ifdef __NetBSD__ - EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_ADD | EV_CLEAR, 0, 0, (intptr_t) TASK_FD(t)); + EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_ADD | EV_CLEAR | mask, + 0, 0, (intptr_t) TASK_FD(t)); #else - EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_ADD | EV_CLEAR, 0, 0, (void*) TASK_FD(t)); + EV_SET(&chg[0], TASK_FD(t), EVFILT_WRITE, EV_ADD | EV_CLEAR | mask, + 0, 0, (void*) TASK_FD(t)); #endif if (kevent(r->root_kq, chg, 1, NULL, 0, &timeout) == -1) { if (r->root_hooks.hook_exec.exception) @@ -653,8 +656,10 @@ sched_hook_write(void *task, void *arg __unused) return (void*) -1; } #elif SUP_ENABLE == EP_SUPPORT + if (!mask) + mask = EPOLLOUT; ee.data.fd = TASK_FD(t); - ee.events = EPOLLOUT; + ee.events = mask; if (FD_ISSET(TASK_FD(t), &r->root_fds[2])) { flg |= 4; @@ -666,6 +671,7 @@ sched_hook_write(void *task, void *arg __unused) } if (FD_ISSET(TASK_FD(t), &r->root_fds[1])) { flg |= 2; + ee.events |= EPOLLOUT; } if (epoll_ctl(r->root_kq, flg ? EPOLL_CTL_MOD : EPOLL_CTL_ADD, TASK_FD(t), &ee) == -1) { @@ -675,9 +681,14 @@ sched_hook_write(void *task, void *arg __unused) LOGERR; return (void*) -1; } else - FD_SET(TASK_FD(t), &r->root_fds[1]); + if (mask & EPOLLOUT) + FD_SET(TASK_FD(t), &r->root_fds[1]); #else - FD_SET(TASK_FD(t), &r->root_fds[1]); + if (!mask) + FD_SET(TASK_FD(t), &r->root_fds[1]); + else + if (mask & 1) + FD_SET(TASK_FD(t), &r->root_fds[1]); if (TASK_FD(t) >= r->root_kq) r->root_kq = TASK_FD(t) + 1;