Diff for /libaitio/src/sock.c between versions 1.6 and 1.7

version 1.6, 2013/11/22 14:31:08 version 1.7, 2013/11/22 15:09:17
Line 51  io_closeClient(sched_task_t *task) Line 51  io_closeClient(sched_task_t *task)
 {  {
         sock_cli_t *cli = (sock_cli_t*) TASK_ARG(task);          sock_cli_t *cli = (sock_cli_t*) TASK_ARG(task);
         sock_t *s = (sock_t*) cli->cli_parent;          sock_t *s = (sock_t*) cli->cli_parent;
        int stat, sock = (int) TASK_DATLEN(task);        int stat;
   
         pthread_mutex_lock(&s->sock_mtx);          pthread_mutex_lock(&s->sock_mtx);
         TAILQ_REMOVE(&s->sock_cli, cli, cli_node);          TAILQ_REMOVE(&s->sock_cli, cli, cli_node);
Line 60  io_closeClient(sched_task_t *task) Line 60  io_closeClient(sched_task_t *task)
         schedCancelby(s->sock_root, taskMAX, CRITERIA_ARG, cli, NULL);          schedCancelby(s->sock_root, taskMAX, CRITERIA_ARG, cli, NULL);
   
         if (s->sock_type == SOCK_STREAM) {          if (s->sock_type == SOCK_STREAM) {
                shutdown(sock, SHUT_RDWR);                shutdown(cli->cli_fd, SHUT_RDWR);
                close(sock);                close(cli->cli_fd);
         }          }
         AIT_FREE_VAL(&cli->cli_buf[1]);          AIT_FREE_VAL(&cli->cli_buf[1]);
         AIT_FREE_VAL(&cli->cli_buf[0]);          AIT_FREE_VAL(&cli->cli_buf[0]);
   
         if (cli->cli_pid > 0) {          if (cli->cli_pid > 0) {
                kill(cli->cli_pid, SIGTERM);                kill(cli->cli_pid, SIGKILL);
                 while (waitpid(cli->cli_pid, &stat, WNOHANG) > 0) {                  while (waitpid(cli->cli_pid, &stat, WNOHANG) > 0) {
                         usleep(1000);                          usleep(1000);
                        kill(cli->cli_pid, SIGTERM);                        kill(cli->cli_pid, SIGKILL);
                 }                  }
         }          }
   
Line 123  io_acceptClient(sched_task_t *task) Line 123  io_acceptClient(sched_task_t *task)
         AIT_SET_BUFSIZ(&cli->cli_buf[1], 0, AIT_LEN(&s->sock_buf));          AIT_SET_BUFSIZ(&cli->cli_buf[1], 0, AIT_LEN(&s->sock_buf));
   
         schedRead(TASK_ROOT(task), cli->cli_func, cli, cli->cli_fd, TASK_ARG(task), 0);          schedRead(TASK_ROOT(task), cli->cli_func, cli, cli->cli_fd, TASK_ARG(task), 0);
        ioUpdTimerSocket(cli, NULL);        ioUpdTimerSocket(cli);
 end:  end:
         schedReadSelf(task);          schedReadSelf(task);
         taskExit(task, NULL);          taskExit(task, NULL);
Line 136  io_txNet(sched_task_t *task) Line 136  io_txNet(sched_task_t *task)
         sock_cli_t *cli = TASK_ARG(task);          sock_cli_t *cli = TASK_ARG(task);
         sock_t *s = (sock_t*) cli->cli_parent;          sock_t *s = (sock_t*) cli->cli_parent;
   
        ioUpdTimerSocket(cli, NULL);        ioUpdTimerSocket(cli);
   
         if (s->sock_type == SOCK_STREAM)          if (s->sock_type == SOCK_STREAM)
                 wlen = send(TASK_FD(task), TASK_DATA(task), TASK_DATLEN(task), 0);                  wlen = send(TASK_FD(task), TASK_DATA(task), TASK_DATLEN(task), 0);
Line 144  io_txNet(sched_task_t *task) Line 144  io_txNet(sched_task_t *task)
                 wlen = sendto(TASK_FD(task), TASK_DATA(task), TASK_DATLEN(task), 0,                   wlen = sendto(TASK_FD(task), TASK_DATA(task), TASK_DATLEN(task), 0, 
                                 &cli->cli_addr.sa, cli->cli_addr.sa.sa_len);                                  &cli->cli_addr.sa, cli->cli_addr.sa.sa_len);
         if (wlen < 1)          if (wlen < 1)
                schedEvent(TASK_ROOT(task), io_closeClient, cli, 0,                 schedEvent(TASK_ROOT(task), io_closeClient, cli, 0, NULL, 0);
                                (void*) cli->cli_func, cli->cli_fd); 
   
         taskExit(task, NULL);          taskExit(task, NULL);
 }  }
