mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-06-06 20:43:44 +02:00
Reduce mutex use in LinuxEthernetTap. Try to squeeze a bit more powah out of it.
This commit is contained in:
parent
b152f9e1d3
commit
7cbbc38b89
1 changed files with 14 additions and 5 deletions
|
@ -188,6 +188,7 @@ LinuxEthernetTap::LinuxEthernetTap(
|
||||||
fd_set readfds,nullfds;
|
fd_set readfds,nullfds;
|
||||||
int n,nfds,r;
|
int n,nfds,r;
|
||||||
void *buf = nullptr;
|
void *buf = nullptr;
|
||||||
|
std::vector buffers;
|
||||||
|
|
||||||
{
|
{
|
||||||
struct ifreq ifr;
|
struct ifreq ifr;
|
||||||
|
@ -252,14 +253,20 @@ LinuxEthernetTap::LinuxEthernetTap(
|
||||||
if (FD_ISSET(_fd,&readfds)) {
|
if (FD_ISSET(_fd,&readfds)) {
|
||||||
for(;;) { // read until there are no more packets, then return to outer select() loop
|
for(;;) { // read until there are no more packets, then return to outer select() loop
|
||||||
if (!buf) {
|
if (!buf) {
|
||||||
std::lock_guard<std::mutex> l(_buffers_l);
|
// To reduce use of the mutex, we keep a local buffer vector and
|
||||||
if (_buffers.empty()) {
|
// swap (which is a pointer swap) with the global one when it's
|
||||||
|
// empty. This retrieves a batch of buffers to use.
|
||||||
|
if (buffers.empty()) {
|
||||||
|
std::lock_guard<std::mutex> l(_buffers_l);
|
||||||
|
buffers.swap(_buffers);
|
||||||
|
}
|
||||||
|
if (buffers.empty()) {
|
||||||
buf = malloc(ZT_TAP_BUF_SIZE);
|
buf = malloc(ZT_TAP_BUF_SIZE);
|
||||||
if (!buf)
|
if (!buf)
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
buf = _buffers.back();
|
buf = buffers.back();
|
||||||
_buffers.pop_back();
|
buffers.pop_back();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -302,7 +309,9 @@ LinuxEthernetTap::LinuxEthernetTap(
|
||||||
_handler(_arg, nullptr, _nwid, from, to, etherType, 0, (const void *)(b + 14),(unsigned int)(qi.second - 14));
|
_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);
|
std::lock_guard<std::mutex> l(_buffers_l);
|
||||||
_buffers.push_back(qi.first);
|
if (_buffers.size() < 128)
|
||||||
|
_buffers.push_back(qi.first);
|
||||||
|
else free(qi.first);
|
||||||
}
|
}
|
||||||
} else break;
|
} else break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue