X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=src%2Fside.c;h=35a50015356031192171a57191b39eed61996c9a;hb=beea6e2ede93215d4afc49706329e6df12d53ace;hp=02cef042435616052228b5d98a7359728f77c038;hpb=451722267e0e623866445380d1a058b152f6178f;p=libside.git diff --git a/src/side.c b/src/side.c index 02cef04..35a5001 100644 --- a/src/side.c +++ b/src/side.c @@ -11,11 +11,19 @@ #include "list.h" /* Top 8 bits reserved for kernel tracer use. */ -#define SIDE_EVENT_ENABLED_KERNEL_MASK 0xFF000000 -#define SIDE_EVENT_ENABLED_KERNEL_USER_EVENT_MASK 0x80000000 +#if SIDE_BITS_PER_LONG == 64 +# define SIDE_EVENT_ENABLED_KERNEL_MASK 0xFF00000000000000ULL +# define SIDE_EVENT_ENABLED_KERNEL_USER_EVENT_MASK 0x8000000000000000ULL + +/* Allow 2^56 tracer references on an event. */ +# define SIDE_EVENT_ENABLED_USER_MASK 0x00FFFFFFFFFFFFFFULL +#else +# define SIDE_EVENT_ENABLED_KERNEL_MASK 0xFF000000UL +# define SIDE_EVENT_ENABLED_KERNEL_USER_EVENT_MASK 0x80000000UL /* Allow 2^24 tracer references on an event. */ -#define SIDE_EVENT_ENABLED_USER_MASK 0x00FFFFFF +# define SIDE_EVENT_ENABLED_USER_MASK 0x00FFFFFFUL +#endif struct side_events_register_handle { struct side_list_node node; @@ -59,7 +67,7 @@ void side_call(const struct side_event_description *desc, const struct side_arg_ { const struct side_callback *side_cb; unsigned int rcu_period; - uint32_t enabled; + uintptr_t enabled; if (side_unlikely(finalized)) return; @@ -88,7 +96,7 @@ void side_call_variadic(const struct side_event_description *desc, { const struct side_callback *side_cb; unsigned int rcu_period; - uint32_t enabled; + uintptr_t enabled; if (side_unlikely(finalized)) return; @@ -300,14 +308,13 @@ struct side_events_register_handle *side_events_register(struct side_event_descr static void side_event_remove_callbacks(struct side_event_description *desc) { - uint32_t nr_cb = *desc->enabled & SIDE_EVENT_ENABLED_USER_MASK; + uint32_t nr_cb = desc->nr_callbacks; struct side_callback *old_cb; if (!nr_cb) return; old_cb = (struct side_callback *) desc->callbacks; - if (desc->nr_callbacks) - (void) __atomic_add_fetch(desc->enabled, -1, __ATOMIC_RELAXED); + (void) __atomic_add_fetch(desc->enabled, -1, __ATOMIC_RELAXED); /* * Setting the state back to 0 cb and empty callbacks out of * caution. This should not matter because instrumentation is