summaryrefslogtreecommitdiff
path: root/main/sorcery.c
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2013-12-03 17:35:54 +0000
committerRichard Mudgett <rmudgett@digium.com>2013-12-03 17:35:54 +0000
commit3357c494cb21f24b7185ee3b255bc0cd72d48a55 (patch)
tree8a188ee6573bbf63fce7cd1b9d28a7d2d31c8047 /main/sorcery.c
parent8e8b329e14ad2e4d747c4c4eb33c118305401aee (diff)
sorcery, bucket: Change observer remove calls to take const callbacks struct.
* Make ast_sorcery_observer_remove() accept a const callbacks struct. * Make ast_sorcery_observer_remove() tolerant of the sorcery parameter being NULL. Now it can be called within a module unload routine if the sorcery initialization fails. * Fix ast_sorcery_observer_add() to fail if the container link fails. ........ Merged revisions 403324 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@403327 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/sorcery.c')
-rw-r--r--main/sorcery.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/main/sorcery.c b/main/sorcery.c
index 99ee2a90e..845ae6149 100644
--- a/main/sorcery.c
+++ b/main/sorcery.c
@@ -1526,6 +1526,7 @@ int ast_sorcery_observer_add(const struct ast_sorcery *sorcery, const char *type
{
RAII_VAR(struct ast_sorcery_object_type *, object_type, ao2_find(sorcery->types, type, OBJ_KEY), ao2_cleanup);
struct ast_sorcery_object_type_observer *observer;
+ int res;
if (!object_type || !callbacks) {
return -1;
@@ -1536,10 +1537,13 @@ int ast_sorcery_observer_add(const struct ast_sorcery *sorcery, const char *type
}
observer->callbacks = callbacks;
- ao2_link(object_type->observers, observer);
+ res = 0;
+ if (!ao2_link(object_type->observers, observer)) {
+ res = -1;
+ }
ao2_ref(observer, -1);
- return 0;
+ return res;
}
/*! \brief Internal callback function for removing an observer */
@@ -1550,13 +1554,19 @@ static int sorcery_observer_remove(void *obj, void *arg, int flags)
return (observer->callbacks == arg) ? CMP_MATCH | CMP_STOP : 0;
}
-void ast_sorcery_observer_remove(const struct ast_sorcery *sorcery, const char *type, struct ast_sorcery_observer *callbacks)
+void ast_sorcery_observer_remove(const struct ast_sorcery *sorcery, const char *type, const struct ast_sorcery_observer *callbacks)
{
- RAII_VAR(struct ast_sorcery_object_type *, object_type, ao2_find(sorcery->types, type, OBJ_KEY), ao2_cleanup);
+ RAII_VAR(struct ast_sorcery_object_type *, object_type, NULL, ao2_cleanup);
+ struct ast_sorcery_observer *cbs = (struct ast_sorcery_observer *) callbacks;/* Remove const for traversal. */
+ if (!sorcery) {
+ return;
+ }
+ object_type = ao2_find(sorcery->types, type, OBJ_KEY);
if (!object_type) {
return;
}
- ao2_callback(object_type->observers, OBJ_NODATA | OBJ_UNLINK, sorcery_observer_remove, callbacks);
+ ao2_callback(object_type->observers, OBJ_NODATA | OBJ_UNLINK,
+ sorcery_observer_remove, cbs);
}