--- libaitio/src/sock.c 2013/08/27 19:25:59 1.2.2.5 +++ libaitio/src/sock.c 2013/09/02 11:56:11 1.3.2.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: sock.c,v 1.2.2.5 2013/08/27 19:25:59 misho Exp $ +* $Id: sock.c,v 1.3.2.1 2013/09/02 11:56:11 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -206,10 +206,18 @@ static void thrCliClean(void *arg) { sock_cli_t *cli = (sock_cli_t*) arg; + sock_t *s = (sock_t*) cli->cli_parent; - shutdown(cli->cli_fd, SHUT_RDWR); - close(cli->cli_fd); + if (s->sock_type == SOCK_STREAM) { + shutdown(cli->cli_fd, SHUT_RDWR); + close(cli->cli_fd); + } AIT_FREE_VAL(&cli->cli_buf); + + pthread_mutex_lock(&s->sock_mtx); + TAILQ_REMOVE(&s->sock_cli, cli, cli_node); + pthread_mutex_unlock(&s->sock_mtx); + e_free(cli); } @@ -252,7 +260,9 @@ ioAcceptSocket(sock_t * __restrict s, sock_cb_t f, voi pfd->events = POLLIN | POLLPRI; do { if (poll(pfd, 1, -1) < 1 || - pfd->revents & (POLLNVAL | POLLHUP || POLLERR)) { + pfd->revents & (POLLNVAL | POLLHUP | POLLERR)) { + if (errno == EINTR) + continue; LOGERR; return -1; } else @@ -275,7 +285,8 @@ ioAcceptSocket(sock_t * __restrict s, sock_cb_t f, voi cli = e_malloc(sizeof(sock_cli_t)); if (!cli) { io_SetErr(elwix_GetErrno(), "%s", elwix_GetError()); - close(c); + if (s->sock_type == SOCK_STREAM) + close(c); return -1; } else memset(cli, 0, sizeof(sock_cli_t)); @@ -289,13 +300,16 @@ ioAcceptSocket(sock_t * __restrict s, sock_cb_t f, voi if (pthread_create(&cli->cli_tid, NULL, io_thrCliWrapper, cli) == -1) { LOGERR; - close(c); + if (s->sock_type == SOCK_STREAM) + close(c); AIT_FREE_VAL(&cli->cli_buf); e_free(cli); return -1; } else { pthread_detach(cli->cli_tid); + pthread_mutex_lock(&s->sock_mtx); TAILQ_INSERT_TAIL(&s->sock_cli, cli, cli_node); + pthread_mutex_unlock(&s->sock_mtx); } } while (42);