Fix: add session_info object to sessions_ht
[lttng-tools.git] / src / bin / lttng-sessiond / notification-thread-events.c
index 05fe297449e01727c14fccd0b055032b0f3cbe84..0f43e380b20a0799e0e3c3a37a83d1fe4518e7d4 100644 (file)
@@ -715,6 +715,7 @@ int notification_thread_client_subscribe(struct notification_client *client,
                        client, state)) {
                WARN("[notification-thread] Evaluation of a condition on client subscription failed, aborting.");
                ret = -1;
+               free(client_list_element);
                goto end_unlock;
        }
 
@@ -1024,6 +1025,9 @@ struct session_info *find_or_create_session_info(
                                name, uid, gid);
                goto end;
        }
+
+       cds_lfht_add(state->sessions_ht, hash_key_str(name, lttng_ht_seed),
+                       &sessions->sessions_ht_node);
 end:
        rcu_read_unlock();
        return session;
@@ -2343,7 +2347,6 @@ int evaluate_condition(const struct lttng_condition *condition,
                break;
        case LTTNG_CONDITION_TYPE_SESSION_CONSUMED_SIZE:
                *evaluation = lttng_evaluation_session_consumed_size_create(
-                               condition_type,
                                latest_session_consumed_total);
                break;
        default:
@@ -2386,8 +2389,9 @@ int send_evaluation_to_clients(struct lttng_trigger *trigger,
        struct notification_client_list_element *client_list_element, *tmp;
        struct lttng_notification *notification;
        struct lttng_condition *condition;
-       ssize_t expected_notification_size, notification_size;
-       struct lttng_notification_channel_message msg;
+       struct lttng_notification_channel_message msg_header = {
+               .type = (int8_t) LTTNG_NOTIFICATION_CHANNEL_MESSAGE_TYPE_NOTIFICATION,
+       };
 
        lttng_dynamic_buffer_init(&msg_buffer);
 
@@ -2400,35 +2404,23 @@ int send_evaluation_to_clients(struct lttng_trigger *trigger,
                goto end;
        }
 
-       expected_notification_size = lttng_notification_serialize(notification,
-                       NULL);
-       if (expected_notification_size < 0) {
-               ERR("[notification-thread] Failed to get size of serialized notification");
-               ret = -1;
-               goto end;
-       }
-
-       msg.type = (int8_t) LTTNG_NOTIFICATION_CHANNEL_MESSAGE_TYPE_NOTIFICATION;
-       msg.size = (uint32_t) expected_notification_size;
-       ret = lttng_dynamic_buffer_append(&msg_buffer, &msg, sizeof(msg));
+       ret = lttng_dynamic_buffer_append(&msg_buffer, &msg_header,
+                       sizeof(msg_header));
        if (ret) {
                goto end;
        }
 
-       ret = lttng_dynamic_buffer_set_size(&msg_buffer,
-                       msg_buffer.size + expected_notification_size);
+       ret = lttng_notification_serialize(notification, &msg_buffer);
        if (ret) {
-               goto end;
-       }
-
-       notification_size = lttng_notification_serialize(notification,
-                       msg_buffer.data + sizeof(msg));
-       if (notification_size != expected_notification_size) {
                ERR("[notification-thread] Failed to serialize notification");
                ret = -1;
                goto end;
        }
 
+       /* Update payload size. */
+       ((struct lttng_notification_channel_message * ) msg_buffer.data)->size =
+                       (uint32_t) (msg_buffer.size - sizeof(msg_header));
+
        cds_list_for_each_entry_safe(client_list_element, tmp,
                        &client_list->list, node) {
                struct notification_client *client =
This page took 0.025317 seconds and 5 git commands to generate.