Encapsulate access to Thread's uv_loop_t
The Thread object gets access via its constructor. No other object should have access; off-thread objects can't safely do anything with it except pass it back to the thread.
This commit is contained in:
@@ -42,7 +42,7 @@ Request* DefaultFileSource::request(const Resource& resource,
|
||||
|
||||
// This function can be called from any thread. Make sure we're executing the actual call in the
|
||||
// file source loop by sending it over the queue.
|
||||
thread->invoke(&Impl::add, req, thread->get());
|
||||
thread->invoke(&Impl::add, req);
|
||||
|
||||
return req;
|
||||
}
|
||||
@@ -61,8 +61,10 @@ void DefaultFileSource::cancel(Request *req) {
|
||||
|
||||
// ----- Impl -----
|
||||
|
||||
DefaultFileSource::Impl::Impl(uv_loop_t*, FileCache* cache_, const std::string& root)
|
||||
: cache(cache_), assetRoot(root.empty() ? platform::assetRoot() : root) {
|
||||
DefaultFileSource::Impl::Impl(uv_loop_t* loop_, FileCache* cache_, const std::string& root)
|
||||
: loop(loop_),
|
||||
cache(cache_),
|
||||
assetRoot(root.empty() ? platform::assetRoot() : root) {
|
||||
}
|
||||
|
||||
DefaultFileRequest* DefaultFileSource::Impl::find(const Resource& resource) {
|
||||
@@ -73,7 +75,7 @@ DefaultFileRequest* DefaultFileSource::Impl::find(const Resource& resource) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void DefaultFileSource::Impl::add(Request* req, uv_loop_t* loop) {
|
||||
void DefaultFileSource::Impl::add(Request* req) {
|
||||
const Resource& resource = req->resource;
|
||||
DefaultFileRequest* request = find(resource);
|
||||
|
||||
@@ -82,7 +84,7 @@ void DefaultFileSource::Impl::add(Request* req, uv_loop_t* loop) {
|
||||
return;
|
||||
}
|
||||
|
||||
request = &pending.emplace(resource, DefaultFileRequest(resource, loop)).first->second;
|
||||
request = &pending.emplace(resource, DefaultFileRequest(resource)).first->second;
|
||||
request->observers.insert(req);
|
||||
|
||||
if (cache) {
|
||||
@@ -128,9 +130,9 @@ void DefaultFileSource::Impl::startRealRequest(const Resource& resource, std::sh
|
||||
};
|
||||
|
||||
if (algo::starts_with(resource.url, "asset://")) {
|
||||
request->request = new AssetRequest(resource, callback, request->loop, assetRoot);
|
||||
request->request = new AssetRequest(resource, callback, loop, assetRoot);
|
||||
} else {
|
||||
request->request = new HTTPRequest(resource, callback, request->loop, response);
|
||||
request->request = new HTTPRequest(resource, callback, loop, response);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,19 +14,18 @@ class RequestBase;
|
||||
|
||||
struct DefaultFileRequest {
|
||||
const Resource resource;
|
||||
uv_loop_t* loop;
|
||||
std::set<Request*> observers;
|
||||
RequestBase* request = nullptr;
|
||||
|
||||
DefaultFileRequest(const Resource& resource_, uv_loop_t* loop_)
|
||||
: resource(resource_), loop(loop_) {}
|
||||
DefaultFileRequest(const Resource& resource_)
|
||||
: resource(resource_) {}
|
||||
};
|
||||
|
||||
class DefaultFileSource::Impl {
|
||||
public:
|
||||
Impl(uv_loop_t*, FileCache*, const std::string& = "");
|
||||
|
||||
void add(Request*, uv_loop_t*);
|
||||
void add(Request*);
|
||||
void cancel(Request*);
|
||||
|
||||
private:
|
||||
@@ -37,6 +36,7 @@ private:
|
||||
void notify(DefaultFileRequest*, std::shared_ptr<const Response>, FileCache::Hint);
|
||||
|
||||
std::unordered_map<Resource, DefaultFileRequest, Resource::Hash> pending;
|
||||
uv_loop_t* loop = nullptr;
|
||||
FileCache* cache = nullptr;
|
||||
const std::string assetRoot;
|
||||
};
|
||||
|
||||
@@ -76,8 +76,6 @@ public:
|
||||
// destroying the Thread.
|
||||
void pumpingStop(std::function<void ()>);
|
||||
|
||||
uv_loop_t* get() { return loop->get(); }
|
||||
|
||||
private:
|
||||
Thread(const Thread&) = delete;
|
||||
Thread(Thread&&) = delete;
|
||||
|
||||
Reference in New Issue
Block a user