Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
0.12.0
-
None
-
None
Description
The benchmark "throughput" (https://github.com/apache/logging-log4cxx/pull/87) shows the rate of log4cxx calls to a disabled logger is greatly reduced when multiple threads are active.
In version 11.0 the call rate to a disabled logger when multiple threads are active is similar to when only a single thread is active.
Accessing repository using rep = repository.lock() in Logger::isDisabled() causes all threads to be serialized when they test if their logger is enabled.
I suggest Hierarchy hold std::weak_ptr for the Loggers instead of std::shared_ptr in LoggerMap and for the root logger.
Options:
1. Logger could hold a raw pointer to the LoggerRepository. The LoggerRepository destructor should then do
for (auto& item : this->loggers) { if (auto pLogger = item.second.lock()) pLogger->resetRepository(); }
Logger can then test for a NULL repositiory instead of lock() on the weak pointer.
2. Logger could hold a shared pointer to the LoggerRepository.