Fix: Handle SIGBUS in sessiond and consumerd
[lttng-tools.git] / src / common / consumer / consumer.c
index 26fc819f6ee64c6d572ff2012ec1d1ff25922434..a903ff9d2a643cda5c090f23ea84829416a55292 100644 (file)
@@ -3382,6 +3382,7 @@ ssize_t lttng_consumer_read_subbuffer(struct lttng_consumer_stream *stream,
        ssize_t ret, written_bytes = 0;
        int rotation_ret;
        struct stream_subbuffer subbuffer = {};
+       enum get_next_subbuffer_status get_next_status;
 
        if (!locked_by_caller) {
                stream->read_subbuffer_ops.lock(stream);
@@ -3407,14 +3408,20 @@ ssize_t lttng_consumer_read_subbuffer(struct lttng_consumer_stream *stream,
                }
        }
 
-       ret = stream->read_subbuffer_ops.get_next_subbuffer(stream, &subbuffer);
-       if (ret) {
-               if (ret == -ENODATA) {
-                       /* Not an error. */
-                       ret = 0;
-                       goto sleep_stream;
-               }
+       get_next_status = stream->read_subbuffer_ops.get_next_subbuffer(
+                       stream, &subbuffer);
+       switch (get_next_status) {
+       case GET_NEXT_SUBBUFFER_STATUS_OK:
+               break;
+       case GET_NEXT_SUBBUFFER_STATUS_NO_DATA:
+               /* Not an error. */
+               ret = 0;
+               goto sleep_stream;
+       case GET_NEXT_SUBBUFFER_STATUS_ERROR:
+               ret = -1;
                goto end;
+       default:
+               abort();
        }
 
        ret = stream->read_subbuffer_ops.pre_consume_subbuffer(
@@ -4392,7 +4399,11 @@ int consumer_clear_buffer(struct lttng_consumer_stream *stream)
                break;
        case LTTNG_CONSUMER32_UST:
        case LTTNG_CONSUMER64_UST:
-               lttng_ustconsumer_clear_buffer(stream);
+               ret = lttng_ustconsumer_clear_buffer(stream);
+               if (ret < 0) {
+                       ERR("Failed to clear ust stream (ret = %d)", ret);
+                       goto end;
+               }
                break;
        default:
                ERR("Unknown consumer_data type");
@@ -5242,3 +5253,8 @@ error_unlock:
        pthread_mutex_unlock(&stream->lock);
        goto end_rcu_unlock;
 }
+
+void lttng_consumer_sigbus_handle(void *addr)
+{
+       lttng_ustconsumer_sigbus_handle(addr);
+}
This page took 0.029922 seconds and 5 git commands to generate.