Moving the map of writers from the filters to the streams.

This is in preparation for remote logging.
This commit is contained in:
Robin Sommer 2011-02-28 18:24:19 -08:00
parent ab15437339
commit e6edc52d54

View file

@ -32,18 +32,20 @@ struct LogMgr::Filter {
LogField** fields; LogField** fields;
vector<list<int> > indices; // List of record indices per field. vector<list<int> > indices; // List of record indices per field.
typedef map<string, LogWriter *> WriterMap;
WriterMap writers; // Writers indexed by path.
~Filter(); ~Filter();
}; };
struct LogMgr::Stream { struct LogMgr::Stream {
int id;
string name; string name;
RecordType* columns; RecordType* columns;
EventHandlerPtr event; EventHandlerPtr event;
list<Filter*> filters; list<Filter*> filters;
typedef pair<int, string> IdPathPair;
typedef map<IdPathPair, LogWriter *> WriterMap;
WriterMap writers; // Writers indexed by id/path pair.
~Stream(); ~Stream();
}; };
@ -53,15 +55,16 @@ LogMgr::Filter::~Filter()
for ( int i = 0; i < num_fields; ++i ) for ( int i = 0; i < num_fields; ++i )
delete fields[i]; delete fields[i];
for ( WriterMap::iterator i = writers.begin(); i != writers.end(); i++ )
delete i->second;
Unref(path_val); Unref(path_val);
} }
LogMgr::Stream::~Stream() LogMgr::Stream::~Stream()
{ {
Unref(columns); Unref(columns);
for ( WriterMap::iterator i = writers.begin(); i != writers.end(); i++ )
delete i->second;
for ( list<Filter*>::iterator f = filters.begin(); f != filters.end(); ++f ) for ( list<Filter*>::iterator f = filters.begin(); f != filters.end(); ++f )
delete *f; delete *f;
} }
@ -91,24 +94,19 @@ LogMgr::Stream* LogMgr::FindStream(EnumVal* id)
void LogMgr::RemoveDisabledWriters(Stream* stream) void LogMgr::RemoveDisabledWriters(Stream* stream)
{ {
for ( list<Filter*>::iterator i = stream->filters.begin(); i != stream->filters.end(); ++i ) list<Stream::IdPathPair> disabled;
for ( Stream::WriterMap::iterator j = stream->writers.begin(); j != stream->writers.end(); j++ )
{ {
Filter* filter = (*i); if ( j->second->Disabled() )
list<string> disabled;
for ( Filter::WriterMap::iterator j = filter->writers.begin(); j != filter->writers.end(); j++ )
{ {
if ( j->second->Disabled() ) delete j->second;
{ disabled.push_back(j->first);
delete j->second;
disabled.push_back(j->first);
}
} }
for ( list<string>::iterator j = disabled.begin(); j != disabled.end(); j++ )
filter->writers.erase(*j);
} }
for ( list<Stream::IdPathPair>::iterator j = disabled.begin(); j != disabled.end(); j++ )
stream->writers.erase(*j);
} }
bool LogMgr::CreateStream(EnumVal* id, RecordVal* sval) bool LogMgr::CreateStream(EnumVal* id, RecordVal* sval)
@ -166,6 +164,7 @@ bool LogMgr::CreateStream(EnumVal* id, RecordVal* sval)
// Create new stream. // Create new stream.
streams[idx] = new Stream; streams[idx] = new Stream;
streams[idx]->id = id->AsEnum();
streams[idx]->name = id->Type()->AsEnumType()->Lookup(idx); streams[idx]->name = id->Type()->AsEnumType()->Lookup(idx);
streams[idx]->event = event ? event_registry->Lookup(event->GetID()->Name()) : 0; streams[idx]->event = event ? event_registry->Lookup(event->GetID()->Name()) : 0;
streams[idx]->columns = columns; streams[idx]->columns = columns;
@ -455,10 +454,10 @@ bool LogMgr::Write(EnumVal* id, RecordVal* columns)
} }
// See if we already have a writer for this path. // See if we already have a writer for this path.
Filter::WriterMap::iterator w = filter->writers.find(path); Stream::WriterMap::iterator w = stream->writers.find(Stream::IdPathPair(stream->id, path));
LogWriter* writer = 0; LogWriter* writer = 0;
if ( w == filter->writers.end() ) if ( w == stream->writers.end() )
{ {
// No, need to create one. // No, need to create one.
assert(filter->writer->factory); assert(filter->writer->factory);
@ -476,7 +475,7 @@ bool LogMgr::Write(EnumVal* id, RecordVal* columns)
return false; return false;
} }
filter->writers.insert(Filter::WriterMap::value_type(path, writer)); stream->writers.insert(Stream::WriterMap::value_type(Stream::IdPathPair(stream->id, path), writer));
} }
else else
@ -589,11 +588,8 @@ bool LogMgr::SetBuf(EnumVal* id, bool enabled)
if ( ! stream ) if ( ! stream )
return false; return false;
for ( list<Filter*>::iterator i = stream->filters.begin(); i != stream->filters.end(); ++i ) for ( Stream::WriterMap::iterator i = stream->writers.begin(); i != stream->writers.end(); i++ )
{ i->second->SetBuf(enabled);
for ( Filter::WriterMap::iterator j = (*i)->writers.begin(); j != (*i)->writers.end(); j++ )
j->second->SetBuf(enabled);
}
RemoveDisabledWriters(stream); RemoveDisabledWriters(stream);
@ -606,11 +602,8 @@ bool LogMgr::Flush(EnumVal* id)
if ( ! stream ) if ( ! stream )
return false; return false;
for ( list<Filter*>::iterator i = stream->filters.begin(); i != stream->filters.end(); ++i ) for ( Stream::WriterMap::iterator i = stream->writers.begin(); i != stream->writers.end(); i++ )
{ i->second->Flush();
for ( Filter::WriterMap::iterator j = (*i)->writers.begin(); j != (*i)->writers.end(); j++ )
j->second->Flush();
}
RemoveDisabledWriters(stream); RemoveDisabledWriters(stream);