summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Morris <michael.patrick.morris@gmail.com>2015-11-12 16:55:40 -0500
committerMike Morris <michael.patrick.morris@gmail.com>2015-11-13 14:37:17 -0500
commit0887571053a459d5f8bbb0f1da528e969bed6b47 (patch)
tree803a97234f98e9ab75723f131449323ff9dd5fba
parent66e1d33168fd7aaa4e504050d558c2244a261ca7 (diff)
downloadqtlocation-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.cpp15
-rw-r--r--platform/node/src/node_map.hpp4
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;