X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Faction-executor.c;h=94b819c46e5e4baeef67caabe6f844a85d20b8c3;hp=853146d3b8b3bb6f77c3788cecfb2fa280f0409a;hb=3a5f70173aa04d11ccb22694d5d31a702cad33ab;hpb=f568738c649cb005c7d838166c864addbcc27571 diff --git a/src/bin/lttng-sessiond/action-executor.c b/src/bin/lttng-sessiond/action-executor.c index 853146d3b..94b819c46 100644 --- a/src/bin/lttng-sessiond/action-executor.c +++ b/src/bin/lttng-sessiond/action-executor.c @@ -77,7 +77,7 @@ struct action_work_item { * The actions to be executed with their respective execution context. * See struct `action_work_subitem`. */ - struct lttng_dynamic_array *subitems; + struct lttng_dynamic_array subitems; /* Execution context data */ struct lttng_trigger *trigger; @@ -169,7 +169,7 @@ static const char *get_action_name(const struct lttng_action *action) { const enum lttng_action_type action_type = lttng_action_get_type(action); - assert(action_type != LTTNG_ACTION_TYPE_UNKNOWN); + LTTNG_ASSERT(action_type != LTTNG_ACTION_TYPE_UNKNOWN); return lttng_action_type_string(action_type); } @@ -676,7 +676,7 @@ static int action_executor_generic_handler(struct action_executor *executor, struct lttng_action *action = item->action; const enum lttng_action_type action_type = lttng_action_get_type(action); - assert(action_type != LTTNG_ACTION_TYPE_UNKNOWN); + LTTNG_ASSERT(action_type != LTTNG_ACTION_TYPE_UNKNOWN); lttng_action_increase_execution_request_count(action); if (!lttng_action_should_execute(action)) { @@ -707,11 +707,11 @@ static int action_work_item_execute(struct action_executor *executor, DBG("Starting execution of action work item %" PRIu64 " of trigger `%s`", work_item->id, get_trigger_name(work_item->trigger)); - count = lttng_dynamic_array_get_count(work_item->subitems); + count = lttng_dynamic_array_get_count(&work_item->subitems); for (i = 0; i < count; i++) { struct action_work_subitem *item; - item = lttng_dynamic_array_get_element(work_item->subitems, i); + item = lttng_dynamic_array_get_element(&work_item->subitems, i); ret = action_executor_generic_handler( executor, work_item, item); if (ret) { @@ -729,8 +729,7 @@ static void action_work_item_destroy(struct action_work_item *work_item) lttng_trigger_put(work_item->trigger); lttng_evaluation_destroy(work_item->evaluation); notification_client_list_put(work_item->client_list); - lttng_dynamic_array_reset(work_item->subitems); - free(work_item->subitems); + lttng_dynamic_array_reset(&work_item->subitems); free(work_item); } @@ -738,7 +737,7 @@ static void *action_executor_thread(void *_data) { struct action_executor *executor = _data; - assert(executor); + LTTNG_ASSERT(executor); health_register(the_health_sessiond, HEALTH_SESSIOND_TYPE_ACTION_EXECUTOR); @@ -749,7 +748,7 @@ static void *action_executor_thread(void *_data) DBG("Entering work execution loop"); pthread_mutex_lock(&executor->work.lock); while (!executor->should_quit) { - int ret; + int ret = 0; struct action_work_item *work_item; health_code_update(); @@ -786,7 +785,7 @@ static void *action_executor_thread(void *_data) trigger_status = lttng_trigger_get_owner_uid( work_item->trigger, &trigger_owner_uid); - assert(trigger_status == LTTNG_TRIGGER_STATUS_OK); + LTTNG_ASSERT(trigger_status == LTTNG_TRIGGER_STATUS_OK); DBG("Work item skipped since the associated trigger is no longer registered: work item id = %" PRIu64 ", trigger name = '%s', trigger owner uid = %d", work_item->id, trigger_name, @@ -838,7 +837,7 @@ static void clean_up_action_executor_thread(void *_data) { struct action_executor *executor = _data; - assert(cds_list_empty(&executor->work.list)); + LTTNG_ASSERT(cds_list_empty(&executor->work.list)); pthread_mutex_destroy(&executor->work.lock); pthread_cond_destroy(&executor->work.cond); @@ -906,29 +905,8 @@ enum action_executor_status action_executor_enqueue_trigger( const uint64_t work_item_id = executor->next_work_item_id++; struct action_work_item *work_item; bool signal = false; - struct lttng_dynamic_array *subitems = NULL; - assert(trigger); - - /* Build the array of action work subitems for the passed trigger. */ - subitems = zmalloc(sizeof(*subitems)); - if (!subitems) { - PERROR("Failed to allocate action executor subitems array: trigger name = `%s`", - get_trigger_name(trigger)); - executor_status = ACTION_EXECUTOR_STATUS_ERROR; - goto error_unlock; - } - - lttng_dynamic_array_init(subitems, sizeof(struct action_work_subitem), - action_work_subitem_destructor); - - ret = populate_subitem_array_from_trigger(trigger, subitems); - if (ret) { - ERR("Failed to populate work item sub items on behalf of trigger: trigger name = `%s`", - get_trigger_name(trigger)); - executor_status = ACTION_EXECUTOR_STATUS_ERROR; - goto error_unlock; - } + LTTNG_ASSERT(trigger); pthread_mutex_lock(&executor->work.lock); /* Check for queue overflow. */ @@ -953,13 +931,11 @@ enum action_executor_status action_executor_enqueue_trigger( const bool reference_acquired = notification_client_list_get(client_list); - assert(reference_acquired); + LTTNG_ASSERT(reference_acquired); } *work_item = (typeof(*work_item)){ .id = work_item_id, - /* Ownership transferred to the work item. */ - .subitems = subitems, .trigger = trigger, /* Ownership transferred to the work item. */ .evaluation = evaluation, @@ -973,7 +949,21 @@ enum action_executor_status action_executor_enqueue_trigger( }; evaluation = NULL; - subitems = NULL; + + /* Build the array of action work subitems for the passed trigger. */ + lttng_dynamic_array_init(&work_item->subitems, + sizeof(struct action_work_subitem), + action_work_subitem_destructor); + + ret = populate_subitem_array_from_trigger( + trigger, &work_item->subitems); + if (ret) { + ERR("Failed to populate work item sub items on behalf of trigger: trigger name = `%s`", + get_trigger_name(trigger)); + executor_status = ACTION_EXECUTOR_STATUS_ERROR; + goto error_unlock; + } + cds_list_add_tail(&work_item->list_node, &executor->work.list); executor->work.pending_count++; DBG("Enqueued action for trigger: trigger name = `%s`, work item id = %" PRIu64, @@ -984,20 +974,16 @@ error_unlock: if (signal) { pthread_cond_signal(&executor->work.cond); } - pthread_mutex_unlock(&executor->work.lock); + pthread_mutex_unlock(&executor->work.lock); lttng_evaluation_destroy(evaluation); - if (subitems) { - lttng_dynamic_array_reset(subitems); - free(subitems); - } return executor_status; } static int add_action_to_subitem_array(struct lttng_action *action, struct lttng_dynamic_array *subitems) { - int ret; + int ret = 0; enum lttng_action_type type = lttng_action_get_type(action); const char *session_name = NULL; enum lttng_action_status status; @@ -1008,21 +994,21 @@ static int add_action_to_subitem_array(struct lttng_action *action, }, }; - assert(action); - assert(subitems); + LTTNG_ASSERT(action); + LTTNG_ASSERT(subitems); if (type == LTTNG_ACTION_TYPE_LIST) { unsigned int count, i; status = lttng_action_list_get_count(action, &count); - assert(status == LTTNG_ACTION_STATUS_OK); + LTTNG_ASSERT(status == LTTNG_ACTION_STATUS_OK); for (i = 0; i < count; i++) { struct lttng_action *inner_action = NULL; inner_action = lttng_action_list_borrow_mutable_at_index( action, i); - assert(inner_action); + LTTNG_ASSERT(inner_action); ret = add_action_to_subitem_array( inner_action, subitems); if (ret) { @@ -1044,22 +1030,22 @@ static int add_action_to_subitem_array(struct lttng_action *action, case LTTNG_ACTION_TYPE_START_SESSION: status = lttng_action_start_session_get_session_name( action, &session_name); - assert(status == LTTNG_ACTION_STATUS_OK); + LTTNG_ASSERT(status == LTTNG_ACTION_STATUS_OK); break; case LTTNG_ACTION_TYPE_STOP_SESSION: status = lttng_action_stop_session_get_session_name( action, &session_name); - assert(status == LTTNG_ACTION_STATUS_OK); + LTTNG_ASSERT(status == LTTNG_ACTION_STATUS_OK); break; case LTTNG_ACTION_TYPE_ROTATE_SESSION: status = lttng_action_rotate_session_get_session_name( action, &session_name); - assert(status == LTTNG_ACTION_STATUS_OK); + LTTNG_ASSERT(status == LTTNG_ACTION_STATUS_OK); break; case LTTNG_ACTION_TYPE_SNAPSHOT_SESSION: status = lttng_action_snapshot_session_get_session_name( action, &session_name); - assert(status == LTTNG_ACTION_STATUS_OK); + LTTNG_ASSERT(status == LTTNG_ACTION_STATUS_OK); break; case LTTNG_ACTION_TYPE_LIST: case LTTNG_ACTION_TYPE_UNKNOWN: @@ -1121,7 +1107,7 @@ static int populate_subitem_array_from_trigger(struct lttng_trigger *trigger, struct lttng_action *action; action = lttng_trigger_get_action(trigger); - assert(action); + LTTNG_ASSERT(action); return add_action_to_subitem_array(action, subitems); }