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:
John Firebaugh
2015-04-22 20:32:46 -07:00
parent f27641bcb5
commit 5f76ab270e
3 changed files with 13 additions and 13 deletions

View File

@@ -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);
}
}

View File

@@ -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;
};

View File

@@ -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;