diff --git a/src/modules/pipelimit/pipelimit.c b/src/modules/pipelimit/pipelimit.c index c3cbf56103c..7aff8219304 100644 --- a/src/modules/pipelimit/pipelimit.c +++ b/src/modules/pipelimit/pipelimit.c @@ -54,6 +54,7 @@ #include "../../core/rpc_lookup.h" #include "../../core/rand/kam_rand.h" #include "../../core/kemi.h" +#include "../../core/timer_proc.h" #include "pl_statistics.h" #include "pl_ht.h" @@ -91,30 +92,32 @@ typedef struct pl_queue { str method_mp; } pl_queue_t; -static struct timer_ln* pl_timer; +static struct timer_ln* pl_timer = NULL; /* === these change after startup */ -static double * load_value; /* actual load, used by PIPE_ALGO_FEEDBACK */ -static double * pid_kp, * pid_ki, * pid_kd; /* PID tuning params */ -double * _pl_pid_setpoint; /* PID tuning params */ -static int * drop_rate; /* updated by PIPE_ALGO_FEEDBACK */ +static double *load_value = NULL; /* actual load, used by PIPE_ALGO_FEEDBACK */ +static double *pid_kp = NULL, *pid_ki = NULL, *pid_kd = NULL; /* PID tuning params */ +double *_pl_pid_setpoint = NULL; /* PID tuning params */ +static int *drop_rate = NULL; /* updated by PIPE_ALGO_FEEDBACK */ -static int * network_load_value; /* network load */ +static int *network_load_value = NULL; /* network load */ /* where to get the load for feedback. values: cpu, external */ static int load_source_mp = LOAD_SOURCE_CPU; -static int * load_source; +static int *load_source = NULL; /* these only change in the mod_init() process -- no locking needed */ static int pl_timer_interval = PL_TIMER_INTERVAL_DEFAULT; -int _pl_cfg_setpoint; /* desired load, used when reading modparams */ +static int pl_timer_mode = 0; +int _pl_cfg_setpoint = 0; /* desired load, used when reading modparams */ /* === */ /** module functions */ static int mod_init(void); static ticks_t pl_timer_handle(ticks_t, struct timer_ln*, void*); +static void pl_timer_exec(unsigned int ticks, void *param); static int w_pl_check(struct sip_msg*, char *, char *); static int w_pl_check3(struct sip_msg*, char *, char *, char *); static int w_pl_drop_default(struct sip_msg*, char *, char *); @@ -138,6 +141,7 @@ static cmd_export_t cmds[]={ }; static param_export_t params[]={ {"timer_interval", INT_PARAM, &pl_timer_interval}, + {"timer_mode", INT_PARAM, &pl_timer_mode}, {"reply_code", INT_PARAM, &pl_drop_code}, {"reply_reason", PARAM_STR, &pl_drop_reason}, {"db_url", PARAM_STR, &pl_db_url}, @@ -340,14 +344,22 @@ static int mod_init(void) LM_ERR("could not load pipes description\n"); return -1; } - /* register timer to reset counters */ - if ((pl_timer = timer_alloc()) == NULL) { - LM_ERR("could not allocate timer\n"); - return -1; + + if(pl_timer_mode == 0) { + /* register timer to reset counters */ + if ((pl_timer = timer_alloc()) == NULL) { + LM_ERR("could not allocate timer\n"); + return -1; + } + timer_init(pl_timer, pl_timer_handle, 0, F_TIMER_FAST); + /* execute timer routine after pl_timer_interval * 1000ms */ + timer_add(pl_timer, pl_timer_interval * MS_TO_TICKS(1000)); + } else { + if(sr_wtimer_add(pl_timer_exec, NULL, pl_timer_interval) < 0) { + LM_ERR("cannot add timer exec routine\n"); + return -1; + } } - timer_init(pl_timer, pl_timer_handle, 0, F_TIMER_FAST); - /* execute timer routine after pl_timer_interval * 1000ms */ - timer_add(pl_timer, pl_timer_interval * MS_TO_TICKS(1000)); /* bind the SL API */ if (sl_load_api(&slb)!=0) { @@ -713,8 +725,7 @@ static int fixup_pl_check3(void** param, int param_no) return 0; } -/* timer housekeeping, invoked each timer interval to reset counters */ -static ticks_t pl_timer_handle(ticks_t ticks, struct timer_ln* tl, void* data) +static void pl_timer_refresh(void) { switch (*load_source) { case LOAD_SOURCE_CPU: @@ -725,10 +736,20 @@ static ticks_t pl_timer_handle(ticks_t ticks, struct timer_ln* tl, void* data) *network_load_value = get_total_bytes_waiting(); pl_pipe_timer_update(pl_timer_interval, *network_load_value); +} +/* timer housekeeping, invoked each timer interval to reset counters */ +static ticks_t pl_timer_handle(ticks_t ticks, struct timer_ln* tl, void* data) +{ + pl_timer_refresh(); return (ticks_t)(-1); /* periodical */ } +static void pl_timer_exec(unsigned int ticks, void *param) +{ + pl_timer_refresh(); +} + /* rpc function documentation */ const char *rpc_pl_stats_doc[2] = {