aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2014-05-11 03:57:21 +0200
committerMattias Andrée <maandree@operamail.com>2014-05-11 03:57:21 +0200
commite64b8f2fedba36d5ba64cd5f77c4fb166f9ea3c6 (patch)
tree2549d7f18077d293b7b0311f749e73a21715d46b /src
parentwhitespace (diff)
downloadmds-e64b8f2fedba36d5ba64cd5f77c4fb166f9ea3c6.tar.gz
mds-e64b8f2fedba36d5ba64cd5f77c4fb166f9ea3c6.tar.bz2
mds-e64b8f2fedba36d5ba64cd5f77c4fb166f9ea3c6.tar.xz
move mutex_created into client_t + error handling for pthread_*_init
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to '')
-rw-r--r--src/mds-server/client.c1
-rw-r--r--src/mds-server/client.h5
-rw-r--r--src/mds-server/mds-server.c31
3 files changed, 30 insertions, 7 deletions
diff --git a/src/mds-server/client.c b/src/mds-server/client.c
index f48a1b0..08205b2 100644
--- a/src/mds-server/client.c
+++ b/src/mds-server/client.c
@@ -84,6 +84,7 @@ size_t client_unmarshal(client_t* restrict this, char* restrict data)
size_t i, n, rc = sizeof(ssize_t) + 2 * sizeof(int) + sizeof(uint64_t) + 3 * sizeof(size_t);
this->interception_conditions = NULL;
this->send_pending = NULL;
+ this->mutex_created = 0;
buf_get_next(data, ssize_t, this->list_entry);
buf_get_next(data, int, this->socket_fd);
buf_get_next(data, int, this->open);
diff --git a/src/mds-server/client.h b/src/mds-server/client.h
index a795c84..fee5eba 100644
--- a/src/mds-server/client.h
+++ b/src/mds-server/client.h
@@ -71,6 +71,11 @@ typedef struct client
pthread_mutex_t mutex;
/**
+ * Whether `mutex` has been initialised
+ */
+ int mutex_created;
+
+ /**
* The messages interception conditions conditions
* for the client
*/
diff --git a/src/mds-server/mds-server.c b/src/mds-server/mds-server.c
index 17128e1..24ec7ac 100644
--- a/src/mds-server/mds-server.c
+++ b/src/mds-server/mds-server.c
@@ -256,8 +256,21 @@ int main(int argc_, char** argv_)
/* Create mutex and condition for slave counter. */
- pthread_mutex_init(&slave_mutex, NULL);
- pthread_cond_init(&slave_cond, NULL);
+ if ((errno = pthread_mutex_init(&slave_mutex, NULL)) != 0)
+ {
+ perror(*argv);
+ fd_table_destroy(&client_map, NULL, NULL);
+ linked_list_destroy(&client_list);
+ return 1;
+ }
+ if ((errno = pthread_cond_init(&slave_cond, NULL)) != 0)
+ {
+ perror(*argv);
+ fd_table_destroy(&client_map, NULL, NULL);
+ linked_list_destroy(&client_list);
+ pthread_mutex_destroy(&slave_mutex);
+ return 1;
+ }
/* Unmarshal the state of the server. */
@@ -402,7 +415,6 @@ void* slave_loop(void* data)
ssize_t entry = LINKED_LIST_UNUSED;
size_t information_address = fd_table_get(&client_map, (size_t)socket_fd);
client_t* information = (client_t*)(void*)information_address;
- int mutex_created = 0;
char* msgbuf = NULL;
size_t n;
size_t tmp;
@@ -418,9 +430,10 @@ void* slave_loop(void* data)
goto fail;
}
- /* NULL-out pointers. */
+ /* NULL-out pointers and initialisation markers. */
information->interception_conditions = NULL;
information->send_pending = NULL;
+ information->mutex_created = 0;
/* Add to list of clients. */
pthread_mutex_lock(&slave_mutex);
@@ -460,8 +473,12 @@ void* slave_loop(void* data)
information->thread = pthread_self();
/* Create mutex to make sure two thread to not try to send
messages concurrently, and other slave local actions. */
- pthread_mutex_init(&(information->mutex), NULL);
- mutex_created = 1;
+ if ((errno = pthread_mutex_init(&(information->mutex), NULL)) != 0)
+ {
+ perror(*argv);
+ goto fail;
+ }
+ information->mutex_created = 1;
/* Make the server update without all slaves dying on SIGUSR1. */
@@ -561,7 +578,7 @@ void* slave_loop(void* data)
free(information->interception_conditions[i].condition);
free(information->interception_conditions);
}
- if (mutex_created)
+ if (information->mutex_created)
pthread_mutex_destroy(&(information->mutex));
mds_message_destroy(&(information->message));
free(information->send_pending);