summaryrefslogtreecommitdiff
path: root/cpp/test/uwp/controller
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2018-02-27 11:30:32 +0100
committerBenoit Foucher <benoit@zeroc.com>2018-02-27 11:30:32 +0100
commit39f3974e52572f33ece6a167993827987210f67e (patch)
tree245b792b70ace2e55a39dd304f72349266c2a77b /cpp/test/uwp/controller
parentAdded instructions for make clean (diff)
downloadice-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.cpp41
-rw-r--r--cpp/test/uwp/controller/ViewController.xaml.h6
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;
};
}