<div dir="ltr">This is interesting, what is the motivation ;) ?</div><br><div class="gmail_quote"><div dir="ltr">On Wed, 7 Oct 2015 at 12:14 Daniel-Constantin Mierla <<a href="mailto:miconda@gmail.com">miconda@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Module: kamailio<br>
Branch: master<br>
Commit: b3d38eac7a24bff88a1ec555aa5a50ea5c3f0232<br>
URL: <a href="https://github.com/kamailio/kamailio/commit/b3d38eac7a24bff88a1ec555aa5a50ea5c3f0232" rel="noreferrer" target="_blank">https://github.com/kamailio/kamailio/commit/b3d38eac7a24bff88a1ec555aa5a50ea5c3f0232</a><br>
<br>
Author: Daniel-Constantin Mierla <<a href="mailto:miconda@gmail.com" target="_blank">miconda@gmail.com</a>><br>
Committer: Daniel-Constantin Mierla <<a href="mailto:miconda@gmail.com" target="_blank">miconda@gmail.com</a>><br>
Date: 2015-10-07T12:14:24+02:00<br>
<br>
core: new feature to execute event_route[core:worker-one-init]<br>
<br>
- the event_route[core:worker-one-init] is executed if defined in<br>
  kamailio.cfg after the first udp sip worker process executed the<br>
  child_init() for all modules, before starting to process sip traffic<br>
- note that due to forking, other sip workers can get faster to<br>
  listening for sip traffic<br>
<br>
---<br>
<br>
Modified: action.c<br>
Modified: action.h<br>
Modified: main.c<br>
<br>
---<br>
<br>
Diff:  <a href="https://github.com/kamailio/kamailio/commit/b3d38eac7a24bff88a1ec555aa5a50ea5c3f0232.diff" rel="noreferrer" target="_blank">https://github.com/kamailio/kamailio/commit/b3d38eac7a24bff88a1ec555aa5a50ea5c3f0232.diff</a><br>
Patch: <a href="https://github.com/kamailio/kamailio/commit/b3d38eac7a24bff88a1ec555aa5a50ea5c3f0232.patch" rel="noreferrer" target="_blank">https://github.com/kamailio/kamailio/commit/b3d38eac7a24bff88a1ec555aa5a50ea5c3f0232.patch</a><br>
<br>
---<br>
<br>
diff --git a/action.c b/action.c<br>
index 726c000..bef3ec6 100644<br>
--- a/action.c<br>
+++ b/action.c<br>
@@ -49,6 +49,7 @@<br>
 #include "globals.h"<br>
 #include "dset.h"<br>
 #include "onsend.h"<br>
+#include "fmsg.h"<br>
 #include "resolve.h"<br>
 #ifdef USE_TCP<br>
 #include "tcp_server.h"<br>
@@ -1635,3 +1636,36 @@ int run_top_route(struct action* a, sip_msg_t* msg, struct run_act_ctx *c)<br>
        setsflagsval(sfbk);<br>
        return ret;<br>
 }<br>
+<br>
+<br>
+/**<br>
+ *<br>
+ */<br>
+int run_child_one_init_route(void)<br>
+{<br>
+       struct sip_msg *fmsg;<br>
+       struct run_act_ctx ctx;<br>
+       int rtb, rt;<br>
+<br>
+       LM_DBG("attempting to run event_route[core:worker-one-init]\n");<br>
+<br>
+       rt = route_get(&event_rt, "core:worker-one-init");<br>
+       if(rt>=0 && event_rt.rlist[rt]!=NULL) {<br>
+               LM_DBG("executing event_route[core:worker-one-init] (%d)\n", rt);<br>
+               if(faked_msg_init()<0)<br>
+                       return -1;<br>
+               fmsg = faked_msg_next();<br>
+               rtb = get_route_type();<br>
+               set_route_type(REQUEST_ROUTE);<br>
+               init_run_actions_ctx(&ctx);<br>
+               run_top_route(event_rt.rlist[rt], fmsg, &ctx);<br>
+               if(ctx.run_flags&DROP_R_F)<br>
+               {<br>
+                       LM_ERR("exit due to 'drop' in event route\n");<br>
+                       return -1;<br>
+               }<br>
+               set_route_type(rtb);<br>
+       }<br>
+<br>
+       return 0;<br>
+}<br>
diff --git a/action.h b/action.h<br>
index d6f7810..62eed0c 100644<br>
--- a/action.h<br>
+++ b/action.h<br>
@@ -75,4 +75,6 @@ int run_actions_safe(struct run_act_ctx* c, struct action* a,<br>
<br>
 void log_prefix_set(sip_msg_t *msg);<br>
<br>
+int run_child_one_init_route(void);<br>
+<br>
 #endif<br>
diff --git a/main.c b/main.c<br>
index 3970db8..a4407fa 100644<br>
--- a/main.c<br>
+++ b/main.c<br>
@@ -1228,6 +1228,7 @@ int main_loop(void)<br>
        int r;<br>
 #endif<br>
        int nrprocs;<br>
+       int woneinit;<br>
<br>
        /* one "main" process and n children handling i/o */<br>
        if (dont_fork){<br>
@@ -1544,6 +1545,7 @@ int main_loop(void)<br>
                if (counters_prefork_init(get_max_procs()) == -1) goto error;<br>
<br>
<br>
+               woneinit = 0;<br>
                /* udp processes */<br>
                for(si=udp_listen; si; si=si->next){<br>
                        nrprocs = (si->workers>0)?si->workers:children_no;<br>
@@ -1580,8 +1582,13 @@ int main_loop(void)<br>
 #ifdef STATS<br>
                                        setstats( i+r*children_no );<br>
 #endif<br>
+                                       if(woneinit==0) {<br>
+                                               if(run_child_one_init_route()<0)<br>
+                                                       goto error;<br>
+                                       }<br>
                                        return udp_rcv_loop();<br>
                                }<br>
+                               woneinit = 1;<br>
                        }<br>
                        /*parent*/<br>
                        /*close(udp_sock)*/; /*if it's closed=>sendto invalid fd errors?*/<br>
<br>
<br>
_______________________________________________<br>
sr-dev mailing list<br>
<a href="mailto:sr-dev@lists.sip-router.org" target="_blank">sr-dev@lists.sip-router.org</a><br>
<a href="http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev" rel="noreferrer" target="_blank">http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev</a><br>
</blockquote></div>