X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fevent-rule%2Fsyscall.c;fp=src%2Fcommon%2Fevent-rule%2Fsyscall.c;h=12aeacfcff9a88fbe4f4904a14b9502c692123d1;hp=fbaa65310a6966548690bbb7db65c9c6ca91712b;hb=57739a6b3247c7ded74522906e214eff0d6dc14c;hpb=19904669a9eb25cd4a0ccd3de82d3ac803dfe877 diff --git a/src/common/event-rule/syscall.c b/src/common/event-rule/syscall.c index fbaa65310..12aeacfcf 100644 --- a/src/common/event-rule/syscall.c +++ b/src/common/event-rule/syscall.c @@ -88,6 +88,7 @@ static int lttng_event_rule_syscall_serialize( syscall_comm.pattern_len = pattern_len; syscall_comm.filter_expression_len = filter_expression_len; + syscall_comm.emission_site_type = syscall->emission_site_type; ret = lttng_dynamic_buffer_append( &payload->buffer, &syscall_comm, sizeof(syscall_comm)); @@ -246,12 +247,25 @@ lttng_event_rule_syscall_hash( return hash; } -struct lttng_event_rule *lttng_event_rule_syscall_create(void) +struct lttng_event_rule *lttng_event_rule_syscall_create( + enum lttng_event_rule_syscall_emission_site_type + emission_site_type) { struct lttng_event_rule *rule = NULL; struct lttng_event_rule_syscall *syscall_rule; enum lttng_event_rule_status status; + /* Validate the emission site type */ + switch (emission_site_type) { + case LTTNG_EVENT_RULE_SYSCALL_EMISSION_SITE_ENTRY_EXIT: + case LTTNG_EVENT_RULE_SYSCALL_EMISSION_SITE_ENTRY: + case LTTNG_EVENT_RULE_SYSCALL_EMISSION_SITE_EXIT: + break; + default: + /* Invalid emission type */ + goto end; + } + syscall_rule = zmalloc(sizeof(struct lttng_event_rule_syscall)); if (!syscall_rule) { goto end; @@ -281,6 +295,9 @@ struct lttng_event_rule *lttng_event_rule_syscall_create(void) rule = NULL; } + /* Emission site type */ + syscall_rule->emission_site_type = emission_site_type; + end: return rule; } @@ -317,7 +334,7 @@ ssize_t lttng_event_rule_syscall_create_from_payload( } syscall_comm = (typeof(syscall_comm)) current_buffer_view.data; - rule = lttng_event_rule_syscall_create(); + rule = lttng_event_rule_syscall_create(syscall_comm->emission_site_type); if (!rule) { ERR("Failed to create event rule syscall"); ret = -1; @@ -500,3 +517,37 @@ enum lttng_event_rule_status lttng_event_rule_syscall_get_filter( end: return status; } +extern enum lttng_event_rule_syscall_emission_site_type +lttng_event_rule_syscall_get_emission_site_type( + const struct lttng_event_rule *rule) +{ + enum lttng_event_rule_syscall_emission_site_type emission_site_type = + LTTNG_EVENT_RULE_SYSCALL_EMISSION_SITE_UNKNOWN; + struct lttng_event_rule_syscall *syscall; + + if (!rule || !IS_SYSCALL_EVENT_RULE(rule)) { + goto end; + } + + syscall = container_of(rule, struct lttng_event_rule_syscall, parent); + emission_site_type = syscall->emission_site_type; + +end: + return emission_site_type; +} + +LTTNG_HIDDEN +const char *lttng_event_rule_syscall_emission_site_str( + enum lttng_event_rule_syscall_emission_site_type type) +{ + switch (type) { + case LTTNG_EVENT_RULE_SYSCALL_EMISSION_SITE_ENTRY: + return "entry"; + case LTTNG_EVENT_RULE_SYSCALL_EMISSION_SITE_ENTRY_EXIT: + return "entry+exit"; + case LTTNG_EVENT_RULE_SYSCALL_EMISSION_SITE_EXIT: + return "exit"; + default: + return "???"; + } +}