/* installs a new global config * * replaced is an array of strings that must be freed together * with the previous global config. * cb_first and cb_last define a linked list of per-child process * callbacks. This list is added to the global linked list. */ void cfg_install_global(cfg_block_t *block, void **replaced, cfg_child_cb_t *cb_first, cfg_child_cb_t *cb_last) { cfg_block_t* old_cfg; CFG_REF(block); if (replaced) { /* The replaced array is specified, it has to be linked to the child cb structure. * The last child process processing this structure will free the old strings and the array. */ if (cb_first) { cb_first->replaced = replaced; } else { /* At least one child cb structure is needed. */ cb_first = cfg_child_cb_new(NULL, NULL, NULL, 0 /* gname, name, cb, type */); if (cb_first) { cb_last = cb_first; cb_first->replaced = replaced; } else { LOG(L_ERR, "ERROR: cfg_install_global(): not enough shm memory\n"); /* Nothing more can be done here, the replaced strings are still needed, * they cannot be freed at this moment. */ } } } CFG_LOCK(); old_cfg = *cfg_global; *cfg_global = block; if (cb_first) cfg_install_child_cb(cb_first, cb_last); CFG_UNLOCK(); if (old_cfg) CFG_UNREF(old_cfg); }
/* installs a new global config * * replaced is an array of strings that must be freed together * with the previous global config. * cb_first and cb_last define a linked list of per-child process * callbacks. This list is added to the global linked list. */ void cfg_install_global(cfg_block_t *block, char **replaced, cfg_child_cb_t *cb_first, cfg_child_cb_t *cb_last) { cfg_block_t* old_cfg; CFG_REF(block); CFG_LOCK(); old_cfg = *cfg_global; *cfg_global = block; if (cb_first) cfg_install_child_cb(cb_first, cb_last); CFG_UNLOCK(); if (old_cfg) { if (replaced) (old_cfg)->replaced = replaced; CFG_UNREF(old_cfg); } }