--- libaitio/src/sock.c 2013/11/22 09:59:51 1.4.4.10 +++ libaitio/src/sock.c 2013/11/22 10:05:17 1.4.4.11 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: sock.c,v 1.4.4.10 2013/11/22 09:59:51 misho Exp $ +* $Id: sock.c,v 1.4.4.11 2013/11/22 10:05:17 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -126,7 +126,7 @@ end: static void * io_txNet(sched_task_t *task) { - int wlen; + int wlen, stat; sock_cli_t *cli = TASK_ARG(task); sock_t *s = (sock_t*) cli->cli_parent; @@ -135,8 +135,14 @@ io_txNet(sched_task_t *task) else wlen = sendto(TASK_FD(task), TASK_DATA(task), TASK_DATLEN(task), 0, &cli->cli_addr.sa, cli->cli_addr.sa.sa_len); - if (wlen < 1) + if (wlen < 1) { + kill((pid_t) cli->cli_func, SIGTERM); + while (waitpid((pid_t) cli->cli_func, &stat, WNOHANG) > 0) { + usleep(1000); + kill((pid_t) cli->cli_func, SIGTERM); + } schedEvent(TASK_ROOT(task), io_closeClient, cli, 0, NULL, cli->cli_fd); + } taskExit(task, NULL); } @@ -144,12 +150,18 @@ io_txNet(sched_task_t *task) static void * io_txPty(sched_task_t *task) { - int wlen; + int wlen, stat; sock_cli_t *cli = TASK_ARG(task); wlen = write(TASK_FD(task), TASK_DATA(task), TASK_DATLEN(task)); - if (wlen < 1) + if (wlen < 1) { + kill((pid_t) cli->cli_func, SIGTERM); + while (waitpid((pid_t) cli->cli_func, &stat, WNOHANG) > 0) { + usleep(1000); + kill((pid_t) cli->cli_func, SIGTERM); + } schedEvent(TASK_ROOT(task), io_closeClient, cli, 0, NULL, cli->cli_fd); + } taskExit(task, NULL); } @@ -173,12 +185,10 @@ io_rxNet(sched_task_t *task) goto end; } if (rlen < 1) { - if (!rlen) { + kill((pid_t) cli->cli_func, SIGTERM); + while (waitpid((pid_t) cli->cli_func, &stat, WNOHANG) > 0) { + usleep(1000); kill((pid_t) cli->cli_func, SIGTERM); - while (waitpid((pid_t) cli->cli_func, &stat, WNOHANG) > 0) { - usleep(1000); - kill((pid_t) cli->cli_func, SIGTERM); - } } schedEvent(TASK_ROOT(task), io_closeClient, cli, 0, NULL, cli->cli_fd); } else @@ -197,12 +207,10 @@ io_rxPty(sched_task_t *task) rlen = read(TASK_FD(task), AIT_GET_BUF(&cli->cli_buf[1]), AIT_LEN(&cli->cli_buf[1])); if (rlen < 1) { - if (!rlen) { + kill((pid_t) cli->cli_func, SIGTERM); + while (waitpid((pid_t) cli->cli_func, &stat, WNOHANG) > 0) { + usleep(1000); kill((pid_t) cli->cli_func, SIGTERM); - while (waitpid((pid_t) cli->cli_func, &stat, WNOHANG) > 0) { - usleep(1000); - kill((pid_t) cli->cli_func, SIGTERM); - } } schedEvent(TASK_ROOT(task), io_closeClient, cli, 0, NULL, cli->cli_fd); } else