From 39f3974e52572f33ece6a167993827987210f67e Mon Sep 17 00:00:00 2001 From: Benoit Foucher Date: Tue, 27 Feb 2018 11:30:32 +0100 Subject: Fixed UWP connection memory leak (ICE-8686) --- cpp/test/uwp/controller/ViewController.xaml.cpp | 41 +++++++++++++------------ 1 file changed, 22 insertions(+), 19 deletions(-) (limited to 'cpp/test/uwp/controller/ViewController.xaml.cpp') diff --git a/cpp/test/uwp/controller/ViewController.xaml.cpp b/cpp/test/uwp/controller/ViewController.xaml.cpp index 49d5a2bba4c..281e973f519 100644 --- a/cpp/test/uwp/controller/ViewController.xaml.cpp +++ b/cpp/test/uwp/controller/ViewController.xaml.cpp @@ -198,6 +198,7 @@ MainHelperI::run() if(_dllTestShutdown == 0) { print("failed to find dllTestShutdown function from `" + _dll + "'"); + _controller->unloadDll(_dll); completed(EXIT_FAILURE); return; } @@ -206,6 +207,7 @@ MainHelperI::run() if(sym == 0) { print("failed to find dllMain function from `" + _dll + "'"); + _controller->unloadDll(_dll); completed(EXIT_FAILURE); return; } @@ -232,6 +234,7 @@ MainHelperI::run() completed(EXIT_FAILURE); } delete[] argv; + _controller->unloadDll(_dll); }); _thread = move(t); } @@ -458,17 +461,6 @@ ViewController::getHost() const return Ice::wstringToString(ipv4Addresses->SelectedItem->ToString()->Data()); } -void -ViewController::OnNavigatedTo(NavigationEventArgs^) -{ - if(controllerHelper) - { - delete controllerHelper; - controllerHelper = 0; - } - controllerHelper = new ControllerHelper(this); -} - void ViewController::Hostname_SelectionChanged(Platform::Object^, Windows::UI::Xaml::Controls::SelectionChangedEventArgs^) { @@ -495,22 +487,33 @@ ViewController::println(const string& s) HINSTANCE ViewController::loadDll(const string& name) { - map::const_iterator p = _dlls.find(name); - if(p != _dlls.end()) + map>::iterator p = _dlls.find(name); + if(p == _dlls.end()) { - return p->second; + HINSTANCE hnd = LoadPackagedLibrary(Ice::stringToWstring(name).c_str(), 0); + p = _dlls.insert(make_pair(name, make_pair(hnd, 0))).first; } - HINSTANCE hnd = LoadPackagedLibrary(Ice::stringToWstring(name).c_str(), 0); - _dlls.insert(make_pair(name, hnd)); + ++p->second.second; + return p->second.first; +} - return hnd; +void +ViewController::unloadDll(const string& name) +{ + map>::iterator p = _dlls.find(name); + assert(p != _dlls.end()); + if(--p->second.second == 0) + { + FreeLibrary(p->second.first); + _dlls.erase(p); + } } ViewController::~ViewController() { - for(map::const_iterator p = _dlls.begin(); p != _dlls.end(); ++p) + for(map>::const_iterator p = _dlls.begin(); p != _dlls.end(); ++p) { - FreeLibrary(p->second); + FreeLibrary(p->second.first); } if(controllerHelper) -- cgit v1.2.3