struct side_event_state {
uintptr_t enabled;
const struct side_callback *callbacks;
- uint32_t nr_callbacks;
};
struct side_event_description {
side_enum_t(enum side_loglevel, uint32_t) loglevel;
uint32_t nr_fields;
uint32_t nr_attr;
+ uint32_t nr_callbacks;
} SIDE_PACKED;
/* Event and type attributes */
side_event_state__##_identifier = { \
.enabled = 0, \
.callbacks = &side_empty_callback, \
- .nr_callbacks = 0, \
}; \
_linkage struct side_event_description __attribute__((section("side_event_description"))) \
_identifier = { \
.loglevel = SIDE_ENUM_INIT(_loglevel), \
.nr_fields = SIDE_ARRAY_SIZE(SIDE_PARAM(_fields)), \
.nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM_SELECT_ARG1(_, ##_attr, side_attr_list())), \
+ .nr_callbacks = 0, \
}; \
static const struct side_event_description *side_event_ptr__##_identifier \
__attribute__((section("side_event_description_ptr"), used)) = &(_identifier);
side_init();
pthread_mutex_lock(&side_lock);
event_state = side_ptr_get(desc->state);
- old_nr_cb = event_state->nr_callbacks;
+ old_nr_cb = desc->nr_callbacks;
if (old_nr_cb == UINT32_MAX) {
ret = SIDE_ERROR_INVAL;
goto unlock;
side_rcu_wait_grace_period(&rcu_gp);
if (old_nr_cb)
free(old_cb);
- event_state->nr_callbacks++;
+ desc->nr_callbacks++;
/* Increment concurrently with kernel setting the top bits. */
if (!old_nr_cb)
(void) __atomic_add_fetch(&event_state->enabled, 1, __ATOMIC_RELAXED);
ret = SIDE_ERROR_NOENT;
goto unlock;
}
- old_nr_cb = event_state->nr_callbacks;
+ old_nr_cb = desc->nr_callbacks;
old_cb = (struct side_callback *) event_state->callbacks;
if (old_nr_cb == 1) {
new_cb = (struct side_callback *) &side_empty_callback;
side_rcu_assign_pointer(event_state->callbacks, new_cb);
side_rcu_wait_grace_period(&rcu_gp);
free(old_cb);
- event_state->nr_callbacks--;
+ desc->nr_callbacks--;
/* Decrement concurrently with kernel setting the top bits. */
if (old_nr_cb == 1)
(void) __atomic_add_fetch(&event_state->enabled, -1, __ATOMIC_RELAXED);
void side_event_remove_callbacks(struct side_event_description *desc)
{
struct side_event_state *event_state = side_ptr_get(desc->state);
- uint32_t nr_cb = event_state->nr_callbacks;
+ uint32_t nr_cb = desc->nr_callbacks;
struct side_callback *old_cb;
if (!nr_cb)
* caution. This should not matter because instrumentation is
* unreachable.
*/
- event_state->nr_callbacks = 0;
+ desc->nr_callbacks = 0;
side_rcu_assign_pointer(event_state->callbacks, &side_empty_callback);
/*
* No need to wait for grace period because instrumentation is