diff --git a/osdep/LinuxEthernetTap.cpp b/osdep/LinuxEthernetTap.cpp index 87feaca85..bda604d65 100644 --- a/osdep/LinuxEthernetTap.cpp +++ b/osdep/LinuxEthernetTap.cpp @@ -292,36 +292,42 @@ LinuxEthernetTap::LinuxEthernetTap( } }); - _tapProcessorThread = std::thread([this] { - MAC to,from; - std::pair<void *,int> qi; - while (_tapq.get(qi)) { - uint8_t *const b = reinterpret_cast<uint8_t *>(qi.first); - if (b) { - to.setTo(b, 6); - from.setTo(b + 6, 6); - unsigned int etherType = Utils::ntoh(((const uint16_t *)b)[6]); - _handler(_arg, nullptr, _nwid, from, to, etherType, 0, (const void *)(b + 14),(unsigned int)(qi.second - 14)); - { - std::lock_guard<std::mutex> l(_buffers_l); - _buffers.push_back(qi.first); - } - } else break; - } - }); + for(int k=0;k<2;++k) { + _tapProcessorThread[k] = std::thread([this] { + MAC to,from; + std::pair<void *,int> qi; + while (_tapq.get(qi)) { + uint8_t *const b = reinterpret_cast<uint8_t *>(qi.first); + if (b) { + to.setTo(b, 6); + from.setTo(b + 6, 6); + unsigned int etherType = Utils::ntoh(((const uint16_t *)b)[6]); + _handler(_arg, nullptr, _nwid, from, to, etherType, 0, (const void *)(b + 14),(unsigned int)(qi.second - 14)); + { + std::lock_guard<std::mutex> l(_buffers_l); + _buffers.push_back(qi.first); + } + } else break; + } + }); + } } LinuxEthernetTap::~LinuxEthernetTap() { (void)::write(_shutdownSignalPipe[1],"\0",1); // causes thread to exit - _tapq.post(std::pair<void *,int>(nullptr,0)); + for(int k=0;k<64;++k) { + _tapq.post(std::pair<void *,int>(nullptr,0)); + } ::close(_fd); ::close(_shutdownSignalPipe[0]); ::close(_shutdownSignalPipe[1]); _tapReaderThread.join(); - _tapProcessorThread.join(); + for(int k=0;k<2;++k) { + _tapProcessorThread[k].join(); + } for(std::vector<void *>::iterator i(_buffers.begin());i!=_buffers.end();++i) free(*i); diff --git a/osdep/LinuxEthernetTap.hpp b/osdep/LinuxEthernetTap.hpp index 9e9206ead..ffb2cc977 100644 --- a/osdep/LinuxEthernetTap.hpp +++ b/osdep/LinuxEthernetTap.hpp @@ -71,7 +71,7 @@ private: int _shutdownSignalPipe[2]; std::atomic_bool _enabled; std::thread _tapReaderThread; - std::thread _tapProcessorThread; + std::thread _tapProcessorThread[2]; std::mutex _buffers_l; std::vector<void *> _buffers; BlockingQueue< std::pair<void *,int> > _tapq;