diff --git a/src/Frame.cc b/src/Frame.cc index 42de2b1e16..73084074bd 100644 --- a/src/Frame.cc +++ b/src/Frame.cc @@ -25,7 +25,6 @@ Frame::Frame(int arg_size, const BroFunc* func, const val_list* fn_args) break_before_next_stmt = false; break_on_return = false; - trigger = nullptr; call = nullptr; delayed = false; @@ -43,9 +42,6 @@ Frame::~Frame() Unref(func); } - // Deleting a Frame that is a view is a no-op. - Unref(trigger); - if ( ! weak_closure_ref ) Unref(closure); @@ -183,8 +179,6 @@ Frame* Frame::Clone() const other->call = call; other->trigger = trigger; - if ( trigger ) - Ref(trigger); for (int i = 0; i < size; i++) other->frame[i] = frame[i] ? frame[i]->Clone().release() : nullptr; @@ -359,14 +353,14 @@ broker::expected Frame::Serialize(const Frame* target, const id_li return {std::move(rval)}; } -std::pair Frame::Unserialize(const broker::vector& data) +std::pair> Frame::Unserialize(const broker::vector& data) { if ( data.size() == 0 ) return std::make_pair(true, nullptr); id_list outer_ids; std::unordered_map offset_map; - Frame* closure = nullptr; + IntrusivePtr closure; auto where = data.begin(); @@ -410,7 +404,7 @@ std::pair Frame::Unserialize(const broker::vector& data) return std::make_pair(false, nullptr); } - closure = closure_pair.second; + closure = std::move(closure_pair.second); } auto has_vec = broker::get_if(*where); @@ -448,11 +442,11 @@ std::pair Frame::Unserialize(const broker::vector& data) int frame_size = body.size(); // We'll associate this frame with a function later. - Frame* rf = new Frame(frame_size, nullptr, nullptr); + auto rf = make_intrusive(frame_size, nullptr, nullptr); rf->offset_map = std::move(offset_map); // Frame takes ownership of unref'ing elements in outer_ids rf->outer_ids = std::move(outer_ids); - rf->closure = closure; + rf->closure = closure.release(); rf->weak_closure_ref = false; for ( int i = 0; i < frame_size; ++i ) @@ -463,32 +457,23 @@ std::pair Frame::Unserialize(const broker::vector& data) broker::vector val_tuple = *has_vec; if ( val_tuple.size() != 2 ) - { - Unref(rf); return std::make_pair(false, nullptr); - } auto has_type = broker::get_if(val_tuple[1]); if ( ! has_type ) - { - Unref(rf); return std::make_pair(false, nullptr); - } broker::integer g = *has_type; BroType t( static_cast(g) ); auto val = bro_broker::data_to_val(std::move(val_tuple[0]), &t); if ( ! val ) - { - Unref(rf); return std::make_pair(false, nullptr); - } rf->frame[i] = val.release(); } - return std::make_pair(true, rf); + return std::make_pair(true, std::move(rf)); } void Frame::AddKnownOffsets(const id_list& ids) @@ -521,19 +506,13 @@ void Frame::CaptureClosure(Frame* c, id_list arg_outer_ids) // if (c) closure = c->SelectiveClone(outer_ids); } -void Frame::SetTrigger(trigger::Trigger* arg_trigger) +void Frame::SetTrigger(IntrusivePtr arg_trigger) { - ClearTrigger(); - - if ( arg_trigger ) - Ref(arg_trigger); - - trigger = arg_trigger; + trigger = std::move(arg_trigger); } void Frame::ClearTrigger() { - Unref(trigger); trigger = nullptr; } diff --git a/src/Frame.h b/src/Frame.h index 8a5c3b339a..d999b6f3ed 100644 --- a/src/Frame.h +++ b/src/Frame.h @@ -4,6 +4,7 @@ #include "BroList.h" // for typedef val_list #include "Obj.h" +#include "IntrusivePtr.h" #include #include @@ -189,7 +190,7 @@ public: * and the second is the unserialized frame with reference count +1, or * null if the serialization wasn't successful. */ - static std::pair Unserialize(const broker::vector& data); + static std::pair> Unserialize(const broker::vector& data); /** * Sets the IDs that the frame knows offsets for. These offsets will @@ -210,9 +211,9 @@ public: // If the frame is run in the context of a trigger condition evaluation, // the trigger needs to be registered. - void SetTrigger(trigger::Trigger* arg_trigger); + void SetTrigger(IntrusivePtr arg_trigger); void ClearTrigger(); - trigger::Trigger* GetTrigger() const { return trigger; } + trigger::Trigger* GetTrigger() const { return trigger.get(); } void SetCall(const CallExpr* arg_call) { call = arg_call; } void ClearCall() { call = 0; } @@ -290,7 +291,7 @@ private: bool break_before_next_stmt; bool break_on_return; - trigger::Trigger* trigger; + IntrusivePtr trigger; const CallExpr* call; bool delayed; diff --git a/src/Func.cc b/src/Func.cc index 6e94debd6a..777fcdf3d8 100644 --- a/src/Func.cc +++ b/src/Func.cc @@ -337,7 +337,7 @@ IntrusivePtr BroFunc::Call(val_list* args, Frame* parent) const // Hand down any trigger. if ( parent ) { - f->SetTrigger(parent->GetTrigger()); + f->SetTrigger({NewRef{}, parent->GetTrigger()}); f->SetCall(parent->GetCall()); } @@ -525,7 +525,7 @@ bool BroFunc::UpdateClosure(const broker::vector& data) if ( ! result.first ) return false; - Frame* new_closure = result.second; + auto &new_closure = result.second; if ( new_closure ) new_closure->SetFunction(this); @@ -533,7 +533,7 @@ bool BroFunc::UpdateClosure(const broker::vector& data) Unref(closure); weak_closure_ref = false; - closure = new_closure; + closure = new_closure.release(); return true; } diff --git a/src/Trigger.cc b/src/Trigger.cc index 15d912fb2d..b962e449c1 100644 --- a/src/Trigger.cc +++ b/src/Trigger.cc @@ -265,7 +265,7 @@ bool Trigger::Eval() return false; } - f->SetTrigger(this); + f->SetTrigger({NewRef{}, this}); IntrusivePtr v;