diff options
author | Mike Morris <michael.patrick.morris@gmail.com> | 2015-11-12 16:55:40 -0500 |
---|---|---|
committer | Mike Morris <michael.patrick.morris@gmail.com> | 2015-11-13 14:37:17 -0500 |
commit | 0887571053a459d5f8bbb0f1da528e969bed6b47 (patch) | |
tree | 803a97234f98e9ab75723f131449323ff9dd5fba | |
parent | 66e1d33168fd7aaa4e504050d558c2244a261ca7 (diff) | |
download | qtlocation-mapboxgl-0887571053a459d5f8bbb0f1da528e969bed6b47.tar.gz |
[node] use std::unique_ptr for NodeMap resources
Properly clean up all resources in NodeMap::release to allow the
NodeMap object to be garbage collected.
Reseting the NodeFileSource unqiue_ptr in NodeMap::release may be
dangerous, as RequestHolder::Deleter needs it to cancel outstanding mbgl::Request objects.
-rw-r--r-- | platform/node/src/node_map.cpp | 15 | ||||
-rw-r--r-- | platform/node/src/node_map.hpp | 4 |
2 files changed, 11 insertions, 8 deletions
diff --git a/platform/node/src/node_map.cpp b/platform/node/src/node_map.cpp index 6e65e4a5bd..59370f64c4 100644 --- a/platform/node/src/node_map.cpp +++ b/platform/node/src/node_map.cpp @@ -289,7 +289,7 @@ NAN_METHOD(NodeMap::Render) { } void NodeMap::startRender(std::unique_ptr<NodeMap::RenderOptions> options) { - view.resize(options->width, options->height); + view->resize(options->width, options->height); map->update(Update::Dimensions); map->setClasses(options->classes); map->setLatLngZoom(LatLng(options->latitude, options->longitude), options->zoom); @@ -377,6 +377,7 @@ void NodeMap::renderFinished() { }; cb->Call(1, argv); } + cb.reset(); } /** @@ -407,7 +408,9 @@ void NodeMap::release() { delete reinterpret_cast<uv_async_t *>(handle); }); - map.reset(nullptr); + map.reset(); + view.reset(); + fs.reset(); } NAN_METHOD(NodeMap::DumpDebugLogs) { @@ -423,12 +426,12 @@ NAN_METHOD(NodeMap::DumpDebugLogs) { // Instance NodeMap::NodeMap(v8::Local<v8::Object> options) : - view(sharedDisplay(), [&] { + view(std::make_unique<HeadlessView>(sharedDisplay(), [&] { Nan::HandleScope scope; return Nan::Has(options, Nan::New("ratio").ToLocalChecked()).FromJust() ? Nan::Get(options, Nan::New("ratio").ToLocalChecked()).ToLocalChecked()->NumberValue() : 1.0; - }()), - fs(options), - map(std::make_unique<Map>(view, fs, MapMode::Still)), + }())), + fs(std::make_unique<NodeFileSource>(options)), + map(std::make_unique<Map>(*view, *fs, MapMode::Still)), async(new uv_async_t) { async->data = this; diff --git a/platform/node/src/node_map.hpp b/platform/node/src/node_map.hpp index 07fd877c6f..78e53fcd09 100644 --- a/platform/node/src/node_map.hpp +++ b/platform/node/src/node_map.hpp @@ -43,8 +43,8 @@ public: NodeMap(v8::Local<v8::Object>); ~NodeMap(); - HeadlessView view; - NodeFileSource fs; + std::unique_ptr<HeadlessView> view; + std::unique_ptr<NodeFileSource> fs; std::unique_ptr<Map> map; std::exception_ptr error; |