|
@@ -73,23 +73,27 @@ bool SimNetSocketManager::send(const InetAddress &to,bool tcp,bool autoConnectTc
|
|
|
|
|
|
void SimNetSocketManager::poll(unsigned long timeout,void (*handler)(const SharedPtr<Socket> &,void *,const InetAddress &,Buffer<ZT_SOCKET_MAX_MESSAGE_LEN> &),void *arg)
|
|
void SimNetSocketManager::poll(unsigned long timeout,void (*handler)(const SharedPtr<Socket> &,void *,const InetAddress &,Buffer<ZT_SOCKET_MAX_MESSAGE_LEN> &),void *arg)
|
|
{
|
|
{
|
|
|
|
+ std::vector< std::pair< InetAddress,Buffer<ZT_SOCKET_MAX_MESSAGE_LEN> > > inb;
|
|
|
|
+
|
|
{
|
|
{
|
|
Mutex::Lock _l(_inbox_m);
|
|
Mutex::Lock _l(_inbox_m);
|
|
- while (!_inbox.empty()) {
|
|
|
|
- handler(_mySocket,arg,_inbox.front().first,_inbox.front().second);
|
|
|
|
- _inbox.pop();
|
|
|
|
- }
|
|
|
|
|
|
+ inb = _inbox;
|
|
|
|
+ _inbox.clear();
|
|
}
|
|
}
|
|
|
|
+ for(std::vector< std::pair< InetAddress,Buffer<ZT_SOCKET_MAX_MESSAGE_LEN> > >::iterator i(inb.begin());i!=inb.end();++i)
|
|
|
|
+ handler(_mySocket,arg,i->first,i->second);
|
|
|
|
+
|
|
if (timeout)
|
|
if (timeout)
|
|
_waitCond.wait(timeout);
|
|
_waitCond.wait(timeout);
|
|
else _waitCond.wait();
|
|
else _waitCond.wait();
|
|
|
|
+
|
|
{
|
|
{
|
|
Mutex::Lock _l(_inbox_m);
|
|
Mutex::Lock _l(_inbox_m);
|
|
- while (!_inbox.empty()) {
|
|
|
|
- handler(_mySocket,arg,_inbox.front().first,_inbox.front().second);
|
|
|
|
- _inbox.pop();
|
|
|
|
- }
|
|
|
|
|
|
+ inb = _inbox;
|
|
|
|
+ _inbox.clear();
|
|
}
|
|
}
|
|
|
|
+ for(std::vector< std::pair< InetAddress,Buffer<ZT_SOCKET_MAX_MESSAGE_LEN> > >::iterator i(inb.begin());i!=inb.end();++i)
|
|
|
|
+ handler(_mySocket,arg,i->first,i->second);
|
|
}
|
|
}
|
|
|
|
|
|
void SimNetSocketManager::whack()
|
|
void SimNetSocketManager::whack()
|