Line 156  io_txPty(sched_task_t *task) Line 155  io_txPty(sched_task_t *task)
         int wlen;          int wlen;
         sock_cli_t *cli = TASK_ARG(task);          sock_cli_t *cli = TASK_ARG(task);
   
        ioUpdTimerSocket(cli, NULL);        ioUpdTimerSocket(cli);
   
         wlen = write(TASK_FD(task), TASK_DATA(task), TASK_DATLEN(task));          wlen = write(TASK_FD(task), TASK_DATA(task), TASK_DATLEN(task));
         if (wlen < 1)          if (wlen < 1)
                schedEvent(TASK_ROOT(task), io_closeClient, cli, 0,                 schedEvent(TASK_ROOT(task), io_closeClient, cli, 0, NULL, 0);
                                (void*) cli->cli_func, cli->cli_fd); 
   
         taskExit(task, NULL);          taskExit(task, NULL);
 }  }
Line 175  io_rxNet(sched_task_t *task) Line 173  io_rxNet(sched_task_t *task)
         sockaddr_t sa;          sockaddr_t sa;
         socklen_t salen = sizeof sa.ss;          socklen_t salen = sizeof sa.ss;
   
        ioUpdTimerSocket(cli, NULL);        ioUpdTimerSocket(cli);
   
         if (s->sock_type == SOCK_STREAM)          if (s->sock_type == SOCK_STREAM)
                 rlen = recv(TASK_FD(task), AIT_GET_BUF(&cli->cli_buf[0]),                   rlen = recv(TASK_FD(task), AIT_GET_BUF(&cli->cli_buf[0]), 
Line 187  io_rxNet(sched_task_t *task) Line 185  io_rxNet(sched_task_t *task)
                         goto end;                          goto end;
         }          }
         if (rlen < 1)          if (rlen < 1)
                schedEvent(TASK_ROOT(task), io_closeClient, cli, 0,                 schedEvent(TASK_ROOT(task), io_closeClient, cli, 0, NULL, 0);
                                (void*) cli->cli_func, cli->cli_fd); 
         else          else
                 schedEvent(TASK_ROOT(task), io_txPty, cli, cli->cli_pty,                   schedEvent(TASK_ROOT(task), io_txPty, cli, cli->cli_pty, 
                                 AIT_GET_BUF(&cli->cli_buf[0]), rlen);                                  AIT_GET_BUF(&cli->cli_buf[0]), rlen);
Line 203  io_rxPty(sched_task_t *task) Line 200  io_rxPty(sched_task_t *task)
         int rlen;          int rlen;
         sock_cli_t *cli = TASK_ARG(task);          sock_cli_t *cli = TASK_ARG(task);
   
        ioUpdTimerSocket(cli, NULL);        ioUpdTimerSocket(cli);
   
         rlen = read(TASK_FD(task), AIT_GET_BUF(&cli->cli_buf[1]), AIT_LEN(&cli->cli_buf[1]));          rlen = read(TASK_FD(task), AIT_GET_BUF(&cli->cli_buf[1]), AIT_LEN(&cli->cli_buf[1]));
         if (rlen < 1)          if (rlen < 1)
                schedEvent(TASK_ROOT(task), io_closeClient, cli, 0,                 schedEvent(TASK_ROOT(task), io_closeClient, cli, 0, NULL, 0);
                                (void*) cli->cli_func, cli->cli_fd); 
         else          else
                 schedEvent(TASK_ROOT(task), io_txNet, cli, cli->cli_fd,                   schedEvent(TASK_ROOT(task), io_txNet, cli, cli->cli_fd, 
                                 AIT_GET_BUF(&cli->cli_buf[1]), rlen);                                  AIT_GET_BUF(&cli->cli_buf[1]), rlen);
