Move nr_callbacks to event state
[libside.git] / src / side.c
index 643b273d1b8170d44ce97170db64c6cda187d163..e33800680550b1fa27b27a21e41237cf80cbab10 100644 (file)
@@ -155,7 +155,7 @@ int _side_tracer_callback_register(struct side_event_description *desc,
        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;
@@ -185,7 +185,7 @@ int _side_tracer_callback_register(struct side_event_description *desc,
        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);
@@ -239,7 +239,7 @@ static int _side_tracer_callback_unregister(struct side_event_description *desc,
                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;
@@ -259,7 +259,7 @@ static int _side_tracer_callback_unregister(struct side_event_description *desc,
        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);
@@ -317,15 +317,16 @@ static
 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);
        /*
@@ -333,7 +334,7 @@ void side_event_remove_callbacks(struct side_event_description *desc)
         * 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
This page took 0.02336 seconds and 4 git commands to generate.