Fix: restart consumerd and sessiond when interrupted in poll()
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 24 Feb 2012 19:26:30 +0000 (14:26 -0500)
committerDavid Goulet <dgoulet@efficios.com>
Mon, 27 Feb 2012 18:55:12 +0000 (13:55 -0500)
When poll() is interrupted (e.g. by a debugger attaching), it should
restart instead of exiting with an error.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: David Goulet <dgoulet@efficios.com>
src/bin/lttng-sessiond/main.c
src/common/consumer.c

index a8156cf12ed87f3f33a90f3e3fef8cf818f72420..93417bca04fe213276ed88189d07e11e72a404b3 100644 (file)
@@ -831,8 +831,15 @@ static void *thread_manage_kernel(void *data)
                lttng_poll_reset(&events);
 
                /* Poll infinite value of time */
                lttng_poll_reset(&events);
 
                /* Poll infinite value of time */
+       restart:
                ret = lttng_poll_wait(&events, -1);
                if (ret < 0) {
                ret = lttng_poll_wait(&events, -1);
                if (ret < 0) {
+                       /*
+                        * Restart interrupted system call.
+                        */
+                       if (errno == EINTR) {
+                               goto restart;
+                       }
                        goto error;
                } else if (ret == 0) {
                        /* Should not happen since timeout is infinite */
                        goto error;
                } else if (ret == 0) {
                        /* Should not happen since timeout is infinite */
@@ -922,8 +929,15 @@ static void *thread_manage_consumer(void *data)
        nb_fd = LTTNG_POLL_GETNB(&events);
 
        /* Inifinite blocking call, waiting for transmission */
        nb_fd = LTTNG_POLL_GETNB(&events);
 
        /* Inifinite blocking call, waiting for transmission */
+restart:
        ret = lttng_poll_wait(&events, -1);
        if (ret < 0) {
        ret = lttng_poll_wait(&events, -1);
        if (ret < 0) {
+               /*
+                * Restart interrupted system call.
+                */
+               if (errno == EINTR) {
+                       goto restart;
+               }
                goto error;
        }
 
                goto error;
        }
 
@@ -993,8 +1007,15 @@ static void *thread_manage_consumer(void *data)
        nb_fd = LTTNG_POLL_GETNB(&events);
 
        /* Inifinite blocking call, waiting for transmission */
        nb_fd = LTTNG_POLL_GETNB(&events);
 
        /* Inifinite blocking call, waiting for transmission */
+restart_poll:
        ret = lttng_poll_wait(&events, -1);
        if (ret < 0) {
        ret = lttng_poll_wait(&events, -1);
        if (ret < 0) {
+               /*
+                * Restart interrupted system call.
+                */
+               if (errno == EINTR) {
+                       goto restart_poll;
+               }
                goto error;
        }
 
                goto error;
        }
 
@@ -1077,8 +1098,15 @@ static void *thread_manage_apps(void *data)
                DBG("Apps thread polling on %d fds", nb_fd);
 
                /* Inifinite blocking call, waiting for transmission */
                DBG("Apps thread polling on %d fds", nb_fd);
 
                /* Inifinite blocking call, waiting for transmission */
+       restart:
                ret = lttng_poll_wait(&events, -1);
                if (ret < 0) {
                ret = lttng_poll_wait(&events, -1);
                if (ret < 0) {
+                       /*
+                        * Restart interrupted system call.
+                        */
+                       if (errno == EINTR) {
+                               goto restart;
+                       }
                        goto error;
                }
 
                        goto error;
                }
 
@@ -1296,8 +1324,15 @@ static void *thread_registration_apps(void *data)
                nb_fd = LTTNG_POLL_GETNB(&events);
 
                /* Inifinite blocking call, waiting for transmission */
                nb_fd = LTTNG_POLL_GETNB(&events);
 
                /* Inifinite blocking call, waiting for transmission */
+       restart:
                ret = lttng_poll_wait(&events, -1);
                if (ret < 0) {
                ret = lttng_poll_wait(&events, -1);
                if (ret < 0) {
+                       /*
+                        * Restart interrupted system call.
+                        */
+                       if (errno == EINTR) {
+                               goto restart;
+                       }
                        goto error;
                }
 
                        goto error;
                }
 
@@ -3594,8 +3629,15 @@ static void *thread_manage_clients(void *data)
                nb_fd = LTTNG_POLL_GETNB(&events);
 
                /* Inifinite blocking call, waiting for transmission */
                nb_fd = LTTNG_POLL_GETNB(&events);
 
                /* Inifinite blocking call, waiting for transmission */
+       restart:
                ret = lttng_poll_wait(&events, -1);
                if (ret < 0) {
                ret = lttng_poll_wait(&events, -1);
                if (ret < 0) {
+                       /*
+                        * Restart interrupted system call.
+                        */
+                       if (errno == EINTR) {
+                               goto restart;
+                       }
                        goto error;
                }
 
                        goto error;
                }
 
index b605591e478a1c2a40dd13a25228bd2ad80bc684..ec59401053a18bf510c2748fff843b137e5ccee2 100644 (file)
@@ -492,8 +492,15 @@ int lttng_consumer_poll_socket(struct pollfd *consumer_sockpoll)
 {
        int num_rdy;
 
 {
        int num_rdy;
 
+restart:
        num_rdy = poll(consumer_sockpoll, 2, -1);
        if (num_rdy == -1) {
        num_rdy = poll(consumer_sockpoll, 2, -1);
        if (num_rdy == -1) {
+               /*
+                * Restart interrupted system call.
+                */
+               if (errno == EINTR) {
+                       goto restart;
+               }
                perror("Poll error");
                goto exit;
        }
                perror("Poll error");
                goto exit;
        }
@@ -896,10 +903,17 @@ void *lttng_consumer_thread_poll_fds(void *data)
                pthread_mutex_unlock(&consumer_data.lock);
 
                /* poll on the array of fds */
                pthread_mutex_unlock(&consumer_data.lock);
 
                /* poll on the array of fds */
+       restart:
                DBG("polling on %d fd", nb_fd + 1);
                num_rdy = poll(pollfd, nb_fd + 1, consumer_poll_timeout);
                DBG("poll num_rdy : %d", num_rdy);
                if (num_rdy == -1) {
                DBG("polling on %d fd", nb_fd + 1);
                num_rdy = poll(pollfd, nb_fd + 1, consumer_poll_timeout);
                DBG("poll num_rdy : %d", num_rdy);
                if (num_rdy == -1) {
+                       /*
+                        * Restart interrupted system call.
+                        */
+                       if (errno == EINTR) {
+                               goto restart;
+                       }
                        perror("Poll error");
                        lttng_consumer_send_error(ctx, CONSUMERD_POLL_ERROR);
                        goto end;
                        perror("Poll error");
                        lttng_consumer_send_error(ctx, CONSUMERD_POLL_ERROR);
                        goto end;
This page took 0.029713 seconds and 4 git commands to generate.