ctf: allocate some structures with new
[babeltrace.git] / src / plugins / ctf / lttng-live / viewer-connection.cpp
index 4a761b2459f40725b5a970ac4fa5c596345b7643..61b8a8cfc005c68ea59ac4922e2ba42a07446dfa 100644 (file)
@@ -5,32 +5,25 @@
  * Copyright 2016 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
  */
 
-#define BT_COMP_LOG_SELF_COMP (viewer_connection->self_comp)
-#define BT_LOG_OUTPUT_LEVEL   (viewer_connection->log_level)
-#define BT_LOG_TAG            "PLUGIN/SRC.CTF.LTTNG-LIVE/VIEWER"
-#include "logging/comp-logging.h"
-
-#include <fcntl.h>
-#include <stdbool.h>
+#include <glib.h>
 #include <stdint.h>
 #include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <unistd.h>
 
-#include <glib.h>
+#include <babeltrace2/babeltrace.h>
+
+#define BT_COMP_LOG_SELF_COMP (viewer_connection->self_comp)
+#define BT_LOG_OUTPUT_LEVEL   ((enum bt_log_level) viewer_connection->log_level)
+#define BT_LOG_TAG            "PLUGIN/SRC.CTF.LTTNG-LIVE/VIEWER"
+#include "logging/comp-logging.h"
 
-#include "compat/socket.h"
-#include "compat/endian.h"
-#include "compat/compiler.h"
 #include "common/common.h"
-#include <babeltrace2/babeltrace.h>
+#include "compat/endian.h" /* IWYU pragma: keep  */
 
+#include "data-stream.hpp"
 #include "lttng-live.hpp"
-#include "viewer-connection.hpp"
 #include "lttng-viewer-abi.hpp"
-#include "data-stream.hpp"
 #include "metadata.hpp"
+#include "viewer-connection.hpp"
 
 #define viewer_handle_send_recv_status(_self_comp, _self_comp_class, _status, _action, _msg_str)   \
     do {                                                                                           \
@@ -336,7 +329,7 @@ static int parse_url(struct live_viewer_connection *viewer_connection)
     char error_buf[256] = {0};
     bt_self_component *self_comp = viewer_connection->self_comp;
     bt_self_component_class *self_comp_class = viewer_connection->self_comp_class;
-    struct bt_common_lttng_live_url_parts lttng_live_url_parts = {0};
+    struct bt_common_lttng_live_url_parts lttng_live_url_parts = {};
     int ret = -1;
     const char *path = viewer_connection->url->str;
 
@@ -793,7 +786,6 @@ end:
  *   }
  */
 
-BT_HIDDEN
 bt_component_class_query_method_status
 live_viewer_connection_list_sessions(struct live_viewer_connection *viewer_connection,
                                      const bt_value **user_result)
@@ -937,7 +929,6 @@ end:
     return status;
 }
 
