ustd: update ustd signal handling to avoid wakeups every 100 ms
authorPierre-Marc Fournier <pierre-marc.fournier@polymtl.ca>
Tue, 16 Mar 2010 22:44:33 +0000 (18:44 -0400)
committerPierre-Marc Fournier <pierre-marc.fournier@polymtl.ca>
Tue, 16 Mar 2010 22:44:33 +0000 (18:44 -0400)
libustcomm/ustcomm.c
ustd/ustd.c

index 461766daed492ab58245f475d64631662866ea6e..155dfd0087c53aaba52fa866f87f9eca7a1c457d 100644 (file)
@@ -247,9 +247,13 @@ static int recv_message_fd(int fd, char **recv_buf, int *recv_buf_size, int *rec
                                *recv_buf_size = 0;
                                return 0;
                        }
-                       /* real error */
-                       PERROR("recv");
-                       return -1;
+                       else if(errno == EINTR) {
+                               return -1;
+                       }
+                       else {
+                               PERROR("recv");
+                               return -1;
+                       }
                }
                if(result == 0) {
                        return 0;
@@ -348,15 +352,18 @@ int ustcomm_recv_message(struct ustcomm_server *server, char **msg, struct ustco
                        idx++;
                }
 
-               while((result = poll(fds, n_fds, timeout)) == -1 && errno == EINTR)
-                       /* nothing */;
-               if(result == -1) {
+               result = poll(fds, n_fds, timeout);
+               if(result == -1 && errno == EINTR) {
+                       /* That's ok. ustd receives signals to notify it must shutdown. */
+                       retval = -1;
+                       goto free_conn_table_return;
+               }
+               else if(result == -1) {
                        PERROR("poll");
                        retval = -1;
                        goto free_conn_table_return;
                }
-
-               if(result == 0) {
+               else if(result == 0) {
                        retval = 0;
                        goto free_conn_table_return;
                }
index c1dd0cb83d87c2ffd451b4860d70fdd66c985f10..ce6f7e211ea67acffa4cc45c24c6c1dc5b5ecb07 100644 (file)
@@ -549,9 +549,33 @@ void *consumer_thread(void *arg)
 {
        struct buffer_info *buf = (struct buffer_info *) arg;
        struct consumer_thread_args *args = (struct consumer_thread_args *) arg;
+       int result;
+       sigset_t sigset;
 
        DBG("GOT ARGS: pid %d bufname %s", args->pid, args->bufname);
 
+       /* Block signals that should be handled by the main thread. */
+       result = sigemptyset(&sigset);
+       if(result == -1) {
+               PERROR("sigemptyset");
+               goto end;
+       }
+       result = sigaddset(&sigset, SIGTERM);
+       if(result == -1) {
+               PERROR("sigaddset");
+               goto end;
+       }
+       result = sigaddset(&sigset, SIGINT);
+       if(result == -1) {
+               PERROR("sigaddset");
+               goto end;
+       }
+       result = sigprocmask(SIG_BLOCK, &sigset, NULL);
+       if(result == -1) {
+               PERROR("sigprocmask");
+               goto end;
+       }
+
        buf = connect_buffer(args->pid, args->bufname);
        if(buf == NULL) {
                ERR("failed to connect to buffer");
@@ -693,6 +717,7 @@ int start_ustd(int fd)
        int result;
        sigset_t sigset;
        struct sigaction sa;
+       int timeout = -1;
 
        result = sigemptyset(&sigset);
        if(result == -1) {
@@ -701,7 +726,7 @@ int start_ustd(int fd)
        }
        sa.sa_handler = sigterm_handler;
        sa.sa_mask = sigset;
-       sa.sa_flags = SA_RESTART;
+       sa.sa_flags = 0;
        result = sigaction(SIGTERM, &sa, NULL);
        if(result == -1) {
                PERROR("sigaction");
@@ -768,12 +793,16 @@ int start_ustd(int fd)
                char *recvbuf;
 
                /* check for requests on our public socket */
-               result = ustcomm_ustd_recv_message(&ustd, &recvbuf, NULL, 100);
-               if(result == -1) {
+               result = ustcomm_ustd_recv_message(&ustd, &recvbuf, NULL, timeout);
+               if(result == -1 && errno == EINTR) {
+                       /* Caught signal */
+                       printf("Caught signal\n");
+               }
+               else if(result == -1) {
                        ERR("error in ustcomm_ustd_recv_message");
                        goto loop_end;
                }
-               if(result > 0) {
+               else if(result > 0) {
                        if(!strncmp(recvbuf, "collect", 7)) {
                                pid_t pid;
                                char *bufname;
@@ -810,6 +839,7 @@ int start_ustd(int fd)
                                break;
                        }
                        pthread_mutex_unlock(&active_buffers_mutex);
+                       timeout = 100;
                }
        }
 
This page took 0.03717 seconds and 4 git commands to generate.