mirror of
https://github.com/zeek/zeek.git
synced 2025-10-03 15:18:20 +00:00
Remove CQ_TimerMgr in favor of PQ_TimerMgr
This commit is contained in:
parent
70b45d1aba
commit
2b2121be60
6 changed files with 16 additions and 125 deletions
|
@ -27,7 +27,7 @@ PriorityQueue::~PriorityQueue()
|
|||
PQ_Element* PriorityQueue::Remove()
|
||||
{
|
||||
if ( heap_size == 0 )
|
||||
return 0;
|
||||
return nullptr;
|
||||
|
||||
PQ_Element* top = heap[0];
|
||||
|
||||
|
@ -43,7 +43,7 @@ PQ_Element* PriorityQueue::Remove(PQ_Element* e)
|
|||
{
|
||||
if ( e->Offset() < 0 || e->Offset() >= heap_size ||
|
||||
heap[e->Offset()] != e )
|
||||
return 0; // not in heap
|
||||
return nullptr; // not in heap
|
||||
|
||||
e->MinimizeTime();
|
||||
BubbleUp(e->Offset());
|
||||
|
@ -56,7 +56,7 @@ PQ_Element* PriorityQueue::Remove(PQ_Element* e)
|
|||
return e2;
|
||||
}
|
||||
|
||||
int PriorityQueue::Add(PQ_Element* e)
|
||||
bool PriorityQueue::Add(PQ_Element* e)
|
||||
{
|
||||
SetElement(heap_size, e);
|
||||
|
||||
|
@ -70,10 +70,10 @@ int PriorityQueue::Add(PQ_Element* e)
|
|||
if ( heap_size >= max_heap_size )
|
||||
return Resize(max_heap_size * 2);
|
||||
else
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
int PriorityQueue::Resize(int new_size)
|
||||
bool PriorityQueue::Resize(int new_size)
|
||||
{
|
||||
PQ_Element** tmp = new PQ_Element*[new_size];
|
||||
for ( int i = 0; i < max_heap_size; ++i )
|
||||
|
@ -84,7 +84,7 @@ int PriorityQueue::Resize(int new_size)
|
|||
|
||||
max_heap_size = new_size;
|
||||
|
||||
return heap != 0;
|
||||
return heap != nullptr;
|
||||
}
|
||||
|
||||
void PriorityQueue::BubbleUp(int bin)
|
||||
|
|
|
@ -43,20 +43,20 @@ public:
|
|||
// is empty.
|
||||
PQ_Element* Remove();
|
||||
|
||||
// Removes element e. Returns e, or nil if e wasn't in the queue.
|
||||
// Removes element e. Returns e, or nullptr if e wasn't in the queue.
|
||||
// Note that e will be modified via MinimizeTime().
|
||||
PQ_Element* Remove(PQ_Element* e);
|
||||
|
||||
// Add a new element to the queue. Returns 0 on failure (not enough
|
||||
// memory to add the element), 1 on success.
|
||||
int Add(PQ_Element* e);
|
||||
// Add a new element to the queue. Returns false on failure (not enough
|
||||
// memory to add the element), true on success.
|
||||
bool Add(PQ_Element* e);
|
||||
|
||||
int Size() const { return heap_size; }
|
||||
int PeakSize() const { return peak_heap_size; }
|
||||
uint64_t CumulativeNum() const { return cumulative_num; }
|
||||
|
||||
protected:
|
||||
int Resize(int new_size);
|
||||
bool Resize(int new_size);
|
||||
|
||||
void BubbleUp(int bin);
|
||||
void BubbleDown(int bin);
|
||||
|
|
|
@ -1356,7 +1356,7 @@ TimerMgr* NetSessions::LookupTimerMgr(const TimerMgr::Tag* tag, bool create)
|
|||
return 0;
|
||||
|
||||
// Create new queue for tag.
|
||||
TimerMgr* mgr = new CQ_TimerMgr(*tag);
|
||||
TimerMgr* mgr = new PQ_TimerMgr(*tag);
|
||||
DBG_LOG(DBG_TM, "tag %s, creating new non-global timer mgr %p", tag->c_str(), mgr);
|
||||
timer_mgrs.insert(TimerMgrMap::value_type(*tag, mgr));
|
||||
double t = timer_mgr->Time() + timer_mgr_inactivity_timeout;
|
||||
|
|
|
@ -175,11 +175,9 @@ void ProfileLogger::Log()
|
|||
stats.nfa_states, stats.dfa_states, stats.computed, stats.mem / 1024));
|
||||
}
|
||||
|
||||
file->Write(fmt("%.06f Timers: current=%d max=%d mem=%dK lag=%.2fs\n",
|
||||
file->Write(fmt("%.06f Timers: current=%d max=%d lag=%.2fs\n",
|
||||
network_time,
|
||||
timer_mgr->Size(), timer_mgr->PeakSize(),
|
||||
int(cq_memory_allocation() +
|
||||
(timer_mgr->Size() * padded_sizeof(ConnectionTimer))) / 1024,
|
||||
network_time - timer_mgr->LastTimestamp()));
|
||||
|
||||
DNS_Mgr::Stats dstats;
|
||||
|
|
87
src/Timer.cc
87
src/Timer.cc
|
@ -87,8 +87,8 @@ PQ_TimerMgr::~PQ_TimerMgr()
|
|||
|
||||
void PQ_TimerMgr::Add(Timer* timer)
|
||||
{
|
||||
DBG_LOG(DBG_TM, "Adding timer %s to TimeMgr %p",
|
||||
timer_type_to_string(timer->Type()), this);
|
||||
DBG_LOG(DBG_TM, "Adding timer %s to TimeMgr %p at %.6f",
|
||||
timer_type_to_string(timer->Type()), this, timer->Time());
|
||||
|
||||
// Add the timer even if it's already expired - that way, if
|
||||
// multiple already-added timers are added, they'll still
|
||||
|
@ -145,86 +145,3 @@ void PQ_TimerMgr::Remove(Timer* timer)
|
|||
--current_timers[timer->Type()];
|
||||
delete timer;
|
||||
}
|
||||
|
||||
CQ_TimerMgr::CQ_TimerMgr(const Tag& tag) : TimerMgr(tag)
|
||||
{
|
||||
cq = cq_init(60.0, 1.0);
|
||||
if ( ! cq )
|
||||
reporter->InternalError("could not initialize calendar queue");
|
||||
}
|
||||
|
||||
CQ_TimerMgr::~CQ_TimerMgr()
|
||||
{
|
||||
cq_destroy(cq);
|
||||
}
|
||||
|
||||
void CQ_TimerMgr::Add(Timer* timer)
|
||||
{
|
||||
DBG_LOG(DBG_TM, "Adding timer %s to TimeMgr %p",
|
||||
timer_type_to_string(timer->Type()), this);
|
||||
|
||||
// Add the timer even if it's already expired - that way, if
|
||||
// multiple already-added timers are added, they'll still
|
||||
// execute in sorted order.
|
||||
double t = timer->Time();
|
||||
|
||||
if ( t <= 0.0 )
|
||||
// Illegal time, which cq_enqueue won't like. For our
|
||||
// purposes, just treat it as an old time that's already
|
||||
// expired.
|
||||
t = network_time;
|
||||
|
||||
if ( cq_enqueue(cq, t, timer) < 0 )
|
||||
reporter->InternalError("problem queueing timer");
|
||||
|
||||
++current_timers[timer->Type()];
|
||||
}
|
||||
|
||||
void CQ_TimerMgr::Expire()
|
||||
{
|
||||
double huge_t = 1e20; // larger than any Unix timestamp
|
||||
for ( Timer* timer = (Timer*) cq_dequeue(cq, huge_t);
|
||||
timer; timer = (Timer*) cq_dequeue(cq, huge_t) )
|
||||
{
|
||||
DBG_LOG(DBG_TM, "Dispatching timer %s in TimeMgr %p",
|
||||
timer_type_to_string(timer->Type()), this);
|
||||
timer->Dispatch(huge_t, 1);
|
||||
--current_timers[timer->Type()];
|
||||
delete timer;
|
||||
}
|
||||
}
|
||||
|
||||
int CQ_TimerMgr::DoAdvance(double new_t, int max_expire)
|
||||
{
|
||||
Timer* timer;
|
||||
while ( (num_expired < max_expire || max_expire == 0) &&
|
||||
(timer = (Timer*) cq_dequeue(cq, new_t)) )
|
||||
{
|
||||
last_timestamp = timer->Time();
|
||||
DBG_LOG(DBG_TM, "Dispatching timer %s in TimeMgr %p",
|
||||
timer_type_to_string(timer->Type()), this);
|
||||
timer->Dispatch(new_t, 0);
|
||||
--current_timers[timer->Type()];
|
||||
delete timer;
|
||||
++num_expired;
|
||||
}
|
||||
|
||||
return num_expired;
|
||||
}
|
||||
|
||||
unsigned int CQ_TimerMgr::MemoryUsage() const
|
||||
{
|
||||
// FIXME.
|
||||
return 0;
|
||||
}
|
||||
|
||||
void CQ_TimerMgr::Remove(Timer* timer)
|
||||
{
|
||||
// This may fail if we cancel a timer which has already been removed.
|
||||
// That's ok, but then we mustn't delete the timer.
|
||||
if ( cq_remove(cq, timer->Time(), timer) )
|
||||
{
|
||||
--current_timers[timer->Type()];
|
||||
delete timer;
|
||||
}
|
||||
}
|
||||
|
|
24
src/Timer.h
24
src/Timer.h
|
@ -7,10 +7,6 @@
|
|||
#include <string>
|
||||
#include "PriorityQueue.h"
|
||||
|
||||
extern "C" {
|
||||
#include "cq.h"
|
||||
}
|
||||
|
||||
// If you add a timer here, adjust TimerNames in Timer.cc.
|
||||
enum TimerType : uint8_t {
|
||||
TIMER_BACKDOOR,
|
||||
|
@ -152,24 +148,4 @@ protected:
|
|||
PriorityQueue* q;
|
||||
};
|
||||
|
||||
class CQ_TimerMgr : public TimerMgr {
|
||||
public:
|
||||
explicit CQ_TimerMgr(const Tag& arg_tag);
|
||||
~CQ_TimerMgr() override;
|
||||
|
||||
void Add(Timer* timer) override;
|
||||
void Expire() override;
|
||||
|
||||
int Size() const override { return cq_size(cq); }
|
||||
int PeakSize() const override { return cq_max_size(cq); }
|
||||
uint64_t CumulativeNum() const override { return cq_cumulative_num(cq); }
|
||||
unsigned int MemoryUsage() const;
|
||||
|
||||
protected:
|
||||
int DoAdvance(double t, int max_expire) override;
|
||||
void Remove(Timer* timer) override;
|
||||
|
||||
struct cq_handle *cq;
|
||||
};
|
||||
|
||||
extern TimerMgr* timer_mgr;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue