Author: file
Date: Tue Jul 30 07:13:29 2013
New Revision: 395727

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=395727
Log:
Add module reference counting.

Modified:
    team/file/bucket/include/asterisk/bucket.h
    team/file/bucket/main/bucket.c

Modified: team/file/bucket/include/asterisk/bucket.h
URL: 
http://svnview.digium.com/svn/asterisk/team/file/bucket/include/asterisk/bucket.h?view=diff&rev=395727&r1=395726&r2=395727
==============================================================================
--- team/file/bucket/include/asterisk/bucket.h (original)
+++ team/file/bucket/include/asterisk/bucket.h Tue Jul 30 07:13:29 2013
@@ -109,8 +109,21 @@
  * \retval 0 success
  * \retval -1 failure
  */
-int ast_bucket_scheme_register(const char *name, struct ast_sorcery_wizard 
*bucket,
-       struct ast_sorcery_wizard *file);
+#define ast_bucket_scheme_register(name, bucket, file) 
__ast_bucket_scheme_register(name, bucket, file, ast_module_info ? 
ast_module_info->self : NULL)
+
+/*!
+ * \brief Register support for a specific scheme
+ *
+ * \param name Name of the scheme, used to find based on scheme in URIs
+ * \param bucket Sorcery wizard used for buckets
+ * \param file Sorcery wizard used for files
+ * \param module The module which implements this scheme
+ *
+ * \retval 0 success
+ * \retval -1 failure
+ */
+int __ast_bucket_scheme_register(const char *name, struct ast_sorcery_wizard 
*bucket,
+       struct ast_sorcery_wizard *file, struct ast_module *module);
 
 /*!
  * \brief Unregister support for a specific scheme

Modified: team/file/bucket/main/bucket.c
URL: 
http://svnview.digium.com/svn/asterisk/team/file/bucket/main/bucket.c?view=diff&rev=395727&r1=395726&r2=395727
==============================================================================
--- team/file/bucket/main/bucket.c (original)
+++ team/file/bucket/main/bucket.c Tue Jul 30 07:13:29 2013
@@ -39,6 +39,7 @@
 #include "asterisk/strings.h"
 #include "asterisk/json.h"
 #include "asterisk/file.h"
+#include "asterisk/module.h"
 
 /*! \brief Default scheme for when one is not specified */
 #define DEFAULT_UNSPECIFIED_SCHEME "local"
@@ -67,6 +68,8 @@
        struct ast_sorcery_wizard *bucket;
        /*! \brief Wizard for files */
        struct ast_sorcery_wizard *file;
+       /*! \brief Module which implements this scheme */
+       struct ast_module *module;
        /*! \brief Name of the scheme */
        char name[0];
 };
@@ -113,15 +116,26 @@
        return 0;
 }
 
+/*! \brief Helper function which increases reference count of a module and 
returns it */
+static struct ast_module *module_ref(struct ast_module *module)
+{
+       ast_module_ref(module);
+       return module;
+}
+
 /*! \brief Callback function for creating a bucket */
 static int bucket_wizard_create(const struct ast_sorcery *sorcery, void *data, 
void *object)
 {
        struct ast_bucket *bucket = object;
-       RAII_VAR(struct bucket_scheme *, scheme, ao2_find(schemes, 
bucket->scheme, OBJ_KEY), ao2_cleanup);
+       SCOPED_AO2RDLOCK(lock, schemes);
+       RAII_VAR(struct bucket_scheme *, scheme, ao2_find(schemes, 
bucket->scheme, OBJ_KEY | OBJ_NOLOCK), ao2_cleanup);
+       RAII_VAR(struct ast_module *, module, NULL, ast_module_unref);
 
        if (!scheme) {
                return -1;
        }
+
+       module = module_ref(scheme->module);
 
        return scheme->bucket->create(sorcery, data, object);
 }
@@ -131,7 +145,9 @@
        const char *id)
 {
        char *uri, *uri_scheme, *uri_name;
+       SCOPED_AO2RDLOCK(lock, schemes);
        RAII_VAR(struct bucket_scheme *, scheme, NULL, ao2_cleanup);
+       RAII_VAR(struct ast_module *, module, NULL, ast_module_unref);
 
        if (!(uri = ast_strdupa(id))) {
                return NULL;
@@ -142,10 +158,12 @@
                return NULL;
        }
 
-       scheme = ao2_find(schemes, uri_scheme, OBJ_KEY);
+       scheme = ao2_find(schemes, uri_scheme, OBJ_KEY | OBJ_NOLOCK);
        if (!scheme) {
                return NULL;
        }
+
+       module = module_ref(scheme->module);
 
        return scheme->bucket->retrieve_id(sorcery, data, type, id);
 }
