diff options
author | Simon Rettberg | 2016-01-11 12:09:23 +0100 |
---|---|---|
committer | Simon Rettberg | 2016-01-11 12:09:23 +0100 |
commit | d9c2a6cf943ca08f31f61a3fada940f77e3a03d3 (patch) | |
tree | 31f627a3d52ff838b046f41516a0fbef0b58b9ee /src/server/server.c | |
parent | [KERNEL/CLIENT] Several minor tweaks and changes (diff) | |
download | dnbd3-d9c2a6cf943ca08f31f61a3fada940f77e3a03d3.tar.gz dnbd3-d9c2a6cf943ca08f31f61a3fada940f77e3a03d3.tar.xz dnbd3-d9c2a6cf943ca08f31f61a3fada940f77e3a03d3.zip |
[SERVER] Fix a lot of (mostly harmless) data races
Diffstat (limited to 'src/server/server.c')
-rw-r--r-- | src/server/server.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/src/server/server.c b/src/server/server.c index dd71312..30b8594 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -415,11 +415,11 @@ void dnbd3_removeClient(dnbd3_client_t *client) { int i; spin_lock( &_clients_lock ); - const int cutoff = MAX(10, _num_clients / 2); - for (i = _num_clients - 1; i >= 0; --i) { - if ( _clients[i] != client ) continue; - _clients[i] = NULL; - if ( i > cutoff && i + 1 == _num_clients ) --_num_clients; + for ( i = _num_clients - 1; i >= 0; --i ) { + if ( _clients[i] == client ) { + _clients[i] = NULL; + } + if ( _clients[i] == NULL && i + 1 == _num_clients ) --_num_clients; } spin_unlock( &_clients_lock ); } @@ -443,9 +443,8 @@ dnbd3_client_t* dnbd3_freeClient(dnbd3_client_t *client) spin_lock( &client->image->lock ); if ( client->image->uplink != NULL ) uplink_removeClient( client->image->uplink, client ); spin_unlock( &client->image->lock ); - image_release( client->image ); + client->image = image_release( client->image ); } - client->image = NULL; spin_unlock( &client->lock ); spin_destroy( &client->lock ); spin_destroy( &client->statsLock ); |