unloaded while probes are enabled.
Signed-off-by: Kris Van Hees <kris.van.hees@oracle.com>
#define _DT_TEST_H_
extern void dt_test_provide(void *, const dtrace_probedesc_t *);
-extern int dt_test_enable(void *arg, dtrace_id_t, void *);
-extern void dt_test_disable(void *arg, dtrace_id_t, void *);
+extern int _dt_test_enable(void *arg, dtrace_id_t, void *);
+extern void _dt_test_disable(void *arg, dtrace_id_t, void *);
extern void dt_test_destroy(void *, dtrace_id_t, void *);
extern dtrace_provider_id_t dt_test_id;
"dt_test", NULL, "test", 0, NULL);
}
-int dt_test_enable(void *arg, dtrace_id_t id, void *parg)
+int _dt_test_enable(void *arg, dtrace_id_t id, void *parg)
{
enabled = 1;
return 0;
}
-void dt_test_disable(void *arg, dtrace_id_t id, void *parg)
+void _dt_test_disable(void *arg, dtrace_id_t id, void *parg)
{
enabled = 0;
}
{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA },
};
+DT_PROVIDER_POPS(dt_test)
+
static dtrace_pops_t dt_test_pops = {
dt_test_provide,
NULL,
dt_test_destroy
};
-DT_PROVIDER_MODULE(dt_test, DTRACE_PRIV_USER);
+DT_PROVIDER_MODULE(dt_test, DTRACE_PRIV_USER)
extern int dtrace_badname(const char *);
extern void dtrace_cred2priv(const cred_t *, uint32_t *, uid_t *);
+#define DT_PROVIDER_POPS(name) \
+ static unsigned int name##_refc = 0; \
+ \
+ static int name##_enable(void *arg, dtrace_id_t id, void *parg) \
+ { \
+ int rc = 0; \
+ \
+ if (name##_refc++ == 0) { \
+ if ((rc = try_module_get(THIS_MODULE)) == 0) \
+ return 0; \
+ } \
+ \
+ if ((rc = _##name##_enable(arg, id, parg)) != 0) { \
+ if (--name##_refc == 0) \
+ module_put(THIS_MODULE); \
+ } \
+ \
+ return rc; \
+ } \
+ \
+ static void name##_disable(void *arg, dtrace_id_t id, void *parg) \
+ { \
+ _##name##_disable(arg, id, parg); \
+ \
+ if (--name##_refc == 0) \
+ module_put(THIS_MODULE); \
+ }
+
#define DT_PROVIDER_MODULE(name, priv) \
- dtrace_provider_id_t name##_id; \
+ dtrace_provider_id_t name##_id; \
\
static int __init name##_init(void) \
{ \
#define _PROFILE_H_
extern void profile_provide(void *, const dtrace_probedesc_t *);
-extern int profile_enable(void *, dtrace_id_t, void *);
-extern void profile_disable(void *, dtrace_id_t, void *);
+extern int _profile_enable(void *, dtrace_id_t, void *);
+extern void _profile_disable(void *, dtrace_id_t, void *);
extern int profile_usermode(void *, dtrace_id_t, void *);
extern void profile_destroy(void *, dtrace_id_t, void *);
profile_create(interval, name, kind);
}
-int profile_enable(void *arg, dtrace_id_t id, void *parg)
+int _profile_enable(void *arg, dtrace_id_t id, void *parg)
{
profile_probe_t *prof = parg;
cyc_omni_handler_t omni;
return 0;
}
-void profile_disable(void *arg, dtrace_id_t id, void *parg)
+void _profile_disable(void *arg, dtrace_id_t id, void *parg)
{
profile_probe_t *prof = parg;
{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON },
};
+DT_PROVIDER_POPS(profile)
+
static dtrace_pops_t profile_pops = {
profile_provide,
NULL,
}
}
-int sdt_enable(void *arg, dtrace_id_t id, void *parg)
+int _sdt_enable(void *arg, dtrace_id_t id, void *parg)
{
sdt_probe_t *sdp = parg;
return 0;
}
-void sdt_disable(void *arg, dtrace_id_t id, void *parg)
+void _sdt_disable(void *arg, dtrace_id_t id, void *parg)
{
sdt_probe_t *sdp = parg;
extern dtrace_mprovider_t sdt_providers[];
extern void sdt_provide_module(void *, struct module *);
-extern int sdt_enable(void *, dtrace_id_t, void *);
-extern void sdt_disable(void *, dtrace_id_t, void *);
+extern int _sdt_enable(void *, dtrace_id_t, void *);
+extern void _sdt_disable(void *, dtrace_id_t, void *);
extern void sdt_getargdesc(void *, dtrace_id_t, void *, dtrace_argdesc_t *);
extern uint64_t sdt_getarg(void *, dtrace_id_t, void *, int, int);
extern void sdt_destroy(void *, dtrace_id_t, void *);
{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_ISA },
};
+DT_PROVIDER_POPS(sdt)
+
static dtrace_pops_t sdt_pops = {
NULL,
sdt_provide_module,
#include "dtrace.h"
extern void systrace_provide(void *, const dtrace_probedesc_t *);
-extern int systrace_enable(void *arg, dtrace_id_t, void *);
-extern void systrace_disable(void *arg, dtrace_id_t, void *);
+extern int _systrace_enable(void *arg, dtrace_id_t, void *);
+extern void _systrace_disable(void *arg, dtrace_id_t, void *);
extern void systrace_destroy(void *, dtrace_id_t, void *);
extern dtrace_provider_id_t syscall_id;
}
}
-int systrace_enable(void *arg, dtrace_id_t id, void *parg)
+int _systrace_enable(void *arg, dtrace_id_t id, void *parg)
{
int sysnum = SYSTRACE_SYSNUM((uintptr_t)parg);
int enabled =
return 0;
}
-void systrace_disable(void *arg, dtrace_id_t id, void *parg)
+void _systrace_disable(void *arg, dtrace_id_t id, void *parg)
{
int sysnum = SYSTRACE_SYSNUM((uintptr_t)parg);
int enabled =
{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA },
};
+DT_PROVIDER_POPS(systrace)
+
static dtrace_pops_t syscall_pops = {
systrace_provide,
NULL,
systrace_destroy
};
-DT_PROVIDER_MODULE(syscall, DTRACE_PRIV_USER);
+DT_PROVIDER_MODULE(syscall, DTRACE_PRIV_USER)