Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 65f8986

Browse files
committedMay 11, 2022
be compatible with log4cxx 0.11 and 0.12/0.13
[`log4cxx` uses `std::shared_ptr`](https://issues.apache.org/jira/browse/LOGCXX-486) since [version `0.12`](https://logging.apache.org/log4cxx/latest_stable/changelog.html) Unfortunately Ubuntu 22.04 ships with [`0.12`](https://packages.ubuntu.com/jammy/liblog4cxx12), which means that rosconsole with the `log4cxx` backend wouldn't compile. This is also a problem on other distros such as Arch or Gentoo. I have carefully applied explicit construction/conversion and `&*` instead of `.get()` to make the code compile with both versions of `log4cxx`.
1 parent c950327 commit 65f8986

File tree

3 files changed

+190
-191
lines changed

3 files changed

+190
-191
lines changed
 

‎src/rosconsole/impl/rosconsole_log4cxx.cpp

+9-10
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ void initialize()
166166
}
167167

168168
log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(ROSCONSOLE_ROOT_LOGGER_NAME);
169-
logger->addAppender(new ROSConsoleStdioAppender);
169+
logger->addAppender(log4cxx::AppenderPtr(new ROSConsoleStdioAppender));
170170
#ifdef _MSC_VER
171171
if ( ros_root_cstr != NULL ) {
172172
free(ros_root_cstr);
@@ -200,7 +200,7 @@ bool isEnabledFor(void* handle, ::ros::console::Level level)
200200

201201
void* getHandle(const std::string& name)
202202
{
203-
return log4cxx::Logger::getLogger(name);
203+
return &*log4cxx::Logger::getLogger(name);
204204
}
205205

206206
std::string getName(void* handle)
@@ -216,7 +216,7 @@ std::string getName(void* handle)
216216

217217
bool get_loggers(std::map<std::string, levels::Level>& loggers)
218218
{
219-
log4cxx::spi::LoggerRepositoryPtr repo = log4cxx::Logger::getLogger(ROSCONSOLE_ROOT_LOGGER_NAME)->getLoggerRepository();
219+
auto repo = log4cxx::spi::LoggerRepositoryPtr(log4cxx::Logger::getLogger(ROSCONSOLE_ROOT_LOGGER_NAME)->getLoggerRepository());
220220

221221
log4cxx::LoggerList current_loggers = repo->getCurrentLoggers();
222222
log4cxx::LoggerList::iterator it = current_loggers.begin();
@@ -352,22 +352,21 @@ class Log4cxxAppender : public log4cxx::AppenderSkeleton
352352
ros::console::LogAppender* appender_;
353353
};
354354

355-
Log4cxxAppender* g_log4cxx_appender = 0;
355+
log4cxx::AppenderPtr g_log4cxx_appender = {};
356356

357357
void register_appender(LogAppender* appender)
358358
{
359-
g_log4cxx_appender = new Log4cxxAppender(appender);
359+
g_log4cxx_appender = log4cxx::AppenderPtr( new Log4cxxAppender(appender));
360360
const log4cxx::LoggerPtr& logger = log4cxx::Logger::getLogger(ROSCONSOLE_ROOT_LOGGER_NAME);
361361
logger->addAppender(g_log4cxx_appender);
362362
}
363363

364364
void deregister_appender(LogAppender* appender){
365-
if(g_log4cxx_appender->getAppender() == appender)
365+
if(dynamic_cast<Log4cxxAppender*>(&*g_log4cxx_appender)->getAppender() == appender)
366366
{
367367
const log4cxx::LoggerPtr& logger = log4cxx::Logger::getLogger(ROSCONSOLE_ROOT_LOGGER_NAME);
368368
logger->removeAppender(g_log4cxx_appender);
369-
delete g_log4cxx_appender;
370-
g_log4cxx_appender = 0;
369+
g_log4cxx_appender = log4cxx::AppenderPtr();
371370
}
372371
}
373372
void shutdown()
@@ -376,14 +375,14 @@ void shutdown()
376375
{
377376
const log4cxx::LoggerPtr& logger = log4cxx::Logger::getLogger(ROSCONSOLE_ROOT_LOGGER_NAME);
378377
logger->removeAppender(g_log4cxx_appender);
379-
g_log4cxx_appender = 0;
378+
g_log4cxx_appender = log4cxx::AppenderPtr();
380379
}
381380
// reset this so that the logger doesn't get crashily destroyed
382381
// again during global destruction.
383382
//
384383
// See https://code.ros.org/trac/ros/ticket/3271
385384
//
386-
log4cxx::Logger::getRootLogger()->getLoggerRepository()->shutdown();
385+
static_cast<log4cxx::spi::LoggerRepositoryPtr>(log4cxx::Logger::getRootLogger()->getLoggerRepository())->shutdown();
387386
}
388387

389388
} // namespace impl

‎test/thread_test.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ TEST(Rosconsole, threadedCalls)
9595
{
9696
log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(ROSCONSOLE_DEFAULT_NAME);
9797

98-
TestAppender* appender = new TestAppender;
98+
auto appender = log4cxx::AppenderPtr(new TestAppender);
9999
logger->addAppender( appender );
100100

101101
boost::thread_group tg;
@@ -106,7 +106,7 @@ TEST(Rosconsole, threadedCalls)
106106
}
107107
tg.join_all();
108108

109-
ASSERT_EQ(appender->info_.size(), 10ULL);
109+
ASSERT_EQ(dynamic_cast<TestAppender*>(&*appender)->info_.size(), 10ULL);
110110

111111
logger->removeAppender(appender);
112112
}

‎test/utest.cpp

+179-179
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)
Please sign in to comment.