Skip to content
Snippets Groups Projects
Commit e23a01ac authored by Matt Jordan's avatar Matt Jordan Committed by Gerrit Code Review
Browse files

Merge "taskprocessor: Fix race condition between unreferencing and finding."

parents fdc287ea fc4d4f53
No related branches found
No related tags found
No related merge requests found
...@@ -691,15 +691,25 @@ void *ast_taskprocessor_unreference(struct ast_taskprocessor *tps) ...@@ -691,15 +691,25 @@ void *ast_taskprocessor_unreference(struct ast_taskprocessor *tps)
return NULL; return NULL;
} }
/* To prevent another thread from finding and getting a reference to this
* taskprocessor we hold the singletons lock. If we didn't do this then
* they may acquire it and find that the listener has been shut down.
*/
ao2_lock(tps_singletons);
if (ao2_ref(tps, -1) > 3) { if (ao2_ref(tps, -1) > 3) {
ao2_unlock(tps_singletons);
return NULL; return NULL;
} }
/* If we're down to 3 references, then those must be: /* If we're down to 3 references, then those must be:
* 1. The reference we just got rid of * 1. The reference we just got rid of
* 2. The container * 2. The container
* 3. The listener * 3. The listener
*/ */
ao2_unlink(tps_singletons, tps); ao2_unlink_flags(tps_singletons, tps, OBJ_NOLOCK);
ao2_unlock(tps_singletons);
listener_shutdown(tps->listener); listener_shutdown(tps->listener);
return NULL; return NULL;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment