Module: sip-router
Branch: tirpi/cfg_framework_multivalue
Commit: 58829230eec1efba3cd1b217d6d55127fec152d6
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=5882923…
Author: Miklos Tirpak <miklos(a)iptel.org>
Committer: Miklos Tirpak <miklos(a)iptel.org>
Date: Mon Oct 4 16:27:24 2010 +0200
cfg framework: timer must reset the handles more frequently
The timer processes must reset the cfg group handles after
each registered timer function is executed, otherwise cfg_select()
in one function may influence another function.
---
cfg/cfg_struct.h | 10 ++++++++++
timer.c | 4 ++++
2 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/cfg/cfg_struct.h b/cfg/cfg_struct.h
index 0c62a3d..adde858 100644
--- a/cfg/cfg_struct.h
+++ b/cfg/cfg_struct.h
@@ -421,6 +421,16 @@ static inline void cfg_reset_handles(void)
cfg_update_local(1); \
} while(0)
+/* Reset all the group handles in the child process,
+ * i.e. move them back to the default local configuration.
+ */
+#define cfg_reset_all() \
+ do { \
+ if (unlikely(cfg_ginst_count)) \
+ cfg_reset_handles(); \
+ } while(0)
+
+
/* searches a group by name */
cfg_group_t *cfg_lookup_group(char *name, int len);
diff --git a/timer.c b/timer.c
index ddce7e2..efba92d 100644
--- a/timer.c
+++ b/timer.c
@@ -892,6 +892,8 @@ inline static void timer_list_expire(ticks_t t, struct timer_head* h
#endif
UNLOCK_TIMER_LIST(); /* acts also as write barrier */
ret=tl->f(t, tl, tl->data);
+ /* reset the configuration group handles */
+ cfg_reset_all();
if (ret==0){
UNSET_RUNNING();
LOCK_TIMER_LIST();
@@ -1147,6 +1149,8 @@ void slow_timer_main()
SET_RUNNING_SLOW(tl);
UNLOCK_SLOW_TIMER_LIST();
ret=tl->f(*ticks, tl, tl->data);
+ /* reset the configuration group handles */
+ cfg_reset_all();
if (ret==0){
/* one shot */
UNSET_RUNNING_SLOW();