summaryrefslogtreecommitdiffstats
path: root/src/server/utils.c
diff options
context:
space:
mode:
authorJohann Latocha2012-02-11 01:34:07 +0100
committerJohann Latocha2012-02-11 01:34:07 +0100
commit73e227959e02c3484085ce05c466a3ea0f3e5065 (patch)
treeb588d5dfb6d2645c721a6dbfe414a21119d4116e /src/server/utils.c
parent[SERVER] Config reload fixed (diff)
downloaddnbd3-73e227959e02c3484085ce05c466a3ea0f3e5065.tar.gz
dnbd3-73e227959e02c3484085ce05c466a3ea0f3e5065.tar.xz
dnbd3-73e227959e02c3484085ce05c466a3ea0f3e5065.zip
[SERVER] Spinlocks to freeze threads while reloading config
Diffstat (limited to 'src/server/utils.c')
-rw-r--r--src/server/utils.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/server/utils.c b/src/server/utils.c
index 3091b2f..be0b584 100644
--- a/src/server/utils.c
+++ b/src/server/utils.c
@@ -21,6 +21,7 @@
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
+#include <pthread.h>
#include "server.h"
#include "utils.h"
@@ -72,15 +73,21 @@ void dnbd3_load_config(char *file)
void dnbd3_reload_config(char* config_file_name)
{
- _num_images = 0;
GSList *iterator = NULL;
for (iterator = _dnbd3_clients; iterator; iterator = iterator->next)
{
dnbd3_client_t *client = iterator->data;
+ pthread_spin_lock(&client->spinlock);
client->image = NULL;
}
+ _num_images = 0;
free(_images);
dnbd3_load_config(config_file_name);
+ for (iterator = _dnbd3_clients; iterator; iterator = iterator->next)
+ {
+ dnbd3_client_t *client = iterator->data;
+ pthread_spin_unlock(&client->spinlock);
+ }
}
dnbd3_image_t* dnbd3_get_image(int vid, int rid)