浏览代码

CFG_UNREF is moved outside of the lock in cfg_install_global function
(shm_free()s might take longer)
Patch from Andrei

Miklos Tirpak 17 年之前
父节点
当前提交
cad56ad763
共有 1 个文件被更改,包括 10 次插入5 次删除
  1. 10 5
      cfg/cfg_struct.c

+ 10 - 5
cfg/cfg_struct.c

@@ -524,19 +524,24 @@ void cfg_install_child_cb(cfg_child_cb_t *cb_first, cfg_child_cb_t *cb_last)
 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();
 
-	if (*cfg_global) {
-		if (replaced) (*cfg_global)->replaced = replaced;
-		CFG_UNREF(*cfg_global);
-	}
-	CFG_REF(block);
+	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);
+	}
 
 }