@@ -154,11 +172,15 @@
 static int bucket_wizard_delete(const struct ast_sorcery *sorcery, void *data, 
void *object)
 {
        struct ast_bucket *bucket = object;
-       RAII_VAR(struct bucket_scheme *, scheme, ao2_find(schemes, 
bucket->scheme, OBJ_KEY), ao2_cleanup);
+       SCOPED_AO2RDLOCK(lock, schemes);
+       RAII_VAR(struct bucket_scheme *, scheme, ao2_find(schemes, 
bucket->scheme, OBJ_KEY | OBJ_NOLOCK), ao2_cleanup);
+       RAII_VAR(struct ast_module *, module, NULL, ast_module_unref);
 
        if (!scheme) {
                return -1;
        }
+
+       module = module_ref(scheme->module);
 
        return scheme->bucket->delete(sorcery, data, object);
 }
@@ -175,11 +197,15 @@
 static int bucket_file_wizard_create(const struct ast_sorcery *sorcery, void 
*data, void *object)
 {
        struct ast_bucket_file *file = object;
-       RAII_VAR(struct bucket_scheme *, scheme, ao2_find(schemes, 
file->scheme, OBJ_KEY), ao2_cleanup);
+       SCOPED_AO2RDLOCK(lock, schemes);
+       RAII_VAR(struct bucket_scheme *, scheme, ao2_find(schemes, 
file->scheme, OBJ_KEY | OBJ_NOLOCK), ao2_cleanup);
+       RAII_VAR(struct ast_module *, module, NULL, ast_module_unref);
 
        if (!scheme) {
                return -1;
        }
+
+       module = module_ref(scheme->module);
 
        return scheme->file->create(sorcery, data, object);
 }
@@ -189,7 +215,9 @@
        const char *id)
 {
        char *uri, *uri_scheme, *uri_name;
+       SCOPED_AO2RDLOCK(lock, schemes);
        RAII_VAR(struct bucket_scheme *, scheme, NULL, ao2_cleanup);
+       RAII_VAR(struct ast_module *, module, NULL, ast_module_unref);
 
        if (!(uri = ast_strdupa(id))) {
                return NULL;
@@ -200,10 +228,12 @@
                return NULL;
        }
 
-       scheme = ao2_find(schemes, uri_scheme, OBJ_KEY);
+       scheme = ao2_find(schemes, uri_scheme, OBJ_KEY | OBJ_NOLOCK);
        if (!scheme) {
                return NULL;
        }
+
+       module = module_ref(scheme->module);
 
        return scheme->file->retrieve_id(sorcery, data, type, id);
 }
@@ -212,11 +242,15 @@
 static int bucket_file_wizard_update(const struct ast_sorcery *sorcery, void 
*data, void *object)
 {
        struct ast_bucket_file *file = object;
-       RAII_VAR(struct bucket_scheme *, scheme, ao2_find(schemes, 
file->scheme, OBJ_KEY), ao2_cleanup);
+       SCOPED_AO2RDLOCK(lock, schemes);
+       RAII_VAR(struct bucket_scheme *, scheme, ao2_find(schemes, 
file->scheme, OBJ_KEY | OBJ_NOLOCK), ao2_cleanup);
+       RAII_VAR(struct ast_module *, module, NULL, ast_module_unref);
 
        if (!scheme) {
                return -1;
        }
+
+       module = module_ref(scheme->module);
 
        return scheme->file->update(sorcery, data, object);
 }
@@ -225,11 +259,15 @@
 static int bucket_file_wizard_delete(const struct ast_sorcery *sorcery, void 
*data, void *object)
 {
        struct ast_bucket_file *file = object;
+       SCOPED_AO2RDLOCK(lock, schemes);
        RAII_VAR(struct bucket_scheme *, scheme, ao2_find(schemes, 
file->scheme, OBJ_KEY), ao2_cleanup);
+       RAII_VAR(struct ast_module *, module, NULL, ast_module_unref);
 
        if (!scheme) {
                return -1;
        }
+
+       module = module_ref(scheme->module);
 
        return scheme->file->delete(sorcery, data, object);
 }
@@ -243,8 +281,8 @@
        .delete = bucket_file_wizard_delete,
 };
 
-int ast_bucket_scheme_register(const char *name, struct ast_sorcery_wizard 
*bucket,
-       struct ast_sorcery_wizard *file)
+int __ast_bucket_scheme_register(const char *name, struct ast_sorcery_wizard 
*bucket,
+       struct ast_sorcery_wizard *file, struct ast_module *module)
 {
        SCOPED_AO2WRLOCK(lock, schemes);
        struct bucket_scheme *scheme;
@@ -264,6 +302,7 @@
                return -1;
        }
 
+       scheme->module = module;
        strcpy(scheme->name, name);
        scheme->bucket = bucket;
        scheme->file = file;


--
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

svn-commits mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/svn-commits

Reply via email to