}
void SocketManager::readyForAccept(int fd) {
+ if (fdsUsageIsHigh()) {
+ LOGD("SocketManger readyForAccept on fd [%d]: high memory usage -> stop listening", fd);
+ m_listenSocketsDisabledBecauseOfHighFdUsage.emplace(fd);
+ removeReadSocket(fd);
+ return;
+ }
+
LOGD("SocketManger readyForAccept on fd [%d] start", fd);
struct sockaddr_un clientAddr;
unsigned int clientLen = sizeof(clientAddr);
desc.writeQueue(),
});
+ bool fdUsageWasHigh = fdsUsageIsHigh();
// Statistics
m_stats.closeFd(fd);
removeWriteSocket(fd);
desc.clear();
close(fd);
+
+ // Restore sockets that were disabled due to high fd usage
+ if (fdUsageWasHigh && !fdsUsageIsHigh()) {
+ for (auto fd : m_listenSocketsDisabledBecauseOfHighFdUsage) {
+ LOGD("SocketManger: start listening again on fd [%d]", fd);
+ addReadSocket(fd);
+ }
+ m_listenSocketsDisabledBecauseOfHighFdUsage.clear();
+ }
+
LOGD("SocketManger closeSocket fd [%d] done", fd);
}
#ifndef SRC_SERVICE_SOCKETS_SOCKETMANAGER_H_
#define SRC_SERVICE_SOCKETS_SOCKETMANAGER_H_
+#include <algorithm>
#include <atomic>
#include <cstdio>
#include <memory>
typedef std::vector<Descriptor> FDVector;
FDVector m_fds;
+ std::set<int> m_listenSocketsDisabledBecauseOfHighFdUsage;
+
bool m_working;
fd_set m_readSet;