fix crash when deleting data from source where there are no events or predicates...

(that happens when all testcases are too complicated and use all features..)
This commit is contained in:
Bernhard Amann 2012-03-22 10:33:49 -07:00
parent 51ddc9f572
commit 0db89bed3b

View file

@ -916,16 +916,18 @@ void Manager::EndCurrentSend(ReaderFrontend* reader) {
ListVal * idx = 0; ListVal * idx = 0;
Val *val = 0; Val *val = 0;
Val* predidx = 0;
EnumVal* ev = 0;
int startpos = 0;
if ( filter->pred || filter->event ) { if ( filter->pred || filter->event ) {
idx = filter->tab->RecoverIndex(ih->idxkey); idx = filter->tab->RecoverIndex(ih->idxkey);
assert(idx != 0); assert(idx != 0);
val = filter->tab->Lookup(idx); val = filter->tab->Lookup(idx);
assert(val != 0); assert(val != 0);
predidx = ListValToRecordVal(idx, filter->itype, &startpos);
ev = new EnumVal(BifEnum::Input::EVENT_REMOVED, BifType::Enum::Input::Event);
} }
int startpos = 0;
Val* predidx = ListValToRecordVal(idx, filter->itype, &startpos);
EnumVal* ev = new EnumVal(BifEnum::Input::EVENT_REMOVED, BifType::Enum::Input::Event);
if ( filter->pred ) { if ( filter->pred ) {
// ask predicate, if we want to expire this element... // ask predicate, if we want to expire this element...
@ -953,8 +955,10 @@ void Manager::EndCurrentSend(ReaderFrontend* reader) {
SendEvent(filter->event, 3, ev, predidx, val); SendEvent(filter->event, 3, ev, predidx, val);
} }
Unref(predidx); if ( predidx ) // if we have a filter or an event...
Unref(ev); Unref(predidx);
if ( ev )
Unref(ev);
filter->tab->Delete(ih->idxkey); filter->tab->Delete(ih->idxkey);
filter->lastDict->Remove(lastDictIdxKey); // deletex in next line filter->lastDict->Remove(lastDictIdxKey); // deletex in next line
@ -1321,6 +1325,7 @@ RecordVal* Manager::ListValToRecordVal(ListVal* list, RecordType *request_type,
RecordVal* rec = new RecordVal(request_type->AsRecordType()); RecordVal* rec = new RecordVal(request_type->AsRecordType());
assert(list != 0);
int maxpos = list->Length(); int maxpos = list->Length();
for ( int i = 0; i < request_type->NumFields(); i++ ) { for ( int i = 0; i < request_type->NumFields(); i++ ) {