summaryrefslogtreecommitdiff
path: root/node/DeferredPackets.cpp
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2015-12-21 16:15:39 -0800
committerAdam Ierymenko <adam.ierymenko@gmail.com>2015-12-21 16:15:39 -0800
commit436c1fac1dc9daed033ca78719031b687b984c29 (patch)
tree10a78810012fef7e55553867c780c5ceae99b6f8 /node/DeferredPackets.cpp
parenta4cfe4cd1650ea7e9aada0b004fd7aade2e43ced (diff)
downloadinfinitytier-436c1fac1dc9daed033ca78719031b687b984c29.tar.gz
infinitytier-436c1fac1dc9daed033ca78719031b687b984c29.zip
Selectively move over changes from "edge" to "dev" excluding netcon.
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;
}
}