You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kamailio/lib/cds/ser_profile.c

94 lines
2.3 KiB

#ifdef SER
#ifdef DO_PROFILE
#include <cds/ser_profile.h>
#include "dprint.h"
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
DEFINE_PROF_POINT(pa_handle_subscription)
DEFINE_PROF_POINT(pa_timer_presentity)
DEFINE_PROF_POINT(pa_timer_pdomain)
DEFINE_PROF_POINT(pa_response_generation)
DEFINE_PROF_POINT(rls_handle_subscription)
DEFINE_PROF_POINT(rls_timer_cb)
DEFINE_PROF_POINT(rls_is_simple_rls_target)
DEFINE_PROF_POINT(rls_query_rls_sevices)
DEFINE_PROF_POINT(rls_query_resource_list)
DEFINE_PROF_POINT(rls_have_flat_list)
DEFINE_PROF_POINT(tem_timer_cb)
DEFINE_PROF_POINT(tem_add_event)
DEFINE_PROF_POINT(tem_remove_event)
DEFINE_PROF_POINT(tem_do_step)
DEFINE_PROF_POINT(b2b_handle_notify)
void prof_trace(FILE *f, int pid, const char *s, profile_data_t a)
{
fprintf(f, "%d\t%30s\t%d\t%u\n",
pid, s, a.count, a.spent_time);
if (a.start_count != a.stop_count)
fprintf(f, "%s, %d start_count != stop_count (%d != %d)\n",
s, pid, a.start_count, a.stop_count);
}
void prof_trace_nested(FILE *f, int pid, const char *s, profile_data_t a)
{
fprintf(f, "%d\t%29s*\t%d\t%u\n",
pid, s, a.count, a.spent_time);
if (a.start_count != a.stop_count)
fprintf(f, "%s, %d start_count != stop_count (%d != %d)\n",
s, pid, a.start_count, a.stop_count);
}
#define trace(f, p, name) prof_trace(f, p, #name , prof_point(name))
#define trace_nested(f, p, name) prof_trace_nested(f, p, #name , prof_point(name))
void trace_func()
{
pid_t p = getpid();
FILE *f;
f = fopen("/tmp/ser.profile", "at");
if (!f) ERR("can't write into profile file\n");
else {
trace(f, p, pa_handle_subscription);
trace(f, p, pa_timer_pdomain);
trace_nested(f, p, pa_timer_presentity);
trace_nested(f, p, pa_response_generation);
trace(f, p, rls_handle_subscription);
trace(f, p, rls_timer_cb);
trace(f, p, rls_is_simple_rls_target);
trace(f, p, rls_query_rls_sevices);
trace(f, p, rls_query_resource_list);
trace(f, p, rls_have_flat_list);
/* trace_nested(f, p, tem_timer_cb); */
trace(f, p, tem_add_event);
trace(f, p, tem_remove_event);
trace(f, p, tem_do_step);
trace(f, p, b2b_handle_notify);
fprintf(f, "%d\t%30s\t1\t%u\n", p, "all", get_prof_time());
fclose(f);
}
}
void ser_profile_init()
{
WARN("initializing profiler\n");
start_profile(trace_func);
}
#endif /* DO_PROFILE */
#endif /* SER */