|
@@ -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;
|
|
|
}
|
|
|
}
|