.p = { \
.version = SIDE_EVENT_STATE_ABI_VERSION, \
}, \
+ .nr_callbacks = 0, \
.enabled = 0, \
.callbacks = &side_empty_callback, \
.desc = &(_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);
if (side_unlikely(event_state->version != 0))
abort();
es0 = side_container_of(event_state, struct side_event_state_0, p);
- old_nr_cb = desc->nr_callbacks;
+ old_nr_cb = es0->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);
- desc->nr_callbacks++;
+ es0->nr_callbacks++;
/* Increment concurrently with kernel setting the top bits. */
if (!old_nr_cb)
(void) __atomic_add_fetch(&es0->enabled, 1, __ATOMIC_RELAXED);
ret = SIDE_ERROR_NOENT;
goto unlock;
}
- old_nr_cb = desc->nr_callbacks;
+ old_nr_cb = es0->nr_callbacks;
old_cb = (struct side_callback *) es0->callbacks;
if (old_nr_cb == 1) {
new_cb = (struct side_callback *) &side_empty_callback;
side_rcu_assign_pointer(es0->callbacks, new_cb);
side_rcu_wait_grace_period(&rcu_gp);
free(old_cb);
- desc->nr_callbacks--;
+ es0->nr_callbacks--;
/* Decrement concurrently with kernel setting the top bits. */
if (old_nr_cb == 1)
(void) __atomic_add_fetch(&es0->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 = desc->nr_callbacks;
struct side_event_state_0 *es0;
struct side_callback *old_cb;
+ uint32_t nr_cb;
- if (!nr_cb)
- return;
if (side_unlikely(event_state->version != 0))
abort();
es0 = side_container_of(event_state, struct side_event_state_0, p);
+ nr_cb = es0->nr_callbacks;
+ if (!nr_cb)
+ return;
old_cb = (struct side_callback *) es0->callbacks;
(void) __atomic_add_fetch(&es0->enabled, -1, __ATOMIC_RELAXED);
/*
* caution. This should not matter because instrumentation is
* unreachable.
*/
- desc->nr_callbacks = 0;
+ es0->nr_callbacks = 0;
side_rcu_assign_pointer(es0->callbacks, &side_empty_callback);
/*
* No need to wait for grace period because instrumentation is