diff options
author | Simon Rettberg | 2013-09-17 18:38:37 +0200 |
---|---|---|
committer | Simon Rettberg | 2013-09-17 18:38:37 +0200 |
commit | 5c8aadc590a7ce851cbbb6dd18e40b6ffcf94ba5 (patch) | |
tree | 177c4149ab13cb542c787c13e3499c545c8393c4 /src/server/net.c | |
parent | [SERVER] Properly decrease uplink.queueLen when removing a client (diff) | |
download | dnbd3-5c8aadc590a7ce851cbbb6dd18e40b6ffcf94ba5.tar.gz dnbd3-5c8aadc590a7ce851cbbb6dd18e40b6ffcf94ba5.tar.xz dnbd3-5c8aadc590a7ce851cbbb6dd18e40b6ffcf94ba5.zip |
[SERVER] Block signals on network threads
Diffstat (limited to 'src/server/net.c')
-rw-r--r-- | src/server/net.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/server/net.c b/src/server/net.c index cd38205..3e9383d 100644 --- a/src/server/net.c +++ b/src/server/net.c @@ -30,6 +30,7 @@ #include <assert.h> #include <errno.h> #include <inttypes.h> +#include <signal.h> #include "sockhelper.h" #include "helper.h" @@ -46,11 +47,12 @@ static inline char recv_request_header(int sock, dnbd3_request_t *request) { - int ret; + int ret, fails = 0; // Read request header from socket - if ( (ret = recv( sock, request, sizeof(*request), MSG_WAITALL )) != sizeof(*request) ) { - if ( ret == 0 ) return FALSE; + while ( (ret = recv( sock, request, sizeof(*request), MSG_WAITALL )) != sizeof(*request) ) { + if ( ret >= 0 || ++fails > 10 ) return FALSE; const int err = errno; + if ( err == EAGAIN || err == EINTR ) continue; printf( "[DEBUG] Error receiving request: Could not read message header (%d/%d, e=%d)\n", ret, (int)sizeof(*request), err ); return FALSE; } @@ -134,6 +136,9 @@ void *net_client_handler(void *dnbd3_client) dnbd3_server_entry_t server_list[NUMBER_SERVERS]; + // Block some signals not important to this thread + blockNoncriticalSignals(); + // Set to zero to make valgrind happy memset( &reply, 0, sizeof(reply) ); memset( &payload, 0, sizeof(payload) ); |