Fix the cycle-referenced caused memory leak by shared_ptr used, this issue is

recognized by valgrind memcheck tool.
This commit is contained in:
Jiancong 2018-04-03 10:57:25 +08:00
commit 4dd2ae389a
3 changed files with 11 additions and 8 deletions

View file

@ -100,7 +100,7 @@ protected:
* @brief Traps the specified signals for the entire process. * @brief Traps the specified signals for the entire process.
*/ */
CORE_POSIX_DLL_PUBLIC CORE_POSIX_DLL_PUBLIC
std::shared_ptr<SignalTrap> trap_signals_for_process( SignalTrap* trap_signals_for_process(
std::initializer_list<core::posix::Signal> blocked_signals); std::initializer_list<core::posix::Signal> blocked_signals);
/** /**

View file

@ -203,12 +203,10 @@ private:
}; };
} }
std::shared_ptr<core::posix::SignalTrap> core::posix::trap_signals_for_process( core::posix::SignalTrap* core::posix::trap_signals_for_process(
std::initializer_list<core::posix::Signal> blocked_signals) std::initializer_list<core::posix::Signal> blocked_signals)
{ {
return std::make_shared<impl::SignalTrap>( return new impl::SignalTrap(impl::SignalTrap::Scope::process, blocked_signals);
impl::SignalTrap::Scope::process,
blocked_signals);
} }
std::shared_ptr<core::posix::SignalTrap> core::posix::trap_signals_for_all_subsequent_threads( std::shared_ptr<core::posix::SignalTrap> core::posix::trap_signals_for_all_subsequent_threads(

View file

@ -131,7 +131,7 @@ anbox::cmds::SessionManager::SessionManager()
use_system_dbus_)); use_system_dbus_));
action([this](const cli::Command::Context &) { action([this](const cli::Command::Context &) {
auto trap = core::posix::trap_signals_for_process( core::posix::SignalTrap* trap = core::posix::trap_signals_for_process(
{core::posix::Signal::sig_term, core::posix::Signal::sig_int}); {core::posix::Signal::sig_term, core::posix::Signal::sig_int});
trap->signal_raised().connect([trap](const core::posix::Signal &signal) { trap->signal_raised().connect([trap](const core::posix::Signal &signal) {
INFO("Signal %i received. Good night.", static_cast<int>(signal)); INFO("Signal %i received. Good night.", static_cast<int>(signal));
@ -139,11 +139,13 @@ anbox::cmds::SessionManager::SessionManager()
}); });
if (standalone_ && !experimental_) { if (standalone_ && !experimental_) {
delete trap;
ERROR("Experimental features selected, but --experimental flag not set"); ERROR("Experimental features selected, but --experimental flag not set");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
if (!fs::exists("/dev/binder") || !fs::exists("/dev/ashmem")) { if (!fs::exists("/dev/binder") || !fs::exists("/dev/ashmem")) {
delete trap;
ERROR("Failed to start as either binder or ashmem kernel drivers are not loaded"); ERROR("Failed to start as either binder or ashmem kernel drivers are not loaded");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
@ -176,8 +178,10 @@ anbox::cmds::SessionManager::SessionManager()
input_manager, input_manager,
display_frame, display_frame,
single_window_); single_window_);
if (!platform) if (!platform) {
delete trap;
return EXIT_FAILURE; return EXIT_FAILURE;
}
auto app_db = std::make_shared<application::Database>(); auto app_db = std::make_shared<application::Database>();
@ -283,6 +287,7 @@ anbox::cmds::SessionManager::SessionManager()
rt->stop(); rt->stop();
delete trap;
return EXIT_SUCCESS; return EXIT_SUCCESS;
}); });
} }