diff options
-rw-r--r-- | src/test/modules/injection_points/injection_points.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/src/test/modules/injection_points/injection_points.c b/src/test/modules/injection_points/injection_points.c index ace386da50b..a74a4a28afd 100644 --- a/src/test/modules/injection_points/injection_points.c +++ b/src/test/modules/injection_points/injection_points.c @@ -159,10 +159,39 @@ injection_point_allowed(const char *name) static void injection_points_cleanup(int code, Datum arg) { + char names[INJ_MAX_CONDITION][INJ_NAME_MAXLEN] = {0}; + int count = 0; + /* Leave if nothing is tracked locally */ if (!injection_point_local) return; + /* + * This is done in three steps: detect the points to detach, detach them + * and release their conditions. + */ + SpinLockAcquire(&inj_state->lock); + for (int i = 0; i < INJ_MAX_CONDITION; i++) + { + InjectionPointCondition *condition = &inj_state->conditions[i]; + + if (condition->name[0] == '\0') + continue; + + if (condition->pid != MyProcPid) + continue; + + /* Extract the point name to detach */ + strlcpy(names[count], condition->name, INJ_NAME_MAXLEN); + count++; + } + SpinLockRelease(&inj_state->lock); + + /* Detach, without holding the spinlock */ + for (int i = 0; i < count; i++) + InjectionPointDetach(names[i]); + + /* Clear all the conditions */ SpinLockAcquire(&inj_state->lock); for (int i = 0; i < INJ_MAX_CONDITION; i++) { @@ -174,8 +203,6 @@ injection_points_cleanup(int code, Datum arg) if (condition->pid != MyProcPid) continue; - /* Detach the injection point and unregister condition */ - InjectionPointDetach(condition->name); condition->name[0] = '\0'; condition->pid = 0; } |