Line 285  io_bridgeClient(sched_task_t *task) Line 281  io_bridgeClient(sched_task_t *task)
                                         TASK_ARG(task), 0);                                          TASK_ARG(task), 0);
                         schedRead(TASK_ROOT(task), io_rxNet, cli, cli->cli_fd,                           schedRead(TASK_ROOT(task), io_rxNet, cli, cli->cli_fd, 
                                         TASK_ARG(task), 0);                                          TASK_ARG(task), 0);
                        ioUpdTimerSocket(cli, NULL);                        ioUpdTimerSocket(cli);
                         break;                          break;
         }          }
 end:  end:
Line 407  ioCloseSocket(sock_t ** __restrict s) Line 403  ioCloseSocket(sock_t ** __restrict s)
                         AIT_FREE_VAL(&cli->cli_buf[0]);                          AIT_FREE_VAL(&cli->cli_buf[0]);
   
                         if (cli->cli_pid > 0) {                          if (cli->cli_pid > 0) {
                                kill(cli->cli_pid, SIGTERM);                                kill(cli->cli_pid, SIGKILL);
                                 while (waitpid(cli->cli_pid, &stat, WNOHANG) > 0) {                                  while (waitpid(cli->cli_pid, &stat, WNOHANG) > 0) {
                                         usleep(1000);                                          usleep(1000);
                                        kill(cli->cli_pid, SIGTERM);                                        kill(cli->cli_pid, SIGKILL);
                                 }                                  }
                         }                          }
   
Line 487  ioUpSocket(sock_t * __restrict s, void *arg, int timeo Line 483  ioUpSocket(sock_t * __restrict s, void *arg, int timeo
  * ioUpdTimerSocket() - Update timeout of socket   * ioUpdTimerSocket() - Update timeout of socket
  *   *
  * @c = Client socket   * @c = Client socket
  * @arg = Optional data argument  
  * return:  none   * return:  none
  */   */
 void  void
ioUpdTimerSocket(sock_cli_t * __restrict c, void *arg)ioUpdTimerSocket(sock_cli_t * __restrict c)
 {  {
         sock_t *s;          sock_t *s;
   
Line 500  ioUpdTimerSocket(sock_cli_t * __restrict c, void *arg) Line 495  ioUpdTimerSocket(sock_cli_t * __restrict c, void *arg)
         else          else
                 s = c->cli_parent;                  s = c->cli_parent;
   
        schedCancelby(s->sock_root, taskTIMER, CRITERIA_DATLEN, (void*) c->cli_fd, NULL);        schedCancelby(s->sock_root, taskTIMER, CRITERIA_ARG, c, NULL);
        schedTimer(s->sock_root, io_closeClient, c, s->sock_timeout, arg, c->cli_fd);        schedTimer(s->sock_root, io_closeClient, c, s->sock_timeout, NULL, 0);
 }  }
   
 /*  /*
Line 520  ioCloseClient(sock_cli_t * __restrict c) Line 515  ioCloseClient(sock_cli_t * __restrict c)
         else          else
                 s = c->cli_parent;                  s = c->cli_parent;
   
        return !schedEvent(s->sock_root, io_closeClient, c, 0, NULL, c->cli_fd);        return !schedEvent(s->sock_root, io_closeClient, c, 0, NULL, 0);
 }  }
   
 /*  /*

Removed from v.1.6  
changed lines
  Added in v.1.7


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>