android sink - add retry mechanism
- in some cases subsequent calls to __android_log_write() may result with -EAGAIN error code. in such cases spdlog will sleep and try again for number of times defined by SPDLOG_ANDROID_LOG_NUM_OF_RETRIES - defeult SPDLOG_ANDROID_LOG_NUM_OF_RETRIES set to 2 - can be overridden at build time
This commit is contained in:
parent
4a25802312
commit
2f205a6dbc
@ -12,6 +12,12 @@
|
|||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <android/log.h>
|
#include <android/log.h>
|
||||||
|
#include <thread>
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
|
#if !defined(SPDLOG_ANDROID_LOG_NUM_OF_RETRIES)
|
||||||
|
define SPDLOG_ANDROID_LOG_NUM_OF_RETRIES 2
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace spdlog
|
namespace spdlog
|
||||||
{
|
{
|
||||||
@ -31,10 +37,17 @@ public:
|
|||||||
{
|
{
|
||||||
const android_LogPriority priority = convert_to_android(msg.level);
|
const android_LogPriority priority = convert_to_android(msg.level);
|
||||||
const char *msg_output = (_use_raw_msg ? msg.raw.c_str() : msg.formatted.c_str());
|
const char *msg_output = (_use_raw_msg ? msg.raw.c_str() : msg.formatted.c_str());
|
||||||
|
|
||||||
// See system/core/liblog/logger_write.c for explanation of return value
|
// See system/core/liblog/logger_write.c for explanation of return value
|
||||||
const int ret = __android_log_write(
|
int ret = __android_log_write(priority, _tag.c_str(), msg_output);
|
||||||
priority, _tag.c_str(), msg_output
|
int retry_count = 1;
|
||||||
);
|
while ((ret == -11/*EAGAIN*/) && (retry_count < SPDLOG_ANDROID_LOG_NUM_OF_RETRIES))
|
||||||
|
{
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(5));
|
||||||
|
ret = __android_log_write(priority, _tag.c_str(), msg_output);
|
||||||
|
retry_count++;
|
||||||
|
}
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
throw spdlog_ex("__android_log_write() failed", ret);
|
throw spdlog_ex("__android_log_write() failed", ret);
|
||||||
|
Loading…
Reference in New Issue
Block a user