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-12 18:21:12 -0500
commit549bd366bf39f8ada152b61500af9bfa6d71a2eb (patch)
tree4c78061854b00f577a1363d29af6073a0064d1c9
parent9742a4dc2b254fdcaf3b5b6258602b834f9d27fc (diff)
downloadqtlocation-mapboxgl-549bd366bf39f8ada152b61500af9bfa6d71a2eb.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;