فهرست منبع

rtimer: Allow multiple timer processes per timer

Reuse the mode parameter to specify the number of processes handling the timer.
Alex Hermann 10 سال پیش
والد
کامیت
4fb0dc4a6f
3فایلهای تغییر یافته به همراه18 افزوده شده و 8 حذف شده
  1. 3 1
      modules/rtimer/README
  2. 3 2
      modules/rtimer/doc/rtimer_admin.xml
  3. 12 5
      modules/rtimer/rtimer_mod.c

+ 3 - 1
modules/rtimer/README

@@ -87,7 +87,9 @@ Chapter 1. Admin Guide
    The parameter can be set multiple times to get more timers in same
    configuration file.
      * name - name of the timer.
-     * mode - if set to 1, will create a new timer process.
+     * mode - if set to 0, the timer will use the main (shared) timer. Any
+       number > 0 will create the specified amount of new timer processes
+       (which will only be handling this timer).
      * interval - timer interval in seconds or micro-seconds (the value
        must be ended in 'u'). For micro-seconds intervals, mode is set
        always to 1.

+ 3 - 2
modules/rtimer/doc/rtimer_admin.xml

@@ -81,8 +81,9 @@
 		</listitem>
 		<listitem>
 		<para>
-			<emphasis>mode</emphasis> - if set to 1, will create a new timer
-			process.
+			<emphasis>mode</emphasis> - if set to 0, the timer will use the main
+			(shared) timer. Any number > 0 will create the specified amount of
+			new timer processes (which will only be handling this timer).
 		</para>
 		</listitem>
 		<listitem>

+ 12 - 5
modules/rtimer/rtimer_mod.c

@@ -127,7 +127,7 @@ static int mod_init(void)
 				return -1;
 			}
 		} else {
-			register_basic_timers(1);
+			register_basic_timers(it->mode);
 		}
 		it = it->next;
 	}
@@ -138,6 +138,9 @@ static int mod_init(void)
 static int child_init(int rank)
 {
 	stm_timer_t *it;
+	int i;
+	char si_desc[MAX_PT_DESC];
+
 	if(_stm_list==NULL)
 		return 0;
 
@@ -147,18 +150,20 @@ static int child_init(int rank)
 	it = _stm_list;
 	while(it)
 	{
-		if(it->mode!=0)
+		for(i=0; i<it->mode; i++)
 		{
+			snprintf(si_desc, MAX_PT_DESC, "RTIMER EXEC child=%d timer=%.*s",
+			         i, it->name.len, it->name.s);
 			if(it->flags & RTIMER_INTERVAL_USEC)
 			{
-				if(fork_basic_utimer(PROC_TIMER, "RTIMER USEC EXEC", 1 /*socks flag*/,
+				if(fork_basic_utimer(PROC_TIMER, si_desc, 1 /*socks flag*/,
 								stm_timer_exec, (void*)it, it->interval
 								/*usec*/)<0) {
 					LM_ERR("failed to start utimer routine as process\n");
 					return -1; /* error */
 				}
 			} else {
-				if(fork_basic_timer(PROC_TIMER, "RTIMER SEC EXEC", 1 /*socks flag*/,
+				if(fork_basic_timer(PROC_TIMER, si_desc, 1 /*socks flag*/,
 								stm_timer_exec, (void*)it, it->interval
 								/*sec*/)<0) {
 					LM_ERR("failed to start timer routine as process\n");
@@ -236,7 +241,9 @@ int stm_t_param(modparam_t type, void *val)
 					|| pit->body.s[pit->body.len-1]=='U') {
 				pit->body.len--;
 				tmp.flags |= RTIMER_INTERVAL_USEC;
-				tmp.mode = 1;
+				if (tmp.mode==0) {
+					tmp.mode = 1;
+				}
 			}
 			if (str2int(&pit->body, &tmp.interval) < 0) {
 				LM_ERR("invalid interval: %.*s\n", pit->body.len, pit->body.s);