static void *
tracepoint_entry_add_probe(struct tracepoint_entry *entry,
- void *probe, void *data)
+ void (*probe)(void), void *data)
{
int nr_probes = 0;
struct tracepoint_probe *old, *new;
}
static void *
-tracepoint_entry_remove_probe(struct tracepoint_entry *entry, void *probe,
- void *data)
+tracepoint_entry_remove_probe(struct tracepoint_entry *entry,
+ void (*probe)(void), void *data)
{
int nr_probes = 0, nr_del = 0, i;
struct tracepoint_probe *old, *new;
}
}
+/**
+ * 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.
*/
}
static struct tracepoint_probe *
-tracepoint_add_probe(const char *name, void *probe, void *data,
+tracepoint_add_probe(const char *name, void (*probe)(void), void *data,
const char *signature)
{
struct tracepoint_entry *entry;
* The probe address must at least be aligned on the architecture pointer size.
* Called with the tracepoint mutex held.
*/
-int __tracepoint_probe_register(const char *name, void *probe, void *data,
- const char *signature)
+int __tracepoint_probe_register(const char *name, void (*probe)(void),
+ void *data, const char *signature)
{
void *old;
int ret = 0;
return ret;
}
-static void *tracepoint_remove_probe(const char *name, void *probe, void *data)
+static void *tracepoint_remove_probe(const char *name, void (*probe)(void),
+ void *data)
{
struct tracepoint_entry *entry;
void *old;
* @probe: probe function pointer
* @probe: probe data pointer
*/
-int __tracepoint_probe_unregister(const char *name, void *probe, void *data)
+int __tracepoint_probe_unregister(const char *name, void (*probe)(void),
+ void *data)
{
void *old;
int ret = 0;
*
* caller must call tracepoint_probe_update_all()
*/
-int tracepoint_probe_register_noupdate(const char *name, void *probe,
+int tracepoint_probe_register_noupdate(const char *name, void (*probe)(void),
void *data, const char *signature)
{
void *old;
* caller must call tracepoint_probe_update_all()
* Called with the tracepoint mutex held.
*/
-int tracepoint_probe_unregister_noupdate(const char *name, void *probe,
+int tracepoint_probe_unregister_noupdate(const char *name, void (*probe)(void),
void *data)
{
void *old;
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@%p:%s:%u",
+ tp_start[i]->name,
+ tp_start[i]->func,
+ tp_start[i]->ip,
+ 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)