static int child_init(int rank) { dlg_db_mode = dlg_db_mode_param; if(rank==PROC_MAIN) { if(dlg_timer_procs>0) { if(fork_sync_timer(PROC_TIMER, "Dialog Main Timer", 1 /*socks flag*/, dlg_timer_routine, NULL, 1 /*every sec*/)<0) { LM_ERR("failed to start main timer routine as process\n"); return -1; /* error */ } } if(dlg_ka_timer>0 && dlg_ka_interval>0) { if(fork_sync_timer(PROC_TIMER, "Dialog KA Timer", 1 /*socks flag*/, dlg_ka_timer_exec, NULL, dlg_ka_timer /*sec*/)<0) { LM_ERR("failed to start ka timer routine as process\n"); return -1; /* error */ } } if(fork_sync_timer(PROC_TIMER, "Dialog Clean Timer", 1 /*socks flag*/, dlg_clean_timer_exec, NULL, dlg_clean_timer /*sec*/)<0) { LM_ERR("failed to start clean timer routine as process\n"); return -1; /* error */ } } if (rank==1) { if_update_stat(dlg_enable_stats, active_dlgs, active_dlgs_cnt); if_update_stat(dlg_enable_stats, early_dlgs, early_dlgs_cnt); } if ( ((dlg_db_mode==DB_MODE_REALTIME || dlg_db_mode==DB_MODE_DELAYED) && (rank>0 || rank==PROC_TIMER)) || (dlg_db_mode==DB_MODE_SHUTDOWN && (rank==PROC_MAIN)) ) { if ( dlg_connect_db(&db_url) ) { LM_ERR("failed to connect to database (rank=%d)\n",rank); return -1; } } /* in DB_MODE_SHUTDOWN only PROC_MAIN will do a DB dump at the end, so * for the rest of the processes will be the same as DB_MODE_NONE */ if (dlg_db_mode==DB_MODE_SHUTDOWN && rank!=PROC_MAIN) dlg_db_mode = DB_MODE_NONE; /* in DB_MODE_REALTIME and DB_MODE_DELAYED the PROC_MAIN have no DB handle */ if ( (dlg_db_mode==DB_MODE_REALTIME || dlg_db_mode==DB_MODE_DELAYED) && rank==PROC_MAIN) dlg_db_mode = DB_MODE_NONE; return 0; }
static int child_init(int rank) { int i; if (rank == PROC_INIT || rank == PROC_TCP_MAIN) return 0; if (rank == PROC_MAIN && ws_keepalive_mechanism != KEEPALIVE_MECHANISM_NONE) { for (i = 0; i < ws_keepalive_processes; i++) { if (fork_sync_timer(PROC_TIMER, "WEBSOCKET KEEPALIVE", 1, ws_keepalive, NULL, ws_keepalive_interval) < 0) { LM_ERR("starting keepalive process\n"); return -1; } } } return 0; }
static int child_init(int rank) { dlist_t* ptr; int i; if (rank == PROC_MAIN && ul_timer_procs > 0) { for (i = 0; i < ul_timer_procs; i++) { if (fork_sync_timer(PROC_TIMER, "IMS S-CSCF USRLOC Timer", 1 /*socks flag*/, ul_local_timer, (void*) (long) i, timer_interval /*sec*/) < 0) { LM_ERR("failed to start timer routine as process\n"); return -1; /* error */ } } } /* connecting to DB ? */ switch (db_mode) { case NO_DB: return 0; case WRITE_THROUGH: /* we need connection from working SIP and TIMER and MAIN * processes only */ if (rank <= 0 && rank != PROC_TIMER && rank != PROC_MAIN) return 0; break; } ul_dbh = ul_dbf.init(&db_url); /* Get a database connection per child */ if (!ul_dbh) { LM_ERR("child(%d): failed to connect to database\n", rank); return -1; } /* _rank==PROC_SIPINIT is used even when fork is disabled */ if (rank == PROC_SIPINIT && db_mode != DB_ONLY) { /* if cache is used, populate from DB */ for (ptr = root; ptr; ptr = ptr->next) { if (preload_udomain(ul_dbh, ptr->d) < 0) { LM_ERR("child(%d): failed to preload domain '%.*s'\n", rank, ptr->name.len, ZSW(ptr->name.s)); return -1; } } } return 0; }
static int child_init(int rank) { struct sip_msg *fmsg; struct run_act_ctx ctx; int rtb, rt; int i; LM_DBG("rank is (%d)\n", rank); if(rank==PROC_MAIN) { if(ht_timer_procs>0) { for(i=0; i<ht_timer_procs; i++) { if(fork_sync_timer(PROC_TIMER, "HTable Timer", 1 /*socks flag*/, ht_timer, (void*)(long)i, ht_timer_interval)<0) { LM_ERR("failed to start timer routine as process\n"); return -1; /* error */ } } } } if (rank!=PROC_INIT) return 0; rt = route_get(&event_rt, "htable:mod-init"); if(rt>=0 && event_rt.rlist[rt]!=NULL) { LM_DBG("executing event_route[htable:mod-init] (%d)\n", rt); if(faked_msg_init()<0) return -1; fmsg = faked_msg_next(); rtb = get_route_type(); set_route_type(REQUEST_ROUTE); init_run_actions_ctx(&ctx); run_top_route(event_rt.rlist[rt], fmsg, &ctx); if(ctx.run_flags&DROP_R_F) { LM_ERR("exit due to 'drop' in event route\n"); return -1; } set_route_type(rtb); } return 0; }
/** * @brief Initialize async module children */ static int child_init(int rank) { if(msrp_sruid_init()<0) { LM_ERR("cannot init msrp uid\n"); return -1; } if (rank!=PROC_MAIN) return 0; if(msrp_cmap_size>0) { if(fork_sync_timer(PROC_TIMER, "MSRP Timer", 1 /*socks flag*/, msrp_local_timer, NULL, msrp_timer_interval /*sec*/)<0) { LM_ERR("failed to start timer routine as process\n"); return -1; /* error */ } } return 0; }
static int child_init(int rank) { struct sip_msg *fmsg; struct run_act_ctx ctx; int rtb, rt; int i; sr_kemi_eng_t *keng = NULL; str evname = str_init("htable:mod-init"); LM_DBG("rank is (%d)\n", rank); if(rank==PROC_MAIN) { if(ht_timer_procs>0) { for(i=0; i<ht_timer_procs; i++) { if(fork_sync_timer(PROC_TIMER, "HTable Timer", 1 /*socks flag*/, ht_timer, (void*)(long)i, ht_timer_interval)<0) { LM_ERR("failed to start timer routine as process\n"); return -1; /* error */ } } } } if (rank!=PROC_INIT) return 0; rt = -1; if(ht_event_callback.s==NULL || ht_event_callback.len<=0) { rt = route_lookup(&event_rt, evname.s); if(rt<0 || event_rt.rlist[rt]==NULL) { rt = -1; } } else { keng = sr_kemi_eng_get(); if(keng==NULL) { LM_DBG("event callback (%s) set, but no cfg engine\n", ht_event_callback.s); goto done; } } if(rt>=0 || ht_event_callback.len>0) { LM_DBG("executing event_route[%s] (%d)\n", evname.s, rt); if(faked_msg_init()<0) return -1; fmsg = faked_msg_next(); rtb = get_route_type(); set_route_type(REQUEST_ROUTE); init_run_actions_ctx(&ctx); if(rt>=0) { run_top_route(event_rt.rlist[rt], fmsg, &ctx); } else { if(keng!=NULL) { if(keng->froute(fmsg, EVENT_ROUTE, &ht_event_callback, &evname)<0) { LM_ERR("error running event route kemi callback\n"); return -1; } } } set_route_type(rtb); if(ctx.run_flags&DROP_R_F) { LM_ERR("exit due to 'drop' in event route\n"); return -1; } } done: return 0; }
static int child_init(int _rank) { dlist_t* ptr; int i; if(sruid_init(&_ul_sruid, '-', "ulcx", SRUID_INC)<0) return -1; if(_rank==PROC_MAIN && ul_timer_procs>0) { for(i=0; i<ul_timer_procs; i++) { if(fork_sync_timer(PROC_TIMER, "USRLOC Timer", 1 /*socks flag*/, ul_local_timer, (void*)(long)i, timer_interval /*sec*/)<0) { LM_ERR("failed to start timer routine as process\n"); return -1; /* error */ } } } /* connecting to DB ? */ switch (db_mode) { case NO_DB: return 0; case DB_ONLY: case WRITE_THROUGH: /* connect to db only from SIP workers, TIMER and MAIN processes */ if (_rank<=0 && _rank!=PROC_TIMER && _rank!=PROC_MAIN) return 0; break; case WRITE_BACK: /* connect to db only from TIMER (for flush), from MAIN (for * final flush() and from child 1 for preload */ if (_rank!=PROC_TIMER && _rank!=PROC_MAIN && _rank!=PROC_SIPINIT) return 0; break; case DB_READONLY: /* connect to db only from child 1 for preload */ if(_rank!=PROC_SIPINIT) return 0; break; } ul_dbh = ul_dbf.init(&db_url); /* Get a database connection per child */ if (!ul_dbh) { LM_ERR("child(%d): failed to connect to database\n", _rank); return -1; } /* _rank==PROC_SIPINIT is used even when fork is disabled */ if (_rank==PROC_SIPINIT && db_mode!=DB_ONLY) { /* if cache is used, populate domains from DB */ for( ptr=root ; ptr ; ptr=ptr->next) { if (preload_udomain(ul_dbh, ptr->d) < 0) { LM_ERR("child(%d): failed to preload domain '%.*s'\n", _rank, ptr->name.len, ZSW(ptr->name.s)); return -1; } uldb_preload_attrs(ptr->d); } } return 0; }