diff options
Diffstat (limited to 'opentracker.c')
| -rw-r--r-- | opentracker.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/opentracker.c b/opentracker.c index e5efff5..644e99c 100644 --- a/opentracker.c +++ b/opentracker.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | #include "ot_ip.h" | 29 | #include "ot_ip.h" |
| 30 | #include "ot_livesync.h" | 30 | #include "ot_livesync.h" |
| 31 | #include "ot_mutex.h" | 31 | #include "ot_mutex.h" |
| 32 | #include "ot_workqueue.h" | ||
| 32 | #include "ot_random.h" | 33 | #include "ot_random.h" |
| 33 | #include "ot_scan.h" | 34 | #include "ot_scan.h" |
| 34 | #include "ot_event.h" | 35 | #include "ot_event.h" |
| @@ -37,6 +38,7 @@ | |||
| 37 | #include "ot_stats.h" | 38 | #include "ot_stats.h" |
| 38 | #include "ot_tcp.h" | 39 | #include "ot_tcp.h" |
| 39 | #include "ot_udp.h" | 40 | #include "ot_udp.h" |
| 41 | #include "ot_worker.h" | ||
| 40 | #include "trackerlogic.h" | 42 | #include "trackerlogic.h" |
| 41 | 43 | ||
| 42 | /* Globals */ | 44 | /* Globals */ |
| @@ -137,16 +139,18 @@ static void *server_mainloop(void *args) { | |||
| 137 | else if ((intptr_t)cookie == FLAG_SELFPIPE) | 139 | else if ((intptr_t)cookie == FLAG_SELFPIPE) |
| 138 | while (read((int)sock, ws.inbuf, G_INBUF_SIZE) > 0) | 140 | while (read((int)sock, ws.inbuf, G_INBUF_SIZE) > 0) |
| 139 | ; | 141 | ; |
| 140 | else { | 142 | else if (fdstate_claim((int)sock, ready[i].generation)) { |
| 141 | if (ready[i].what & EVENT_IN) | 143 | if (ready[i].what & EVENT_IN) |
| 142 | tcp_read(sock, &ws); | 144 | tcp_read(sock, &ws); |
| 143 | /* The read may have closed it, so look again before writing */ | 145 | /* The read may have closed it, so look again before writing */ |
| 144 | if ((ready[i].what & EVENT_OUT) && fdstate_generation((int)sock) == ready[i].generation) | 146 | if ((ready[i].what & EVENT_OUT) && fdstate_generation((int)sock) == ready[i].generation) |
| 145 | tcp_write(sock); | 147 | tcp_write(sock); |
| 148 | if (fdstate_generation((int)sock) == ready[i].generation) | ||
| 149 | fdstate_release((int)sock); | ||
| 146 | } | 150 | } |
| 147 | } | 151 | } |
| 148 | 152 | ||
| 149 | while ((sock = mutex_workqueue_popresult(&iovec_entries, &iovector, &is_partial)) != -1) | 153 | while ((sock = workqueue_popresult(&iovec_entries, &iovector, &is_partial)) != -1) |
| 150 | http_sendiovecdata(sock, &ws, iovec_entries, iovector, is_partial); | 154 | http_sendiovecdata(sock, &ws, iovec_entries, iovector, is_partial); |
| 151 | 155 | ||
| 152 | if (time_now_seconds() > next_timeout_check) { | 156 | if (time_now_seconds() > next_timeout_check) { |
| @@ -426,8 +430,7 @@ int main(int argc, char **argv) { | |||
| 426 | listen_start_udp_workers(); | 430 | listen_start_udp_workers(); |
| 427 | 431 | ||
| 428 | server_mainloop(0); | 432 | server_mainloop(0); |
| 429 | tcp_workers_deinit(); | 433 | worker_stop_all(); |
| 430 | udp_workers_deinit(); | ||
| 431 | 434 | ||
| 432 | /* No thread is serving any more, so the teardown can run where a debugger | 435 | /* No thread is serving any more, so the teardown can run where a debugger |
| 433 | and the sanitizers can follow it */ | 436 | and the sanitizers can follow it */ |
