diff options
author | Benoit Foucher <benoit@zeroc.com> | 2018-02-27 11:30:32 +0100 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2018-02-27 11:30:32 +0100 |
commit | 39f3974e52572f33ece6a167993827987210f67e (patch) | |
tree | 245b792b70ace2e55a39dd304f72349266c2a77b /cpp/test/uwp/controller | |
parent | Added instructions for make clean (diff) | |
download | ice-39f3974e52572f33ece6a167993827987210f67e.tar.bz2 ice-39f3974e52572f33ece6a167993827987210f67e.tar.xz ice-39f3974e52572f33ece6a167993827987210f67e.zip |
Fixed UWP connection memory leak (ICE-8686)
Diffstat (limited to 'cpp/test/uwp/controller')
-rw-r--r-- | cpp/test/uwp/controller/ViewController.xaml.cpp | 41 | ||||
-rw-r--r-- | cpp/test/uwp/controller/ViewController.xaml.h | 6 |
2 files changed, 24 insertions, 23 deletions
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); } @@ -459,17 +462,6 @@ ViewController::getHost() const } 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^) { if(controllerHelper) @@ -495,22 +487,33 @@ ViewController::println(const string& s) HINSTANCE ViewController::loadDll(const string& name) { - map<string, HINSTANCE>::const_iterator p = _dlls.find(name); - if(p != _dlls.end()) + map<string, pair<HINSTANCE, unsigned int>>::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<string, pair<HINSTANCE, unsigned int>>::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<string, HINSTANCE>::const_iterator p = _dlls.begin(); p != _dlls.end(); ++p) + for(map<string, pair<HINSTANCE, unsigned int>>::const_iterator p = _dlls.begin(); p != _dlls.end(); ++p) { - FreeLibrary(p->second); + FreeLibrary(p->second.first); } if(controllerHelper) diff --git a/cpp/test/uwp/controller/ViewController.xaml.h b/cpp/test/uwp/controller/ViewController.xaml.h index 30f8b26d140..a5d22575866 100644 --- a/cpp/test/uwp/controller/ViewController.xaml.h +++ b/cpp/test/uwp/controller/ViewController.xaml.h @@ -33,20 +33,18 @@ public: ViewController(); virtual ~ViewController(); -protected: - - virtual void OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs^ e) override; private: friend class MainHelperI; friend class ProcessControllerI; friend class ControllerHelper; HINSTANCE loadDll(const std::string&); + void unloadDll(const std::string&); void println(const std::string&); std::string getHost() const; void Hostname_SelectionChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::SelectionChangedEventArgs^ e); - std::map<std::string, HINSTANCE> _dlls; + std::map<std::string, std::pair<HINSTANCE, unsigned int>> _dlls; }; } |