Solved some locking issues. New cdrid and runid parameters that uniquely

identify a CDR entry.


git-svn-id: http://yate.null.ro/svn/yate/trunk@1430 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
paulc 2007-08-23 09:09:42 +00:00
parent b7cf26eee1
commit 491a69e765
2 changed files with 14 additions and 1 deletions

View File

@ -21,5 +21,5 @@
;username=false
; The following parameters are handled internally and cannot be changed:
; time, chan, operation, cdrwrite,
; time, chan, operation, cdrwrite, cdrid, runid,
; direction, status, duration, billtime, ringtime

View File

@ -77,6 +77,7 @@ private:
m_hangup;
String m_dir;
String m_status;
String m_cdrId;
bool m_first;
bool m_write;
};
@ -100,6 +101,8 @@ static ObjList s_cdrs;
static Mutex s_mutex;
static ObjList s_params;
static int s_res = 1;
static int s_seq = 0;
static String s_runId;
// Time resolutions
static TokenDict const s_timeRes[] = {
@ -135,6 +138,8 @@ static const char* const s_forbidden[] = {
"billtime",
"ringtime",
"cdrwrite",
"cdrid",
"runid",
0
};
@ -163,6 +168,7 @@ CdrBuilder::CdrBuilder(const char *name)
m_first(true), m_write(true)
{
m_start = m_call = m_ringing = m_answer = m_hangup = 0;
m_cdrId = ++s_seq;
}
CdrBuilder::~CdrBuilder()
@ -200,6 +206,8 @@ void CdrBuilder::emit(const char *operation)
Message *m = new Message("call.cdr");
m->addParam("time",printTime(buf,m_start));
m->addParam("chan",c_str());
m->addParam("cdrid",m_cdrId);
m->addParam("runid",s_runId);
m->addParam("operation",operation);
m->addParam("direction",m_dir);
m->addParam("duration",printTime(buf,t_hangup - m_start));
@ -253,7 +261,9 @@ void CdrBuilder::update(int type, u_int64_t val)
break;
case CdrHangup:
m_hangup = val;
s_mutex.lock();
s_cdrs.remove(this);
s_mutex.unlock();
return;
}
}
@ -344,11 +354,13 @@ bool CdrHandler::received(Message &msg)
return false;
}
bool rval = false;
s_mutex.lock();
CdrBuilder *b = CdrBuilder::find(id);
if (!b && ((m_type == CdrStart) || (m_type == CdrCall))) {
b = new CdrBuilder(id);
s_cdrs.append(b);
}
s_mutex.unlock();
if (b)
rval = b->update(msg,m_type,msg.msgTime().usec());
else
@ -441,6 +453,7 @@ void CdrBuildPlugin::initialize()
s_mutex.unlock();
if (m_first) {
m_first = false;
s_runId = Engine::runId();
Engine::install(new CdrHandler("chan.startup",CdrStart));
Engine::install(new CdrHandler("call.route",CdrRoute));
Engine::install(new CdrHandler("call.execute",CdrCall));