[sr-dev] git:master:e769f2e5: Merge pull request #733 from gaaf/rtimer-mode

GitHub noreply at github.com
Wed Aug 3 08:19:22 CEST 2016


Module: kamailio
Branch: master
Commit: e769f2e5731bcea0af6ec9f63487160ab2af4dc8
URL: https://github.com/kamailio/kamailio/commit/e769f2e5731bcea0af6ec9f63487160ab2af4dc8

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: GitHub <noreply at github.com>
Date: 2016-08-03T08:19:15+02:00

Merge pull request #733 from gaaf/rtimer-mode

Let multiple processes handle an rtimer

---

Modified: modules/rtimer/README
Modified: modules/rtimer/doc/rtimer_admin.xml
Modified: modules/rtimer/rtimer_mod.c

---

Diff:  https://github.com/kamailio/kamailio/commit/e769f2e5731bcea0af6ec9f63487160ab2af4dc8.diff
Patch: https://github.com/kamailio/kamailio/commit/e769f2e5731bcea0af6ec9f63487160ab2af4dc8.patch

---

diff --git a/modules/rtimer/README b/modules/rtimer/README
index cafd917..98dd0cd 100644
--- a/modules/rtimer/README
+++ b/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.
diff --git a/modules/rtimer/doc/rtimer_admin.xml b/modules/rtimer/doc/rtimer_admin.xml
index 73ee0e4..7b099ef 100644
--- a/modules/rtimer/doc/rtimer_admin.xml
+++ b/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>
diff --git a/modules/rtimer/rtimer_mod.c b/modules/rtimer/rtimer_mod.c
index c0cacf8..3a1e56a 100644
--- a/modules/rtimer/rtimer_mod.c
+++ b/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");
@@ -224,17 +229,26 @@ int stm_t_param(modparam_t type, void *val)
 			tmp.name = pit->body;
 		} else if(pit->name.len==4
 				&& strncasecmp(pit->name.s, "mode", 4)==0) {
-			if(tmp.mode==0)
-				str2int(&pit->body, &tmp.mode);
+			if(tmp.mode==0) {
+				if (str2int(&pit->body, &tmp.mode) < 0) {
+					LM_ERR("invalid mode: %.*s\n", pit->body.len, pit->body.s);
+					return -1;
+				}
+			}
 		}  else if(pit->name.len==8
 				&& strncasecmp(pit->name.s, "interval", 8)==0) {
 			if(pit->body.s[pit->body.len-1]=='u'
 					|| 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);
+					return -1;
 			}
-			str2int(&pit->body, &tmp.interval);
 		}
 	}
 	if(tmp.name.s==NULL)




More information about the sr-dev mailing list