diff options
-rw-r--r-- | src/mds-server.c | 71 | ||||
-rw-r--r-- | src/mds-server.h | 6 |
2 files changed, 57 insertions, 20 deletions
diff --git a/src/mds-server.c b/src/mds-server.c index 1349ee3..55abea6 100644 --- a/src/mds-server.c +++ b/src/mds-server.c @@ -84,6 +84,11 @@ static pthread_mutex_t slave_mutex; static pthread_cond_t slave_cond; /** + * The thread that runs the master loop + */ +static pthread_t master_thread; + +/** * Map from client socket file descriptor to all information (client_t) */ static fd_table_t client_map; @@ -258,6 +263,10 @@ int main(int argc_, char** argv_) } + /* Store the current thread so it can be killed from elsewhere. */ + master_thread = pthread_self(); + + /* Make the server update without all slaves dying on SIGUSR1. */ { struct sigaction action; @@ -467,24 +476,6 @@ void* slave_loop(void* data) int r; - /* Make the server update without all slaves dying on SIGUSR1. */ - { - struct sigaction action; - sigset_t sigset; - - sigemptyset(&sigset); - action.sa_handler = sigusr1_trap; - action.sa_mask = sigset; - action.sa_flags = 0; - - if (sigaction(SIGUSR1, &action, NULL) < 0) - { - perror(*argv); - goto fail; - } - } - - if (information == NULL) { /* Create information table. */ @@ -526,6 +517,28 @@ void* slave_loop(void* data) } + /* Store the thread so that other threads can kill it. */ + information->thread = pthread_self(); + + + /* Make the server update without all slaves dying on SIGUSR1. */ + { + struct sigaction action; + sigset_t sigset; + + sigemptyset(&sigset); + action.sa_handler = sigusr1_trap; + action.sa_mask = sigset; + action.sa_flags = 0; + + if (sigaction(SIGUSR1, &action, NULL) < 0) + { + perror(*argv); + goto fail; + } + } + + /* Fetch messages from the slave. */ if (information->open) while (reexecing == 0) @@ -695,12 +708,30 @@ void run_initrc(char** args) * * @param signo The caught signal */ -void sigusr1_trap(int signo __attribute__((unused))) +void sigusr1_trap(int signo) { if (reexecing == 0) { + pthread_t current_thread; + ssize_t node; + reexecing = 1; - /* TODO send the signal to all threads. */ + current_thread = pthread_self(); + + if (pthread_equal(current_thread, master_thread) == 0) + pthread_kill(master_thread, signo); + + with_mutex(slave_mutex, + for (node = client_list.edge;;) + { + client_t* value; + if ((node = client_list.next[node]) == client_list.edge) + break; + + value = (client_t*)(void*)(client_list.values[node]); + if (pthread_equal(current_thread, value->thread) == 0) + pthread_kill(value->thread, signo); + }); } } diff --git a/src/mds-server.h b/src/mds-server.h index 851d391..67e97f6 100644 --- a/src/mds-server.h +++ b/src/mds-server.h @@ -22,6 +22,7 @@ #include <libmdsserver/mds-message.h> #include <stdlib.h> +#include <pthread.h> /** @@ -49,6 +50,11 @@ typedef struct client */ mds_message_t message; + /** + * The read thread for the client + */ + pthread_t thread; + } client_t; |