aboutsummaryrefslogtreecommitdiff
path: root/samples
diff options
context:
space:
mode:
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>2011-03-16 19:04:29 -0400
committerMathieu Desnoyers <mathieu.desnoyers@polymtl.ca>2011-03-16 19:04:29 -0400
commitfa1cc6aa284a3bae836b009e3816619852672834 (patch)
treec274c98ffc3646e5024dd4a28949b3bb421936ef /samples
parent4224a05e8598970a6455729ccc7dc02dbda4c6ee (diff)
lttng-instrumentation/markers-multi-probes-test
Markers : multi-probes test Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Diffstat (limited to 'samples')
-rw-r--r--samples/markers/Makefile2
-rw-r--r--samples/markers/test-multi.c116
2 files changed, 117 insertions, 1 deletions
diff --git a/samples/markers/Makefile b/samples/markers/Makefile
index 6d7231265f0..2244152159d 100644
--- a/samples/markers/Makefile
+++ b/samples/markers/Makefile
@@ -1,4 +1,4 @@
# builds the kprobes example kernel modules;
# then to use one (as root): insmod <module_name.ko>
-obj-$(CONFIG_SAMPLE_MARKERS) += probe-example.o marker-example.o
+obj-$(CONFIG_SAMPLE_MARKERS) += probe-example.o marker-example.o test-multi.o
diff --git a/samples/markers/test-multi.c b/samples/markers/test-multi.c
new file mode 100644
index 00000000000..98fb03cfd93
--- /dev/null
+++ b/samples/markers/test-multi.c
@@ -0,0 +1,116 @@
+/* test-multi.c
+ *
+ * Connects multiple callbacks.
+ *
+ * (C) Copyright 2007 Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
+ *
+ * This file is released under the GPLv2.
+ * See the file COPYING for more details.
+ */
+
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/marker.h>
+#include <asm/atomic.h>
+
+struct probe_data {
+ const char *name;
+ const char *format;
+ marker_probe_func *probe_func;
+};
+
+atomic_t eventb_count = ATOMIC_INIT(0);
+
+void probe_subsystem_eventa(void *probe_data, void *call_data,
+ const char *format, va_list *args)
+{
+ /* Increment counter */
+ atomic_inc(&eventb_count);
+}
+
+void probe_subsystem_eventb(void *probe_data, void *call_data,
+ const char *format, va_list *args)
+{
+ /* Increment counter */
+ atomic_inc(&eventb_count);
+}
+
+void probe_subsystem_eventc(void *probe_data, void *call_data,
+ const char *format, va_list *args)
+{
+ /* Increment counter */
+ atomic_inc(&eventb_count);
+}
+
+void probe_subsystem_eventd(void *probe_data, void *call_data,
+ const char *format, va_list *args)
+{
+ /* Increment counter */
+ atomic_inc(&eventb_count);
+}
+
+static struct probe_data probe_array[] =
+{
+ { .name = "test_multi",
+ .format = MARK_NOARGS,
+ .probe_func = (marker_probe_func*)0xa },
+ { .name = "test_multi",
+ .format = MARK_NOARGS,
+ .probe_func = (marker_probe_func*)0xb },
+ { .name = "test_multi",
+ .format = MARK_NOARGS,
+ .probe_func = (marker_probe_func*)0xc },
+ { .name = "test_multi",
+ .format = MARK_NOARGS,
+ .probe_func = (marker_probe_func*)0xd },
+ { .name = "test_multi",
+ .format = MARK_NOARGS,
+ .probe_func = (marker_probe_func*)0x10 },
+ { .name = "test_multi",
+ .format = MARK_NOARGS,
+ .probe_func = (marker_probe_func*)0x20 },
+ { .name = "test_multi",
+ .format = MARK_NOARGS,
+ .probe_func = (marker_probe_func*)0x30 },
+};
+
+static int __init probe_init(void)
+{
+ int result;
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(probe_array); i++) {
+ result = marker_probe_register(probe_array[i].name,
+ probe_array[i].format,
+ probe_array[i].probe_func, (void*)(long)i);
+ if (result)
+ printk(KERN_INFO "Unable to register probe %s\n",
+ probe_array[i].name);
+ }
+ return 0;
+}
+
+static void __exit probe_fini(void)
+{
+ int result;
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(probe_array); i++) {
+ result = marker_probe_unregister(probe_array[i].name,
+ probe_array[i].probe_func, (void*)(long)i);
+ if (result)
+ printk(KERN_INFO "Unable to unregister probe %s\n",
+ probe_array[i].name);
+ }
+ printk(KERN_INFO "Number of event b : %u\n",
+ atomic_read(&eventb_count));
+ marker_synchronize_unregister();
+}
+
+module_init(probe_init);
+module_exit(probe_fini);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Mathieu Desnoyers");
+MODULE_DESCRIPTION("SUBSYSTEM Probe");