close(d_socket);
d_socket = -1;
}
+ d_connected = false;
try {
d_socket = SSocket(d_remote.sin4.sin_family, SOCK_STREAM, 0);
setNonBlocking(d_socket);
#endif
return false;
}
+ d_connected = true;
return true;
}
+void RemoteLogger::busyReconnectLoop()
+{
+ while (!reconnect()) {
+ sleep(d_reconnectWaitTime);
+ }
+}
+
void RemoteLogger::worker()
{
if (d_asyncConnect) {
- reconnect();
+ busyReconnectLoop();
}
while(true) {
d_writeQueue.pop();
}
+ if (!d_connected) {
+ busyReconnectLoop();
+ }
+
try {
uint16_t len = static_cast<uint16_t>(data.length());
sendSizeAndMsgWithTimeout(d_socket, len, data.c_str(), static_cast<int>(d_timeout), nullptr, nullptr, 0, 0, 0);
#else
vinfolog("Error sending data to remote logger (%s): %s", d_remote.toStringWithPort(), e.what());
#endif
- while (!reconnect()) {
- sleep(d_reconnectWaitTime);
- }
+ busyReconnectLoop();
}
}
}
if (d_socket >= 0) {
close(d_socket);
d_socket = -1;
+ d_connected = false;
}
d_queueCond.notify_one();
d_thread.join();
return d_remote.toStringWithPort();
}
private:
+ void busyReconnectLoop();
bool reconnect();
void worker();
uint8_t d_reconnectWaitTime;
std::atomic<bool> d_exiting{false};
bool d_asyncConnect{false};
+ bool d_connected{false};
std::thread d_thread;
};