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