summaryrefslogtreecommitdiffstats
path: root/src/server/server.c
diff options
context:
space:
mode:
authorSimon Rettberg2016-01-11 12:09:23 +0100
committerSimon Rettberg2016-01-11 12:09:23 +0100
commitd9c2a6cf943ca08f31f61a3fada940f77e3a03d3 (patch)
tree31f627a3d52ff838b046f41516a0fbef0b58b9ee /src/server/server.c
parent[KERNEL/CLIENT] Several minor tweaks and changes (diff)
downloaddnbd3-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.c13
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 );