/*
* Create a newly allocated user space probe event rule.
*
- * Returns a new event rule on success, NULL on failure. This event rule must be
- * destroyed using lttng_event_rule_destroy().
- */
-extern struct lttng_event_rule *lttng_event_rule_userspace_probe_create(void);
-
-/*
- * Set the location of a user space probe event rule.
- *
* The location is copied internally.
*
- * Returns LTTNG_EVENT_RULE_STATUS_OK on success, LTTNG_EVENT_RULE_STATUS_INVALID
- * if invalid parameters are passed.
+ * Returns a new event rule on success, NULL on failure. This event rule must be
+ * destroyed using lttng_event_rule_destroy().
*/
-extern enum lttng_event_rule_status lttng_event_rule_userspace_probe_set_location(
- struct lttng_event_rule *rule,
+extern struct lttng_event_rule *lttng_event_rule_userspace_probe_create(
const struct lttng_userspace_probe_location *location);
/*
goto error;
}
- res.er = lttng_event_rule_userspace_probe_create();
+ res.er = lttng_event_rule_userspace_probe_create(userspace_probe_location);
if (!res.er) {
ERR("Failed to create userspace probe event rule.");
goto error;
}
- event_rule_status = lttng_event_rule_userspace_probe_set_location(
- res.er, userspace_probe_location);
- if (event_rule_status != LTTNG_EVENT_RULE_STATUS_OK) {
- ERR("Failed to set user space probe event rule's location.");
- goto error;
- }
-
- event_rule_status =
- lttng_event_rule_userspace_probe_set_event_name(
- res.er, tracepoint_name);
+ event_rule_status = lttng_event_rule_userspace_probe_set_event_name(
+ res.er, tracepoint_name);
if (event_rule_status != LTTNG_EVENT_RULE_STATUS_OK) {
ERR("Failed to set user space probe event rule's name to '%s'.",
tracepoint_name);
return hash;
}
-struct lttng_event_rule *lttng_event_rule_userspace_probe_create(void)
+static
+int userspace_probe_set_location(
+ struct lttng_event_rule_userspace_probe *uprobe,
+ const struct lttng_userspace_probe_location *location)
+{
+ int ret;
+ struct lttng_userspace_probe_location *location_copy = NULL;
+
+ if (!uprobe || !location || uprobe->location) {
+ ret = -1;
+ goto end;
+ }
+
+ location_copy = lttng_userspace_probe_location_copy(location);
+ if (!location_copy) {
+ ret = -1;
+ goto end;
+ }
+
+ uprobe->location = location_copy;
+ location_copy = NULL;
+ ret = 0;
+end:
+ lttng_userspace_probe_location_destroy(location_copy);
+ return ret;
+}
+
+struct lttng_event_rule *lttng_event_rule_userspace_probe_create(
+ const struct lttng_userspace_probe_location *location)
{
struct lttng_event_rule *rule = NULL;
struct lttng_event_rule_userspace_probe *urule;
lttng_event_rule_userspace_probe_generate_exclusions;
urule->parent.hash = lttng_event_rule_userspace_probe_hash;
+ if (userspace_probe_set_location(urule, location)) {
+ lttng_event_rule_destroy(rule);
+ rule = NULL;
+ }
+
end:
return rule;
}
const char *name;
struct lttng_buffer_view current_buffer_view;
struct lttng_event_rule *rule = NULL;
- struct lttng_userspace_probe_location *location;
- struct lttng_event_rule_userspace_probe *uprobe;
+ struct lttng_userspace_probe_location *location = NULL;
enum lttng_event_rule_status status;
if (!_event_rule) {
}
uprobe_comm = (typeof(uprobe_comm)) current_buffer_view.data;
- rule = lttng_event_rule_userspace_probe_create();
- if (!rule) {
- ERR("Failed to create event rule uprobe");
- ret = -1;
- goto end;
- }
/* Skip to payload. */
offset += current_buffer_view.size;
/* Skip after the location. */
offset += uprobe_comm->location_len;
- uprobe = container_of(rule, struct lttng_event_rule_userspace_probe, parent);
- uprobe->location = location;
+ rule = lttng_event_rule_userspace_probe_create(location);
+ if (!rule) {
+ ERR("Failed to create event rule uprobe.");
+ ret = -1;
+ goto end;
+ }
status = lttng_event_rule_userspace_probe_set_event_name(rule, name);
if (status != LTTNG_EVENT_RULE_STATUS_OK) {
rule = NULL;
ret = offset;
end:
+ lttng_userspace_probe_location_destroy(location);
lttng_event_rule_destroy(rule);
return ret;
}
-enum lttng_event_rule_status lttng_event_rule_userspace_probe_set_location(
- struct lttng_event_rule *rule,
- const struct lttng_userspace_probe_location *location)
-{
- struct lttng_userspace_probe_location *location_copy = NULL;
- struct lttng_event_rule_userspace_probe *uprobe;
- enum lttng_event_rule_status status = LTTNG_EVENT_RULE_STATUS_OK;
-
- if (!rule || !IS_UPROBE_EVENT_RULE(rule) || !location) {
- status = LTTNG_EVENT_RULE_STATUS_INVALID;
- goto end;
- }
-
- uprobe = container_of(rule, struct lttng_event_rule_userspace_probe, parent);
- location_copy = lttng_userspace_probe_location_copy(location);
- if (!location_copy) {
- status = LTTNG_EVENT_RULE_STATUS_ERROR;
- goto end;
- }
-
- if (uprobe->location) {
- lttng_userspace_probe_location_destroy(uprobe->location);
- }
-
- uprobe->location = location_copy;
- location_copy = NULL;
-end:
- lttng_userspace_probe_location_destroy(location_copy);
- return status;
-}
enum lttng_event_rule_status lttng_event_rule_userspace_probe_get_location(
const struct lttng_event_rule *rule,
lttng_session_daemon_notification_endpoint);
ok(notification_channel, "Notification channel object creation");
- event_rule = lttng_event_rule_userspace_probe_create();
+ event_rule = lttng_event_rule_userspace_probe_create(probe_location);
ok(event_rule, "kprobe event rule object creation");
- event_rule_status = lttng_event_rule_userspace_probe_set_location(
- event_rule, probe_location);
- ok(event_rule_status == LTTNG_EVENT_RULE_STATUS_OK,
- "Setting uprobe event rule location");
-
event_rule_status = lttng_event_rule_userspace_probe_set_event_name(
event_rule, trigger_name);
ok(event_rule_status == LTTNG_EVENT_RULE_STATUS_OK,
{
const char *testapp_path, *test_symbol_name;
- plan_tests(13);
+ plan_tests(12);
if (argc < 7) {
fail("Missing parameter for tests to run %d", argc);
int lttng_opt_verbose;
int lttng_opt_mi;
-#define NUM_TESTS 185
+#define NUM_TESTS 184
struct tracepoint_test {
enum lttng_domain_type type;
lttng_payload_init(&payload);
- uprobe = lttng_event_rule_userspace_probe_create();
+ uprobe = lttng_event_rule_userspace_probe_create(probe_location);
ok(uprobe, "uprobe event rule object creation.");
- status = lttng_event_rule_userspace_probe_set_location(uprobe, probe_location);
- ok(status == LTTNG_EVENT_RULE_STATUS_OK,
- "Setting uprobe event rule location.");
-
status = lttng_event_rule_userspace_probe_get_location(
uprobe, &probe_location_tmp);
ok(status == LTTNG_EVENT_RULE_STATUS_OK,