|
@@ -92,7 +92,8 @@ LinuxEthernetTap::LinuxEthernetTap(
|
|
_homePath(homePath),
|
|
_homePath(homePath),
|
|
_mtu(mtu),
|
|
_mtu(mtu),
|
|
_fd(0),
|
|
_fd(0),
|
|
- _enabled(true)
|
|
|
|
|
|
+ _enabled(true),
|
|
|
|
+ _running(true)
|
|
{
|
|
{
|
|
static std::mutex s_tapCreateLock;
|
|
static std::mutex s_tapCreateLock;
|
|
char procpath[128],nwids[32];
|
|
char procpath[128],nwids[32];
|
|
@@ -267,7 +268,7 @@ LinuxEthernetTap::LinuxEthernetTap(
|
|
|
|
|
|
r = 0;
|
|
r = 0;
|
|
}
|
|
}
|
|
- } else {
|
|
|
|
|
|
+ } else if ((errno != EINTR)||(!_running.load())) {
|
|
r = 0;
|
|
r = 0;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -297,9 +298,12 @@ LinuxEthernetTap::LinuxEthernetTap(
|
|
|
|
|
|
LinuxEthernetTap::~LinuxEthernetTap()
|
|
LinuxEthernetTap::~LinuxEthernetTap()
|
|
{
|
|
{
|
|
|
|
+ _running = false;
|
|
|
|
+
|
|
_tapq.post(std::pair<void *,int>(nullptr,0));
|
|
_tapq.post(std::pair<void *,int>(nullptr,0));
|
|
::shutdown(_fd, SHUT_RDWR);
|
|
::shutdown(_fd, SHUT_RDWR);
|
|
::close(_fd);
|
|
::close(_fd);
|
|
|
|
+ pthread_kill(_tapReaderThread.native_handle(), SIGUSR1);
|
|
|
|
|
|
_tapReaderThread.join();
|
|
_tapReaderThread.join();
|
|
_tapProcessorThread.join();
|
|
_tapProcessorThread.join();
|