Fix: rotation: hang on destroy when using scheduled rotation based on timer
[lttng-tools.git] / src / bin / lttng-sessiond / cmd.c
index 5a6414ebbe4991f48b4450d64d31c32f1d1ce00e..6f3dd7177b2a2b5cf84661a9836f1be4807d9009 100644 (file)
@@ -431,14 +431,14 @@ static enum lttng_error_code list_lttng_ust_global_events(char *channel_name,
                tmp = lttng_event_create();
                if (!tmp) {
                        ret_code = LTTNG_ERR_NOMEM;
-                       goto end;
+                       goto error;
                }
 
                if (lttng_strncpy(tmp->name, uevent->attr.name,
                                LTTNG_SYMBOL_NAME_LEN)) {
                        ret_code = LTTNG_ERR_FATAL;
                        lttng_event_destroy(tmp);
-                       goto end;
+                       goto error;
                }
 
                tmp->name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0';
@@ -2650,31 +2650,43 @@ error:
 /*
  * Command LTTNG_LIST_TRACEPOINT_FIELDS processed by the client thread.
  */
-ssize_t cmd_list_tracepoint_fields(enum lttng_domain_type domain,
-               struct lttng_event_field **fields)
+enum lttng_error_code cmd_list_tracepoint_fields(enum lttng_domain_type domain,
+               struct lttng_dynamic_buffer *buffer, unsigned int *nb_fields)
 {
+       enum lttng_error_code ret_code;
        int ret;
-       ssize_t nb_fields = 0;
+       unsigned int i;
+       struct lttng_event_field *fields = NULL;
 
        switch (domain) {
        case LTTNG_DOMAIN_UST:
-               nb_fields = ust_app_list_event_fields(fields);
-               if (nb_fields < 0) {
-                       ret = LTTNG_ERR_UST_LIST_FAIL;
+               ret = ust_app_list_event_fields(&fields);
+               if (ret < 0) {
+                       ret_code = LTTNG_ERR_UST_LIST_FAIL;
                        goto error;
                }
                break;
        case LTTNG_DOMAIN_KERNEL:
        default:        /* fall-through */
-               ret = LTTNG_ERR_UND;
+               ret_code = LTTNG_ERR_UND;
                goto error;
        }
 
-       return nb_fields;
+       *nb_fields = ret;
+
+       for (i = 0; i < *nb_fields; i++) {
+               ret = lttng_event_field_serialize(&fields[i], buffer);
+               if (ret) {
+                       ret_code = -LTTNG_ERR_NOMEM;
+                       goto error;
+               }
+       }
+
+       ret_code = LTTNG_OK;
 
 error:
-       /* Return negative value to differentiate return code */
-       return -ret;
+       free(fields);
+       return ret_code;
 }
 
 enum lttng_error_code cmd_list_syscalls(
@@ -2854,7 +2866,7 @@ int cmd_start_trace(struct ltt_session *session)
         */
        session->rotated_after_last_stop = false;
 
-       if (session->rotate_timer_period) {
+       if (session->rotate_timer_period && !session->rotation_schedule_timer_enabled) {
                int int_ret = timer_session_rotation_schedule_timer_start(
                                session, session->rotate_timer_period);
 
@@ -3793,6 +3805,7 @@ enum lttng_error_code cmd_list_channels(enum lttng_domain_type domain,
                        extended->lost_packets = lost_packets;
 
                        ret = lttng_channel_serialize(channel, buffer);
+                       lttng_channel_destroy(channel);
                        if (ret) {
                                ret = -1;
                                break;
This page took 0.024746 seconds and 4 git commands to generate.