-BT_HIDDEN
 enum lttng_live_viewer_status
 lttng_live_create_viewer_session(struct lttng_live_msg_iter *lttng_live_msg_iter)
 {
@@ -1015,8 +1006,7 @@ static enum lttng_live_viewer_status receive_streams(struct lttng_live_session *
         if (stream.metadata_flag) {
             BT_COMP_LOGI("    metadata stream %" PRIu64 " : %s/%s", stream_id, stream.path_name,
                          stream.channel_name);
-            if (lttng_live_metadata_create_stream(session, ctf_trace_id, stream_id,
-                                                  stream.path_name)) {
+            if (lttng_live_metadata_create_stream(session, ctf_trace_id, stream_id)) {
                 BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Error creating metadata stream");
                 status = LTTNG_LIVE_VIEWER_STATUS_ERROR;
                 goto end;
@@ -1040,7 +1030,6 @@ end:
     return status;
 }
 
-BT_HIDDEN
 enum lttng_live_viewer_status lttng_live_session_attach(struct lttng_live_session *session,
                                                         bt_self_message_iterator *self_msg_iter)
 {
@@ -1136,7 +1125,6 @@ end:
     return status;
 }
 
-BT_HIDDEN
 enum lttng_live_viewer_status lttng_live_session_detach(struct lttng_live_session *session)
 {
     struct lttng_viewer_cmd cmd;
@@ -1213,7 +1201,6 @@ end:
     return status;
 }
 
-BT_HIDDEN
 enum lttng_live_get_one_metadata_status
 lttng_live_get_one_metadata_packet(struct lttng_live_trace *trace, FILE *fp, size_t *reply_len)
 {
@@ -1288,6 +1275,17 @@ lttng_live_get_one_metadata_packet(struct lttng_live_trace *trace, FILE *fp, siz
     }
 
     len = be64toh(rp.len);
+    if (len == 0) {
+        /*
+         * We received a `LTTNG_VIEWER_METADATA_OK` with a packet
+         * length of 0. This means we must try again. This scenario
+         * arises when a clear command is performed on an lttng session.
+         */
+        BT_COMP_LOGD(
+            "Expecting a metadata packet of size 0. Retry to get a packet from the relay.");
+        goto empty_metadata_packet_retry;
+    }
+
     BT_COMP_LOGD("Writing %" PRIu64 " bytes to metadata", len);
     if (len <= 0) {
         BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Erroneous response length");
@@ -1319,6 +1317,7 @@ lttng_live_get_one_metadata_packet(struct lttng_live_trace *trace, FILE *fp, siz
         goto end;
     }
 
+empty_metadata_packet_retry:
     *reply_len = len;
     status = LTTNG_LIVE_GET_ONE_METADATA_STATUS_OK;
 
@@ -1359,7 +1358,6 @@ static void lttng_live_need_new_streams(struct lttng_live_msg_iter *lttng_live_m
     }
 }
 
-BT_HIDDEN
 enum lttng_live_iterator_status
 lttng_live_get_next_index(struct lttng_live_msg_iter *lttng_live_msg_iter,
                           struct lttng_live_stream_iterator *stream, struct packet_index *index)
@@ -1413,6 +1411,14 @@ lttng_live_get_next_index(struct lttng_live_msg_iter *lttng_live_msg_iter,
     BT_COMP_LOGD("Received response from relay daemon: cmd=%s, response=%s",
                  lttng_viewer_command_string(LTTNG_VIEWER_GET_NEXT_INDEX),
                  lttng_viewer_next_index_return_code_string(rp_status));
+
+    if (flags & LTTNG_VIEWER_FLAG_NEW_STREAM) {
+        BT_COMP_LOGD("Marking all sessions as possibly needing new streams: "
+                     "response=%s, response-flag=NEW_STREAM",
+                     lttng_viewer_next_index_return_code_string(rp_status));
+        lttng_live_need_new_streams(lttng_live_msg_iter);
+    }
+
     switch (rp_status) {
     case LTTNG_VIEWER_INDEX_INACTIVE:
     {
@@ -1444,7 +1450,6 @@ lttng_live_get_next_index(struct lttng_live_msg_iter *lttng_live_msg_iter,
             stream->ctf_stream_class_id.value = ctf_stream_class_id;
             stream->ctf_stream_class_id.is_set = true;
         }
-
         lttng_live_stream_iterator_set_state(stream, LTTNG_LIVE_STREAM_ACTIVE_DATA);
 
         if (flags & LTTNG_VIEWER_FLAG_NEW_METADATA) {
@@ -1453,12 +1458,6 @@ lttng_live_get_next_index(struct lttng_live_msg_iter *lttng_live_msg_iter,
                          lttng_viewer_next_index_return_code_string(rp_status), trace->id);
             trace->metadata_stream_state = LTTNG_LIVE_METADATA_STREAM_STATE_NEEDED;
         }
-        if (flags & LTTNG_VIEWER_FLAG_NEW_STREAM) {
-            BT_COMP_LOGD("Marking all sessions as possibly needing new streams: "
-                         "response=%s, response-flag=NEW_STREAM",
-                         lttng_viewer_next_index_return_code_string(rp_status));
-            lttng_live_need_new_streams(lttng_live_msg_iter);
-        }
         status = LTTNG_LIVE_ITERATOR_STATUS_OK;
         break;
     }
@@ -1486,6 +1485,7 @@ lttng_live_get_next_index(struct lttng_live_msg_iter *lttng_live_msg_iter,
         status = LTTNG_LIVE_ITERATOR_STATUS_ERROR;
         goto end;
     }
+
     goto end;
 
 error:
@@ -1494,7 +1494,6 @@ end:
     return status;
 }
 
-BT_HIDDEN
 enum ctf_msg_iter_medium_status
 lttng_live_get_stream_bytes(struct lttng_live_msg_iter *lttng_live_msg_iter,
                             struct lttng_live_stream_iterator *stream, uint8_t *buf,
@@ -1556,7 +1555,6 @@ lttng_live_get_stream_bytes(struct lttng_live_msg_iter *lttng_live_msg_iter,
         req_len = be32toh(rp.len);
         BT_COMP_LOGD("Got packet from relay daemon: response=%s, packet-len=%" PRIu64 "",
                      lttng_viewer_get_packet_return_code_string(rp_status), req_len);
-        status = CTF_MSG_ITER_MEDIUM_STATUS_OK;
         break;
     case LTTNG_VIEWER_GET_PACKET_RETRY:
         /* Unimplemented by relay daemon */
@@ -1618,7 +1616,6 @@ end:
 /*
  * Request new streams for a session.
  */
-BT_HIDDEN
 enum lttng_live_iterator_status
 lttng_live_session_get_new_streams(struct lttng_live_session *session,
                                    bt_self_message_iterator *self_msg_iter)
@@ -1712,16 +1709,14 @@ end:
     return status;
 }
 
-BT_HIDDEN
 enum lttng_live_viewer_status live_viewer_connection_create(
     bt_self_component *self_comp, bt_self_component_class *self_comp_class,
     bt_logging_level log_level, const char *url, bool in_query,
     struct lttng_live_msg_iter *lttng_live_msg_iter, struct live_viewer_connection **viewer)
 {
-    struct live_viewer_connection *viewer_connection;
     enum lttng_live_viewer_status status;
 
-    viewer_connection = g_new0(struct live_viewer_connection, 1);
+    live_viewer_connection *viewer_connection = new live_viewer_connection;
 
     if (bt_socket_init(log_level) != 0) {
         BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE(self_comp, self_comp_class,
@@ -1778,7 +1773,6 @@ end:
     return status;
 }
 
-BT_HIDDEN
 void live_viewer_connection_destroy(struct live_viewer_connection *viewer_connection)
 {
     bt_self_component *self_comp = viewer_connection->self_comp;
@@ -1815,7 +1809,7 @@ void live_viewer_connection_destroy(struct live_viewer_connection *viewer_connec
         g_string_free(viewer_connection->proto, true);
     }
 
-    g_free(viewer_connection);
+    delete viewer_connection;
 
     bt_socket_fini();
 
This page took 0.024919 seconds and 4 git commands to generate.