summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorMatt Jordan <mjordan@digium.com>2015-07-11 10:46:52 -0500
committerGerrit Code Review <gerrit2@gerrit.digium.api>2015-07-11 10:46:52 -0500
commitd3348ec5f094f5557fd904ed9ac9ac76f63eec60 (patch)
treecc9493394e2d5803b70e31af310eab46808b2ca4 /main
parent1b7760a8aac5f43ed72849598ada769207c51c13 (diff)
parentb178f8701bee0b56b3648a3c63bff1cd8ee0bc6d (diff)
Merge "sorcery: Add support for object staleness"
Diffstat (limited to 'main')
-rw-r--r--main/sorcery.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/main/sorcery.c b/main/sorcery.c
index 20b3d6b2f..fbbd14662 100644
--- a/main/sorcery.c
+++ b/main/sorcery.c
@@ -129,6 +129,9 @@ struct ast_sorcery_object {
/*! \brief Extended object fields */
struct ast_variable *extended;
+
+ /*! \brief Time that the object was created */
+ struct timeval created;
};
/*! \brief Structure for registered object type */
@@ -1734,6 +1737,7 @@ void *ast_sorcery_alloc(const struct ast_sorcery *sorcery, const char *type, con
details->object->id = ast_strdup(id);
}
+ details->object->created = ast_tvnow();
ast_copy_string(details->object->type, type, sizeof(details->object->type));
if (aco_set_defaults(&object_type->type, id, details)) {
@@ -2143,6 +2147,35 @@ int ast_sorcery_delete(const struct ast_sorcery *sorcery, void *object)
return object_wizard ? 0 : -1;
}
+int ast_sorcery_is_stale(const struct ast_sorcery *sorcery, void *object)
+{
+ const struct ast_sorcery_object_details *details = object;
+ RAII_VAR(struct ast_sorcery_object_type *, object_type, ao2_find(sorcery->types, details->object->type, OBJ_KEY), ao2_cleanup);
+ struct ast_sorcery_object_wizard *found_wizard;
+ int res = 0;
+ int i;
+
+ if (!object_type) {
+ return -1;
+ }
+
+ AST_VECTOR_RW_RDLOCK(&object_type->wizards);
+ for (i = 0; i < AST_VECTOR_SIZE(&object_type->wizards); i++) {
+ found_wizard = AST_VECTOR_GET(&object_type->wizards, i);
+
+ if (found_wizard->wizard->callbacks.is_stale) {
+ res |= found_wizard->wizard->callbacks.is_stale(sorcery, found_wizard->data, object);
+ ast_debug(5, "After calling wizard '%s', object '%s' is %s\n",
+ found_wizard->wizard->callbacks.name,
+ ast_sorcery_object_get_id(object),
+ res ? "stale" : "not stale");
+ }
+ }
+ AST_VECTOR_RW_UNLOCK(&object_type->wizards);
+
+ return res;
+}
+
void ast_sorcery_unref(struct ast_sorcery *sorcery)
{
if (sorcery) {
@@ -2161,6 +2194,12 @@ const char *ast_sorcery_object_get_id(const void *object)
return details->object->id;
}
+const struct timeval ast_sorcery_object_get_created(const void *object)
+{
+ const struct ast_sorcery_object_details *details = object;
+ return details->object->created;
+}
+
const char *ast_sorcery_object_get_type(const void *object)
{
const struct ast_sorcery_object_details *details = object;