Commit 0fa57cc345bccf4ca409945e7bcdbd807c7f2de4
1 parent
7fac6064
More EINTR checking
Showing
1 changed file
with
11 additions
and
3 deletions
epoll4.c
| ... | ... | @@ -116,11 +116,18 @@ void server_run() { |
| 116 | 116 | |
| 117 | 117 | socklen = sizeof(cli_addr); |
| 118 | 118 | for (;;) { |
| 119 | - nfds = epoll_wait(epfd, events, MAX_EVENTS, -1); | |
| 119 | + do { | |
| 120 | + nfds = epoll_wait(epfd, events, MAX_EVENTS, -1); | |
| 121 | + } while (nfds == -1 && errno == EINTR); | |
| 122 | + | |
| 120 | 123 | for (i = 0; i < nfds; i++) { |
| 121 | 124 | if (events[i].data.fd == listen_sock) { |
| 122 | 125 | /* handle new connection */ |
| 123 | - conn_sock = accept(listen_sock, (struct sockaddr *)&cli_addr, &socklen); | |
| 126 | + | |
| 127 | + do { | |
| 128 | + conn_sock = | |
| 129 | + accept(listen_sock, (struct sockaddr *)&cli_addr, &socklen); | |
| 130 | + } while (conn_sock == -1 && errno == EINTR); | |
| 124 | 131 | |
| 125 | 132 | inet_ntop(AF_INET, (char *)&(cli_addr.sin_addr), buf, sizeof(buf)); |
| 126 | 133 | printf("[+] connected with %s:%d\n", buf, ntohs(cli_addr.sin_port)); |
| ... | ... | @@ -142,7 +149,8 @@ void server_run() { |
| 142 | 149 | printf("[+] data: %s\n", buf); |
| 143 | 150 | n = 0; |
| 144 | 151 | while (n != strlen(buf)) { |
| 145 | - int rv = send(events[i].data.fd, buf + n, strlen(buf) - n, MSG_NOSIGNAL); | |
| 152 | + int rv = send(events[i].data.fd, buf + n, strlen(buf) - n, | |
| 153 | + MSG_NOSIGNAL); | |
| 146 | 154 | if (rv == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) |
| 147 | 155 | continue; // FIXME: busy waiting - should wait using epoll |
| 148 | 156 | if (rv == -1) | ... | ... |