changing the syntax of cfg_register_ctx() function
authorMiklos Tirpak <miklos@iptel.org>
Mon, 28 Jan 2008 12:54:58 +0000 (12:54 +0000)
committerMiklos Tirpak <miklos@iptel.org>
Mon, 28 Jan 2008 12:54:58 +0000 (12:54 +0000)
(The context handle must be ready when the on_declare()
callbacks are called, and it may happen that the callback
is executed before cfg_register_ctx() returns.)

cfg/cfg_ctx.c
cfg/cfg_ctx.h
doc/cfg.txt

index b13687f..c62273e 100644 (file)
@@ -44,7 +44,7 @@ static cfg_ctx_t      *cfg_ctx_list = NULL;
 /* creates a new config context that is an interface to the
  * cfg variables with write permission
  */
-cfg_ctx_t *cfg_register_ctx(cfg_on_declare on_declare_cb)
+int cfg_register_ctx(cfg_ctx_t **handle, cfg_on_declare on_declare_cb)
 {
        cfg_ctx_t       *ctx;
        cfg_group_t     *group;
@@ -56,20 +56,23 @@ cfg_ctx_t *cfg_register_ctx(cfg_on_declare on_declare_cb)
        ctx = (cfg_ctx_t *)shm_malloc(sizeof(cfg_ctx_t));
        if (!ctx) {
                LOG(L_ERR, "ERROR: cfg_register_ctx(): not enough shm memory\n");
-               return NULL;
+               return -1;
        }
        memset(ctx, 0, sizeof(cfg_ctx_t));
        if (lock_init(&ctx->lock) == 0) {
                LOG(L_ERR, "ERROR: cfg_register_ctx(): failed to init lock\n");
                shm_free(ctx);
-               return NULL;
+               return -1;
        }
 
        /* add the new ctx to the beginning of the list */
        ctx->next = cfg_ctx_list;
        cfg_ctx_list = ctx;
 
-       /* let the driver know about the already registered groups */
+       /* let the driver know about the already registered groups
+        * The handle of the context must be set before calling the
+        * on_declare callbacks. */
+       *handle = ctx;
        if (on_declare_cb) {
                ctx->on_declare_cb = on_declare_cb;
 
@@ -87,7 +90,7 @@ cfg_ctx_t *cfg_register_ctx(cfg_on_declare on_declare_cb)
                }
        }
 
-       return ctx;
+       return 0;
 }
 
 /* free the memory allocated for the contexts */
index b53a89e..fc092d1 100644 (file)
@@ -72,7 +72,7 @@ typedef struct _cfg_ctx {
 
 /* creates a new config context that is an interface to the
  * cfg variables with write permission */
-cfg_ctx_t *cfg_register_ctx(cfg_on_declare on_declare_cb);
+int cfg_register_ctx(cfg_ctx_t **handle, cfg_on_declare on_declare_cb);
 
 /* free the memory allocated for the contexts */
 void cfg_ctx_destroy(void);
index de41661..e3f86ed 100644 (file)
@@ -184,8 +184,7 @@ static void on_declare(str *group_name, cfg_def_t *definition)
 
 static int mod_init(void)
 {
-       ctx = cfg_register_ctx(on_declare);
-       if (!ctx) {
+       if (cfg_register_ctx(&ctx, on_declare)) {
                /* error */
                return -1;
        }