int register_stats() { //UAR if (register_stat(MOD_NAME, "uar_replies_response_time", &uar_replies_response_time,0 ) != 0) { LM_ERR("failed to register stat\n"); return -1; } if (register_stat(MOD_NAME, "uar_replies_received", &uar_replies_received, 0) != 0) { LM_ERR("failed to register stat\n"); return -1; } //LIR if (register_stat(MOD_NAME, "lir_replies_response_time", &lir_replies_response_time,0 ) != 0) { LM_ERR("failed to register stat\n"); return -1; } if (register_stat(MOD_NAME, "lir_replies_received", &lir_replies_received, 0) != 0) { LM_ERR("failed to register stat\n"); return -1; } return 1; }
int new_udomain(str* _n, int _s, udomain_t** _d) { int i; #ifdef STATISTICS char *name; #endif /* Must be always in shared memory, since * the cache is accessed from timer which * lives in a separate process */ *_d = (udomain_t*)shm_malloc(sizeof(udomain_t)); if (!(*_d)) { LM_ERR("new_udomain(): No memory left\n"); goto error0; } memset(*_d, 0, sizeof(udomain_t)); (*_d)->table = (hslot_t*)shm_malloc(sizeof(hslot_t) * _s); if (!(*_d)->table) { LM_ERR("no memory left 2\n"); goto error1; } (*_d)->name = _n; for(i = 0; i < _s; i++) { init_slot(*_d, &((*_d)->table[i]), i); } (*_d)->size = _s; #ifdef STATISTICS /* register the statistics */ if ( (name=build_stat_name(_n,"contacts"))==0 || register_stat("usrloc", name, &(*_d)->contacts, STAT_NO_RESET|STAT_SHM_NAME)!=0 ) { LM_ERR("failed to add stat variable\n"); goto error2; } if ( (name=build_stat_name(_n,"expires"))==0 || register_stat("usrloc", name, &(*_d)->expired, STAT_SHM_NAME)!=0 ) { LM_ERR("failed to add stat variable\n"); goto error2; } #endif return 0; #ifdef STATISTICS error2: shm_free((*_d)->table); #endif error1: shm_free(*_d); error0: return -1; }
void init_shm_statistics(void) { #ifdef HP_MALLOC hp_init_shm_statistics(shm_block); #endif #ifdef SHM_EXTRA_STATS struct multi_str *mod_name; int i, len; char *full_name = NULL; if(mem_free_idx != 1){ #ifdef SHM_SHOW_DEFAULT_GROUP if (register_stat("shmem_group_default", "fragments", (stat_var **)&memory_mods_stats[0].fragments, STAT_NO_RESET|STAT_ONLY_REGISTER)!=0 ) { LM_CRIT("can't add stat variable"); return; } if (register_stat("shmem_group_default", "memory_used", (stat_var **)&memory_mods_stats[0].memory_used, STAT_NO_RESET|STAT_ONLY_REGISTER)!=0 ) { LM_CRIT("can't add stat variable"); return; } if (register_stat("shmem_group_default", "real_used", (stat_var **)&memory_mods_stats[0].real_used, STAT_NO_RESET|STAT_ONLY_REGISTER)!=0 ) { LM_CRIT("can't add stat variable"); return; } i = mem_free_idx - 1; #else i = mem_free_idx - 2; #endif for(mod_name = mod_names; mod_name != NULL; mod_name = mod_name->next){ len = strlen(mod_name->s); full_name = pkg_malloc((len + STAT_PREFIX_LEN + 1) * sizeof(char)); strcpy(full_name, STAT_PREFIX); strcat(full_name, mod_name->s); if (register_stat(full_name, "fragments", (stat_var **)&memory_mods_stats[i].fragments, STAT_NO_RESET|STAT_ONLY_REGISTER)!=0 ) { LM_CRIT("can't add stat variable"); return; } if (register_stat(full_name, "memory_used", (stat_var **)&memory_mods_stats[i].memory_used, STAT_NO_RESET|STAT_ONLY_REGISTER)!=0 ) { LM_CRIT("can't add stat variable"); return; } if (register_stat(full_name, "real_used", (stat_var **)&memory_mods_stats[i].real_used, STAT_NO_RESET|STAT_ONLY_REGISTER)!=0 ) { LM_CRIT("can't add stat variable"); return; } i--; } } #endif }
/*! Adds the message code statistics to the statistics framework */ static int register_message_code_statistics(void) { int i; int number_of_message_codes = sizeof(in_message_code_names) / sizeof(char *); in_message_code_stats = shm_malloc(sizeof(stat_var *) * number_of_message_codes); out_message_code_stats = shm_malloc(sizeof(stat_var *) * number_of_message_codes); /* We can only proceed if we had enough memory to allocate the * statistics. Note that we don't free the memory, but we don't care * because the system is going to shut down */ if(in_message_code_stats == NULL || out_message_code_stats == NULL) { return -1; } /* Make sure everything is zeroed out */ memset(in_message_code_stats, 0, sizeof(stat_var *) * number_of_message_codes); memset(out_message_code_stats, 0, sizeof(stat_var *) * number_of_message_codes); for(i = 0; i < number_of_message_codes; i++) { if(register_stat(SNMPSTATS_MODULE_NAME, in_message_code_names[i], &in_message_code_stats[i], 0)!=0) { LM_ERR("failed to register in_message_code_names[%d]\n", i); } if(register_stat(SNMPSTATS_MODULE_NAME, out_message_code_names[i], &out_message_code_stats[i], 0)!=0) { LM_ERR("failed to register out_message_code_names[%d]\n", i); } } return 0; }
int register_module_stats(char *module, stat_export_t *stats) { int ret; if (module==0 || module[0]==0 || !stats || !stats[0].name) return 0; for( ; stats->name ; stats++) { ret = register_stat( module, stats->name, stats->stat_pointer, stats->flags); if (ret!=0) { LM_CRIT("failed to add statistic\n"); return -1; } } return 0; }
int register_all_mod_stats(void) { stat_var *stat; stat_elem *se; stat_elem *se_tmp; se = stat_list; stat = NULL; while( se ) { se_tmp = se; se = se->next; /* register the new variable */ if (register_stat(MODULE_STATS, se_tmp->name, &stat, se_tmp->flags)!=0){ LM_ERR("failed to register var. <%s> flags %d\n", se_tmp->name,se_tmp->flags); return -1; } pkg_free(se_tmp); } 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; }