summaryrefslogtreecommitdiff
path: root/node/DeferredPackets.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'node/DeferredPackets.cpp')
-rw-r--r--node/DeferredPackets.cpp12
1 files changed, 8 insertions, 4 deletions
diff --git a/node/DeferredPackets.cpp b/node/DeferredPackets.cpp
index 923e1339..ae19bdf1 100644
--- a/node/DeferredPackets.cpp
+++ b/node/DeferredPackets.cpp
@@ -37,6 +37,7 @@ DeferredPackets::DeferredPackets(const RuntimeEnvironment *renv) :
RR(renv),
_readPtr(0),
_writePtr(0),
+ _waiting(0),
_die(false)
{
}
@@ -45,8 +46,11 @@ DeferredPackets::~DeferredPackets()
{
_q_m.lock();
_die = true;
- _q_m.unlock();
- _q_s.post();
+ while (_waiting > 0) {
+ _q_m.unlock();
+ _q_s.post();
+ _q_m.lock();
+ }
}
bool DeferredPackets::enqueue(IncomingPacket *pkt)
@@ -72,16 +76,16 @@ int DeferredPackets::process()
_q_m.lock();
if (_die) {
_q_m.unlock();
- _q_s.post();
return -1;
}
while (_readPtr == _writePtr) {
+ ++_waiting;
_q_m.unlock();
_q_s.wait();
_q_m.lock();
+ --_waiting;
if (_die) {
_q_m.unlock();
- _q_s.post();
return -1;
}
}