int register_udp_load_stat(str *name, stat_var **s) { char *stat_name; *s = shm_malloc(sizeof(stat_var)); if (!*s) { LM_ERR("no more shm\n"); return -1; } memset(*s,0,sizeof(stat_var)); (*s)->u.val = shm_malloc(sizeof(stat_val)); if (!(*s)->u.val) { LM_ERR("no more shm\n"); return -1; } memset((*s)->u.val,0,sizeof(stat_val)); if ( (stat_name = build_stat_name(name,"load")) == 0 || register_stat2("load",stat_name,(stat_var**)calc_udp_load, STAT_IS_FUNC,*s) != 0) { LM_ERR("failed to add load stat\n"); return -1; } return 0; }
int register_tcp_load_stat(atomic_t *ctx) { if (register_stat2("load","tcp-load",(stat_var**)calc_tcp_load,STAT_IS_FUNC,ctx) != 0) { LM_ERR("failed to add load stat\n"); return -1; } return 0; }
int register_udp_load_stat(str *name,atomic_t *ctx) { char *stat_name; if ( (stat_name = build_stat_name(name,"load")) == 0 || register_stat2("load",stat_name,(stat_var**)calc_udp_load,STAT_IS_FUNC,ctx) != 0) { LM_ERR("failed to add load stat\n"); return -1; } return 0; }
int register_tcp_load_stat(stat_var **s) { *s = shm_malloc(sizeof(stat_var)); if (!*s) { LM_ERR("no more shm\n"); return -1; } memset(*s,0,sizeof(stat_var)); (*s)->u.val = shm_malloc(sizeof(stat_val)); if (!(*s)->u.val) { LM_ERR("no more shm\n"); return -1; } memset((*s)->u.val,0,sizeof(stat_val)); if (register_stat2("load","tcp-load",(stat_var**)calc_tcp_load, STAT_IS_FUNC,*s) != 0) { LM_ERR("failed to add load stat\n"); return -1; } return 0; }
int init_pkg_stats(int no_procs) { unsigned short n; str n_str; char *name; LM_DBG("setting stats for %d processes\n",no_procs); pkg_status = shm_malloc(no_procs*sizeof(pkg_status_holder)); marker_t = shm_malloc(no_procs*sizeof(time_t)); if (pkg_status==NULL || marker_t==NULL) { LM_ERR("no more pkg mem for stats\n"); return -1; } memset( pkg_status, 0, no_procs*sizeof(pkg_status_holder)); memset( marker_t, 0, no_procs*sizeof(time_t)); no_pkg_status = no_procs; /* build the stats and register them */ for( n=0 ; n<no_procs ; n++) { n_str.s = int2str( n, &n_str.len); if ( (name=build_stat_name( &n_str,"total_size"))==0 || register_stat2("pkmem", name, (stat_var**)get_pkg_total_size, STAT_NO_RESET|STAT_SHM_NAME|STAT_IS_FUNC, (void*)(long)n, 0)!=0 ) { LM_ERR("failed to add stat variable\n"); return -1; } if ( (name=build_stat_name( &n_str,"used_size"))==0 || register_stat2("pkmem", name, (stat_var**)get_pkg_used_size, STAT_NO_RESET|STAT_SHM_NAME|STAT_IS_FUNC, (void*)(long)n, 0)!=0 ) { LM_ERR("failed to add stat variable\n"); return -1; } if ( (name=build_stat_name( &n_str,"real_used_size"))==0 || register_stat2("pkmem", name, (stat_var**)get_pkg_real_used_size, STAT_NO_RESET|STAT_SHM_NAME|STAT_IS_FUNC, (void*)(long)n, 0)!=0 ) { LM_ERR("failed to add stat variable\n"); return -1; } if ( (name=build_stat_name( &n_str,"max_used_size"))==0 || register_stat2("pkmem", name, (stat_var**)get_pkg_max_used_size, STAT_NO_RESET|STAT_SHM_NAME|STAT_IS_FUNC, (void*)(long)n, 0)!=0 ) { LM_ERR("failed to add stat variable\n"); return -1; } if ( (name=build_stat_name( &n_str,"free_size"))==0 || register_stat2("pkmem", name, (stat_var**)get_pkg_free_size, STAT_NO_RESET|STAT_SHM_NAME|STAT_IS_FUNC, (void*)(long)n, 0)!=0 ) { LM_ERR("failed to add stat variable\n"); return -1; } if ( (name=build_stat_name( &n_str,"fragments"))==0 || register_stat2("pkmem", name, (stat_var**)get_pkg_fragments, STAT_NO_RESET|STAT_SHM_NAME|STAT_IS_FUNC, (void*)(long)n, 0)!=0 ) { LM_ERR("failed to add stat variable\n"); return -1; } } return 0; }
int add_cc_agent( struct cc_data *data, str *id, str *location, str *skills, unsigned int logstate, unsigned int last_call_end) { struct cc_agent *agent, *prev_agent= 0; struct sip_uri uri; str skill; char *p; unsigned int n,skill_id; #ifdef STATISTICS char *name; str s; #endif /* is the agent a new one? - search by ID */ agent = get_agent_by_name( data, id, &prev_agent); if (agent==NULL) { /* new agent -> create and populate one */ agent = (struct cc_agent*)shm_malloc(sizeof(struct cc_agent)+id->len); if (agent==NULL) { LM_ERR("not enough shmem for a new agent\n"); goto error; } memset( agent, 0, sizeof(struct cc_agent) ); /* id */ agent->id.s = (char*)(agent+1); memcpy( agent->id.s, id->s, id->len); agent->id.len = id->len; /* location */ agent->location.s = (char*)shm_malloc(location->len); if (agent->location.s==NULL) { LM_ERR("not enough shmem for the location of the agent\n"); goto error; } memcpy( agent->location.s, location->s, location->len); agent->location.len = location->len; if (parse_uri( agent->location.s, agent->location.len, &uri)<0) { LM_ERR("location of the agent is not a SIP URI\n"); goto error; } agent->did = uri.user; /* LOG STATE */ agent->loged_in = logstate; /* set of skills */ if (skills && skills->len) { p = skills->s; while (p) { skill.s = p; p = q_memchr(skill.s, ',', skills->s+skills->len-skill.s); skill.len = p?(p-skill.s):(skills->s+skills->len-skill.s); trim(&skill); if (skill.len) { skill_id = get_skill_id(data,&skill); if (skill_id==0) { LM_ERR("cannot get skill id\n"); goto error; } n = agent->no_skills++; agent->skills[n] = skill_id; } if(p) p++; } } /* statistics */ #ifdef STATISTICS s.s = "cca_dist_incalls";s.len = 16 ; if ( (name=build_stat_name( &s, id->s))==0 || register_stat("call_center", name, &agent->st_dist_incalls, STAT_SHM_NAME)!=0 ) { LM_ERR("failed to add stat variable\n"); goto error; } s.s = "cca_answ_incalls";s.len = 16 ; if ( (name=build_stat_name( &s, id->s))==0 || register_stat("call_center", name, &agent->st_answ_incalls, STAT_SHM_NAME)!=0 ) { LM_ERR("failed to add stat variable\n"); goto error; } s.s = "cca_aban_incalls";s.len = 16 ; if ( (name=build_stat_name( &s, id->s))==0 || register_stat("call_center", name, &agent->st_aban_incalls, STAT_SHM_NAME)!=0 ) { LM_ERR("failed to add stat variable\n"); goto error; } s.s = "cca_att";s.len = 7 ; if ( (name=build_stat_name( &s, id->s))==0 || register_stat2("call_center", name, (stat_var **)cc_agent_get_att, STAT_SHM_NAME|STAT_IS_FUNC, (void*)agent, 0)!=0) { LM_ERR("failed to add stat variable\n"); goto error; } #endif if(last_call_end && (last_call_end + wrapup_time < (int)time(NULL))) { agent->state = CC_AGENT_WRAPUP; agent->last_call_end = last_call_end - startup_time; /* it will be a negative value */ } agent->is_new = 1; /* link the agent */ add_cc_agent_top(data, agent); data->totalnr_agents++; } else { /* agent already exists -> update only */ /* location - needs to be changed ? */ if ( agent->location.len!=location->len || memcmp(agent->location.s,location->s,location->len)!=0 ) { /* set new location */ if (agent->location.len < location->len ){ shm_free(agent->location.s); agent->location.s = (char*)shm_malloc(location->len); if (agent->location.s==NULL) { LM_ERR("not enough shmem for the location of the agent\n"); goto error1; } } memcpy( agent->location.s, location->s, location->len); agent->location.len = location->len; if (parse_uri( agent->location.s, agent->location.len, &uri)<0) { LM_ERR("location of the agent is not a SIP URI\n"); goto error1; } agent->did = uri.user; } /* if logstate changed - move between the lists TODO */ if(logstate != agent->loged_in) { agent_switch_login(data, agent, prev_agent); } /* skills - needs to be changed ? */ agent->no_skills = 0; if (skills && skills->len) { p = skills->s; while (p) { skill.s = p; p = q_memchr(skill.s, ',', skills->s+skills->len-skill.s); skill.len = p?(p-skill.s):(skills->s+skills->len-skill.s); trim(&skill); if (skill.len) { skill_id = get_skill_id(data,&skill); if (skill_id==0) { LM_ERR("cannot get skill id\n"); goto error1; } n = agent->no_skills++; agent->skills[n] = skill_id; } if(p) p++; } } agent->is_new = 1; } return 0; error1: remove_cc_agent(data, agent, prev_agent); error: if (agent) free_cc_agent(agent); return 0; }
int add_cc_flow( struct cc_data *data, str *id, int priority, str *skill, str *cid, str *recordings ) { struct cc_flow *flow, *prev_flow; unsigned int i; unsigned int skill_id; #ifdef STATISTICS char *name; str s; #endif /* is the flow a new one? - search by ID */ flow = get_flow_by_name( data, id); if (flow==NULL) { /* new flow -> create and populate one */ flow = (struct cc_flow*)shm_malloc(sizeof(struct cc_flow)+id->len); if (flow==NULL) { LM_ERR("not enough shmem for a new flow\n"); goto error; } memset( flow, 0, sizeof(struct cc_flow) ); /* id */ flow->id.s = (char*)(flow+1); memcpy( flow->id.s, id->s, id->len); flow->id.len = id->len; /* priority */ flow->priority = priority; /* skill */ flow->skill = get_skill_id( data, skill ); if (flow->skill==0) { LM_ERR("cannot get skill id\n"); goto error; } /* cid */ if (cid && cid->s && cid->len) { flow->cid.s = (char*)shm_malloc(cid->len); if (flow->cid.s==NULL) { LM_ERR("not enough shmem for the cid of the flow\n"); goto error; } memcpy( flow->cid.s, cid->s, cid->len); flow->cid.len = cid->len; } /* audio messages */ for( i=0 ; i<MAX_AUDIO ; i++ ) { if (recordings[i].s && recordings[i].len) { flow->recordings[i].s = (char*)shm_malloc(recordings[i].len); if (flow->recordings[i].s==NULL) { LM_ERR("not enough shmem for the message %d of the flow\n", i); goto error; } memcpy( flow->recordings[i].s, recordings[i].s, recordings[i].len); flow->recordings[i].len = recordings[i].len; } } #ifdef STATISTICS /* statistics */ s.s = "ccf_incalls";s.len = 11 ; if ( (name=build_stat_name( &s, id->s))==0 || register_stat("call_center", name, &flow->st_incalls, STAT_SHM_NAME)!=0 ) { LM_ERR("failed to add stat variable\n"); goto error; } s.s = "ccf_dist_incalls";s.len = 15 ; if ( (name=build_stat_name( &s, id->s))==0 || register_stat("call_center", name, &flow->st_dist_incalls, STAT_SHM_NAME)!=0 ) { LM_ERR("failed to add stat variable\n"); goto error; } s.s = "ccf_answ_incalls";s.len = 15 ; if ( (name=build_stat_name( &s, id->s))==0 || register_stat("call_center", name, &flow->st_answ_incalls, STAT_SHM_NAME)!=0 ) { LM_ERR("failed to add stat variable\n"); goto error; } s.s = "ccf_aban_incalls";s.len = 15 ; if ( (name=build_stat_name( &s, id->s))==0 || register_stat("call_center", name, &flow->st_aban_incalls, STAT_SHM_NAME)!=0 ) { LM_ERR("failed to add stat variable\n"); goto error; } s.s = "ccf_onhold_calls";s.len = 15 ; if ( (name=build_stat_name( &s, id->s))==0 || register_stat("call_center", name, &flow->st_onhold_calls, STAT_SHM_NAME)!=0 ) { LM_ERR("failed to add stat variable\n"); goto error; } s.s = "ccf_queued_calls";s.len = 16 ; if ( (name=build_stat_name( &s, id->s))==0 || register_stat("call_center", name, &flow->st_queued_calls, STAT_SHM_NAME|STAT_NO_RESET)!=0 ) { LM_ERR("failed to add stat variable\n"); goto error; } s.s = "ccf_etw";s.len = 7 ; if ( (name=build_stat_name( &s, id->s))==0 || register_stat2("call_center", name, (stat_var **)cc_flow_get_etw, STAT_SHM_NAME|STAT_IS_FUNC, (void*)flow, 0)!=0) { LM_ERR("failed to add stat variable\n"); goto error; } s.s = "ccf_awt";s.len = 7 ; if ( (name=build_stat_name( &s, id->s))==0 || register_stat2("call_center", name, (stat_var **)cc_flow_get_awt, STAT_SHM_NAME|STAT_IS_FUNC, (void*)flow, 0)!=0) { LM_ERR("failed to add stat variable\n"); goto error; } s.s = "ccf_load";s.len = 8 ; if ( (name=build_stat_name( &s, id->s))==0 || register_stat2("call_center", name, (stat_var **)cc_flow_get_load, STAT_SHM_NAME|STAT_IS_FUNC, (void*)flow, 0)!=0) { LM_ERR("failed to add stat variable\n"); goto error; } s.s = "ccf_free_agents";s.len = 15 ; if ( (name=build_stat_name( &s, id->s))==0 || register_stat2("call_center", name, (stat_var **)cc_flow_free_agents, STAT_SHM_NAME|STAT_IS_FUNC, (void*)flow, 0)!=0) { LM_ERR("failed to add stat variable\n"); goto error; } #endif flow->is_new = 1; /* insert the new flow in the list */ flow->next = data->flows; data->flows = flow; } else { /* flow already exists -> update */ /* priority */ flow->priority = priority; /* skill - needs to be changed ? */ skill_id = get_skill_id(data,skill); if (skill_id==0) { LM_ERR("cannot get skill id\n"); goto error1; } flow->skill = skill_id; /* cid - needs to be changed ? */ if ( flow->cid.len && ( cid->len==0 || cid->len>flow->cid.len || memcmp(flow->cid.s,cid->s,cid->len)!=0) ) { shm_free(flow->cid.s); flow->cid.s = NULL; flow->cid.len = 0 ; } if (flow->cid.s==NULL && cid->len!=0) { flow->cid.s = (char*)shm_malloc(cid->len); if (flow->cid.s==NULL) { LM_ERR("not enough shmem for the cid of the flow\n"); goto error1; } } if (flow->cid.s) { memcpy( flow->cid.s, cid->s, cid->len); flow->cid.len = cid->len; } /* audio messages */ for( i=0 ; i<MAX_AUDIO ; i++ ) { if ( flow->recordings[i].len && ( recordings[i].len==0 || recordings[i].len>flow->recordings[i].len || memcmp(flow->recordings[i].s,recordings[i].s,recordings[i].len) ) ) { shm_free(flow->recordings[i].s); flow->recordings[i].s = NULL; flow->recordings[i].len = 0 ; } if (flow->recordings[i].s==NULL && recordings[i].len!=0) { flow->recordings[i].s = (char*)shm_malloc(recordings[i].len); if (flow->recordings[i].s==NULL) { LM_ERR("not enough shmem for the message of the flow\n"); goto error1; } } if (flow->recordings[i].s) { memcpy( flow->recordings[i].s, recordings[i].s, recordings[i].len); flow->recordings[i].len = recordings[i].len; } } flow->is_new = 1; } return 0; error1: if(data->flows == flow) data->flows = flow->next; else for(prev_flow=data->flows; prev_flow; prev_flow=prev_flow->next) if(prev_flow->next == flow) { prev_flow->next = flow->next; break; } error: if (flow) free_cc_flow(flow); return -1; }