[core] use RAII-style lifetime tracking of Request objects
This commit is contained in:
@@ -52,10 +52,7 @@ MapContext::~MapContext() {
|
||||
void MapContext::cleanup() {
|
||||
view.notify();
|
||||
|
||||
if (styleRequest) {
|
||||
util::ThreadContext::getFileSource()->cancel(styleRequest);
|
||||
styleRequest = nullptr;
|
||||
}
|
||||
styleRequest = nullptr;
|
||||
|
||||
// Explicit resets currently necessary because these abandon resources that need to be
|
||||
// cleaned up by glObjectStore.performCleanup();
|
||||
@@ -95,13 +92,7 @@ void MapContext::setStyleURL(const std::string& url) {
|
||||
return;
|
||||
}
|
||||
|
||||
FileSource* fs = util::ThreadContext::getFileSource();
|
||||
|
||||
if (styleRequest) {
|
||||
fs->cancel(styleRequest);
|
||||
styleRequest = nullptr;
|
||||
}
|
||||
|
||||
styleRequest = nullptr;
|
||||
styleURL = url;
|
||||
styleJSON.clear();
|
||||
|
||||
@@ -113,8 +104,8 @@ void MapContext::setStyleURL(const std::string& url) {
|
||||
base = styleURL.substr(0, pos + 1);
|
||||
}
|
||||
|
||||
FileSource* fs = util::ThreadContext::getFileSource();
|
||||
styleRequest = fs->request({ Resource::Kind::Style, styleURL }, util::RunLoop::getLoop(), [this, base](const Response &res) {
|
||||
util::ThreadContext::getFileSource()->cancel(styleRequest);
|
||||
styleRequest = nullptr;
|
||||
|
||||
if (res.status == Response::Successful) {
|
||||
|
||||
@@ -90,7 +90,7 @@ private:
|
||||
std::string styleURL;
|
||||
std::string styleJSON;
|
||||
|
||||
Request* styleRequest = nullptr;
|
||||
RequestHolder styleRequest;
|
||||
|
||||
Map::StillImageCallback callback;
|
||||
size_t sourceCacheSize;
|
||||
|
||||
@@ -31,7 +31,6 @@ void RasterTileData::request(float pixelRatio,
|
||||
|
||||
FileSource* fs = util::ThreadContext::getFileSource();
|
||||
req = fs->request({ Resource::Kind::Tile, url }, util::RunLoop::getLoop(), [url, callback, this](const Response &res) {
|
||||
util::ThreadContext::getFileSource()->cancel(req);
|
||||
req = nullptr;
|
||||
|
||||
if (res.status == Response::NotFound) {
|
||||
@@ -78,9 +77,6 @@ void RasterTileData::cancel() {
|
||||
if (state != State::obsolete) {
|
||||
state = State::obsolete;
|
||||
}
|
||||
if (req) {
|
||||
util::ThreadContext::getFileSource()->cancel(req);
|
||||
req = nullptr;
|
||||
}
|
||||
req = nullptr;
|
||||
workRequest.reset();
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <mbgl/map/tile_data.hpp>
|
||||
#include <mbgl/style/style_properties.hpp>
|
||||
#include <mbgl/renderer/raster_bucket.hpp>
|
||||
#include <mbgl/storage/request_holder.hpp>
|
||||
|
||||
namespace mbgl {
|
||||
|
||||
@@ -28,7 +29,7 @@ public:
|
||||
private:
|
||||
const SourceInfo& source;
|
||||
Worker& worker;
|
||||
Request* req = nullptr;
|
||||
RequestHolder req;
|
||||
|
||||
RasterLayoutProperties layout;
|
||||
RasterBucket bucket;
|
||||
|
||||
@@ -122,12 +122,7 @@ std::string SourceInfo::tileURL(const TileID& id, float pixelRatio) const {
|
||||
|
||||
Source::Source() {}
|
||||
|
||||
Source::~Source() {
|
||||
if (req) {
|
||||
util::ThreadContext::getFileSource()->cancel(req);
|
||||
req = nullptr;
|
||||
}
|
||||
}
|
||||
Source::~Source() = default;
|
||||
|
||||
bool Source::isLoaded() const {
|
||||
if (!loaded) {
|
||||
@@ -154,7 +149,6 @@ void Source::load() {
|
||||
|
||||
FileSource* fs = util::ThreadContext::getFileSource();
|
||||
req = fs->request({ Resource::Kind::Source, info.url }, util::RunLoop::getLoop(), [this](const Response &res) {
|
||||
util::ThreadContext::getFileSource()->cancel(req);
|
||||
req = nullptr;
|
||||
|
||||
if (res.status != Response::Successful) {
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <mbgl/map/tile_data.hpp>
|
||||
#include <mbgl/map/tile_cache.hpp>
|
||||
#include <mbgl/style/types.hpp>
|
||||
#include <mbgl/storage/request_holder.hpp>
|
||||
|
||||
#include <mbgl/util/noncopyable.hpp>
|
||||
#include <mbgl/util/mat4.hpp>
|
||||
@@ -129,7 +130,7 @@ private:
|
||||
std::map<TileID, std::weak_ptr<TileData>> tile_data;
|
||||
TileCache cache;
|
||||
|
||||
Request* req = nullptr;
|
||||
RequestHolder req;
|
||||
Observer* observer_ = nullptr;
|
||||
};
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <mbgl/storage/file_source.hpp>
|
||||
#include <mbgl/storage/resource.hpp>
|
||||
#include <mbgl/storage/response.hpp>
|
||||
#include <mbgl/storage/request_holder.hpp>
|
||||
#include <mbgl/util/exception.hpp>
|
||||
#include <mbgl/util/raster.hpp>
|
||||
#include <mbgl/util/thread.hpp>
|
||||
@@ -23,19 +24,8 @@ struct Sprite::Loader {
|
||||
bool loadedImage = false;
|
||||
std::unique_ptr<Data> data = std::make_unique<Data>();
|
||||
|
||||
Request* jsonRequest = nullptr;
|
||||
Request* spriteRequest = nullptr;
|
||||
|
||||
~Loader() {
|
||||
if (jsonRequest) {
|
||||
util::ThreadContext::getFileSource()->cancel(jsonRequest);
|
||||
jsonRequest = nullptr;
|
||||
}
|
||||
if (spriteRequest) {
|
||||
util::ThreadContext::getFileSource()->cancel(spriteRequest);
|
||||
spriteRequest = nullptr;
|
||||
}
|
||||
}
|
||||
RequestHolder jsonRequest;
|
||||
RequestHolder spriteRequest;
|
||||
};
|
||||
|
||||
Sprite::Sprite(const std::string& baseUrl, float pixelRatio_)
|
||||
@@ -54,7 +44,6 @@ Sprite::Sprite(const std::string& baseUrl, float pixelRatio_)
|
||||
FileSource* fs = util::ThreadContext::getFileSource();
|
||||
loader->jsonRequest = fs->request({ Resource::Kind::SpriteJSON, jsonURL }, util::RunLoop::getLoop(),
|
||||
[this, jsonURL](const Response& res) {
|
||||
util::ThreadContext::getFileSource()->cancel(loader->jsonRequest);
|
||||
loader->jsonRequest = nullptr;
|
||||
if (res.status == Response::Successful) {
|
||||
loader->data->json = res.data;
|
||||
@@ -71,7 +60,6 @@ Sprite::Sprite(const std::string& baseUrl, float pixelRatio_)
|
||||
loader->spriteRequest =
|
||||
fs->request({ Resource::Kind::SpriteImage, spriteURL }, util::RunLoop::getLoop(),
|
||||
[this, spriteURL](const Response& res) {
|
||||
util::ThreadContext::getFileSource()->cancel(loader->spriteRequest);
|
||||
loader->spriteRequest = nullptr;
|
||||
if (res.status == Response::Successful) {
|
||||
loader->data->image = res.data;
|
||||
|
||||
@@ -43,7 +43,6 @@ void VectorTileData::request(float pixelRatio, const std::function<void()>& call
|
||||
|
||||
FileSource* fs = util::ThreadContext::getFileSource();
|
||||
req = fs->request({ Resource::Kind::Tile, url }, util::RunLoop::getLoop(), [url, callback, this](const Response &res) {
|
||||
util::ThreadContext::getFileSource()->cancel(req);
|
||||
req = nullptr;
|
||||
|
||||
if (res.status == Response::NotFound) {
|
||||
@@ -139,9 +138,6 @@ void VectorTileData::cancel() {
|
||||
if (state != State::obsolete) {
|
||||
state = State::obsolete;
|
||||
}
|
||||
if (req) {
|
||||
util::ThreadContext::getFileSource()->cancel(req);
|
||||
req = nullptr;
|
||||
}
|
||||
req = nullptr;
|
||||
workRequest.reset();
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#include <mbgl/map/tile_data.hpp>
|
||||
#include <mbgl/map/tile_worker.hpp>
|
||||
#include <mbgl/storage/request_holder.hpp>
|
||||
|
||||
#include <atomic>
|
||||
|
||||
@@ -40,7 +41,7 @@ private:
|
||||
std::unique_ptr<WorkRequest> workRequest;
|
||||
bool parsing = false;
|
||||
const SourceInfo& source;
|
||||
Request* req = nullptr;
|
||||
RequestHolder req;
|
||||
std::string data;
|
||||
float lastAngle = 0;
|
||||
float currentAngle;
|
||||
|
||||
12
src/mbgl/storage/request_holder.cpp
Normal file
12
src/mbgl/storage/request_holder.cpp
Normal file
@@ -0,0 +1,12 @@
|
||||
#include <mbgl/storage/request_holder.hpp>
|
||||
#include <mbgl/storage/file_source.hpp>
|
||||
#include <mbgl/util/thread_context.hpp>
|
||||
|
||||
namespace mbgl {
|
||||
|
||||
void RequestHolder::Deleter::operator()(Request* req) const {
|
||||
// This function is called by the unique_ptr's Deleter.
|
||||
util::ThreadContext::getFileSource()->cancel(req);
|
||||
}
|
||||
|
||||
}
|
||||
26
src/mbgl/storage/request_holder.hpp
Normal file
26
src/mbgl/storage/request_holder.hpp
Normal file
@@ -0,0 +1,26 @@
|
||||
#ifndef MBGL_STORAGE_REQUEST_HOLDER
|
||||
#define MBGL_STORAGE_REQUEST_HOLDER
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace mbgl {
|
||||
|
||||
class Request;
|
||||
|
||||
class RequestHolder {
|
||||
public:
|
||||
inline RequestHolder& operator=(Request* req) {
|
||||
ptr = std::unique_ptr<Request, Deleter>(req);
|
||||
return *this;
|
||||
}
|
||||
|
||||
private:
|
||||
struct Deleter {
|
||||
void operator()(Request*) const;
|
||||
};
|
||||
std::unique_ptr<Request, Deleter> ptr;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -75,7 +75,6 @@ GlyphPBF::GlyphPBF(GlyphStore* store,
|
||||
});
|
||||
|
||||
auto requestCallback = [this, store, fontStack, url](const Response &res) {
|
||||
util::ThreadContext::getFileSource()->cancel(req);
|
||||
req = nullptr;
|
||||
|
||||
if (res.status != Response::Successful) {
|
||||
@@ -92,12 +91,7 @@ GlyphPBF::GlyphPBF(GlyphStore* store,
|
||||
req = fs->request({ Resource::Kind::Glyphs, url }, util::RunLoop::getLoop(), requestCallback);
|
||||
}
|
||||
|
||||
GlyphPBF::~GlyphPBF() {
|
||||
if (req) {
|
||||
util::ThreadContext::getFileSource()->cancel(req);
|
||||
req = nullptr;
|
||||
}
|
||||
}
|
||||
GlyphPBF::~GlyphPBF() = default;
|
||||
|
||||
void GlyphPBF::parse(GlyphStore* store, const std::string& fontStack, const std::string& url) {
|
||||
if (data.empty()) {
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#include <mbgl/text/glyph.hpp>
|
||||
#include <mbgl/util/noncopyable.hpp>
|
||||
#include <mbgl/storage/request_holder.hpp>
|
||||
|
||||
#include <atomic>
|
||||
#include <functional>
|
||||
@@ -44,7 +45,7 @@ private:
|
||||
std::string data;
|
||||
std::atomic<bool> parsed;
|
||||
|
||||
Request* req = nullptr;
|
||||
RequestHolder req;
|
||||
|
||||
Observer* observer = nullptr;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user