From 73e227959e02c3484085ce05c466a3ea0f3e5065 Mon Sep 17 00:00:00 2001 From: Johann Latocha Date: Sat, 11 Feb 2012 01:34:07 +0100 Subject: [SERVER] Spinlocks to freeze threads while reloading config --- src/server/ipc.c | 2 -- src/server/net.c | 11 +++++------ src/server/server.c | 3 +-- src/server/server.h | 2 +- src/server/utils.c | 9 ++++++++- 5 files changed, 15 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/server/ipc.c b/src/server/ipc.c index 4adbb7e..1ae401b 100644 --- a/src/server/ipc.c +++ b/src/server/ipc.c @@ -88,9 +88,7 @@ void* dnbd3_ipc_receive() case IPC_RELOAD: printf("INFO: Reloading configuration...\n"); - pthread_spin_lock(&_spinlock); dnbd3_reload_config(_config_file_name); - pthread_spin_unlock(&_spinlock); break; case IPC_INFO: diff --git a/src/server/net.c b/src/server/net.c index e4be703..ab01f70 100644 --- a/src/server/net.c +++ b/src/server/net.c @@ -41,7 +41,6 @@ void *dnbd3_handle_query(void *dnbd3_client) dnbd3_reply_t reply; int image_file = -1; - dnbd3_image_t *image; struct in_addr server; int i = 0; @@ -52,10 +51,6 @@ void *dnbd3_handle_query(void *dnbd3_client) reply.error = 0; memcpy(reply.handle, request.handle, sizeof(request.handle)); - // TODO: lock CMD_GET_SERVERS and CMD_GET_SIZE because of reloading cfg... - // pthread_spin_lock(&_spinlock); - // pthread_spin_unlock(&_spinlock); - switch (request.cmd) { case CMD_GET_SERVERS: @@ -67,6 +62,7 @@ void *dnbd3_handle_query(void *dnbd3_client) continue; } + pthread_spin_lock(&client->spinlock); if (client->image->num_servers < MAX_NUMBER_SERVERS) reply.size = client->image->num_servers * sizeof(struct in_addr); else @@ -79,10 +75,13 @@ void *dnbd3_handle_query(void *dnbd3_client) inet_aton(client->image->servers[i], &server); send(client->sock, (char *) &server, sizeof(struct in_addr), 0); } + pthread_spin_unlock(&client->spinlock); continue; case CMD_GET_SIZE: - image = dnbd3_get_image(request.vid, request.rid); + pthread_spin_lock(&client->spinlock); + dnbd3_image_t *image = dnbd3_get_image(request.vid, request.rid); + pthread_spin_unlock(&client->spinlock); if(!image) { // image not found, send error diff --git a/src/server/server.c b/src/server/server.c index 786cc40..6fdedf0 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -37,7 +37,6 @@ int _sock; GSList *_dnbd3_clients = NULL; -pthread_spinlock_t _spinlock; char *_config_file_name = DEFAULT_SERVER_CONFIG_FILE; dnbd3_image_t *_images; size_t _num_images = 0; @@ -137,7 +136,6 @@ int main(int argc, char* argv[]) daemon(1, 0); // load config file - pthread_spin_init(&_spinlock, PTHREAD_PROCESS_PRIVATE); dnbd3_load_config(_config_file_name); // setup signal handler @@ -178,6 +176,7 @@ int main(int argc, char* argv[]) pthread_t thread; dnbd3_client_t *dnbd3_client = (dnbd3_client_t *) malloc(sizeof(dnbd3_client_t)); + pthread_spin_init(&dnbd3_client->spinlock, PTHREAD_PROCESS_PRIVATE); strcpy(dnbd3_client->ip, inet_ntoa(client.sin_addr)); dnbd3_client->sock = fd; dnbd3_client->thread = &thread; diff --git a/src/server/server.h b/src/server/server.h index 02da005..de9eccb 100644 --- a/src/server/server.h +++ b/src/server/server.h @@ -44,10 +44,10 @@ typedef struct char ip[16]; pthread_t *thread; dnbd3_image_t *image; + pthread_spinlock_t spinlock; } dnbd3_client_t; extern GSList *_dnbd3_clients; -extern pthread_spinlock_t _spinlock; extern char *_config_file_name; extern dnbd3_image_t *_images; extern size_t _num_images; 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 #include #include +#include #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) -- cgit v1.2.3-55-g7522