X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=liblttng-ust%2Ftracepoint.c;h=3abed871be7c8bc6ef68cd018dc49feceaf52075;hb=4e776b26f63c6ecd5c4622ae80d1970827a6b8b3;hp=85b14d2c176af0cbccaf9ad517cb0afc42ab6056;hpb=b6e4919f8a0787d493e23f4a67739f9038c75c0e;p=lttng-ust.git diff --git a/liblttng-ust/tracepoint.c b/liblttng-ust/tracepoint.c index 85b14d2c..3abed871 100644 --- a/liblttng-ust/tracepoint.c +++ b/liblttng-ust/tracepoint.c @@ -381,6 +381,43 @@ static void lib_update_tracepoints(void) } } +/** + * tracepoint_update_callsite_range - Update a callsite range + * @begin: beginning of the range + * @end: end of the range + * + * Updates the range of tracepoint call sites. + */ +static +void tracepoint_enable_callsite_range(struct tracepoint_callsite * const *begin, + struct tracepoint_callsite * const *end) +{ + struct tracepoint_callsite * const *iter; + int ret; + + for (iter = begin; iter < end; iter++) { + if (!*iter) + continue; /* skip dummy */ + ret = lttng_callsite_add(*iter); + assert(!ret); + } +} + +static +void tracepoint_disable_callsite_range(struct tracepoint_callsite * const *begin, + struct tracepoint_callsite * const *end) +{ + struct tracepoint_callsite * const *iter; + int ret; + + for (iter = begin; iter < end; iter++) { + if (!*iter) + continue; /* skip dummy */ + ret = lttng_callsite_remove(*iter); + assert(!ret); + } +} + /* * Update probes, removing the faulty probes. */ @@ -684,6 +721,43 @@ end: return 0; } +int tracepoint_register_lib_callsite(struct tracepoint_callsite * const *tp_start, + int tp_count) +{ + int real_count = 0; /* without dummy */ + + init_tracepoint(); + + tracepoint_enable_callsite_range(tp_start, tp_start + tp_count); + + if (ust_debug()) { + int i; + + for (i = 0; i < tp_count; i++) { + if (!tp_start[i]) /* Check for dummy */ + continue; + DBG("registered callsite for tracepoint \"%s\" at %s@%s:%u", + tp_start[i]->tp->name, + tp_start[i]->func, + tp_start[i]->file, + tp_start[i]->lineno); + real_count++; + } + } + DBG("just registered a tracepoint callsite section from %p and having %d call sites", + tp_start, real_count); + return 0; +} + +int tracepoint_unregister_lib_callsite(struct tracepoint_callsite * const *tp_start, + int tp_count) +{ + tracepoint_disable_callsite_range(tp_start, tp_start + tp_count); + DBG("just unregistered a tracepoints callsite section from %p", + tp_start); + return 0; +} + void init_tracepoint(void) { if (uatomic_xchg(&initialized, 1) == 1)