[core] Get rid of ::unref() for Timer and AsyncTask
Not need, legacy from libuv. The RunLoop keep the main loop running until is explicitly no longer needed.
This commit is contained in:
@@ -28,6 +28,7 @@ public:
|
||||
}
|
||||
|
||||
handle()->data = this;
|
||||
uv_unref(handle());
|
||||
}
|
||||
|
||||
~Impl() {
|
||||
@@ -43,10 +44,6 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void unref() {
|
||||
uv_unref(handle());
|
||||
}
|
||||
|
||||
private:
|
||||
static void asyncCallback(UV_ASYNC_PARAMS(handle)) {
|
||||
reinterpret_cast<Impl*>(handle->data)->task();
|
||||
@@ -71,9 +68,5 @@ void AsyncTask::send() {
|
||||
impl->maySend();
|
||||
}
|
||||
|
||||
void AsyncTask::unref() {
|
||||
impl->unref();
|
||||
}
|
||||
|
||||
} // namespace util
|
||||
} // namespace mbgl
|
||||
|
||||
@@ -177,7 +177,6 @@ OnlineFileSource::Impl::Impl(FileCache* cache_, const std::string& root)
|
||||
// loop alive; otherwise our app wouldn't terminate. After all, we only need status change
|
||||
// notifications when our app is still running.
|
||||
NetworkStatus::Subscribe(&reachability);
|
||||
reachability.unref();
|
||||
}
|
||||
|
||||
OnlineFileSource::Impl::~Impl() {
|
||||
|
||||
@@ -13,6 +13,12 @@ namespace {
|
||||
using namespace mbgl::util;
|
||||
static ThreadLocal<RunLoop>& current = *new ThreadLocal<RunLoop>;
|
||||
|
||||
#if UV_VERSION_MAJOR == 0 && UV_VERSION_MINOR <= 10
|
||||
void dummyCallback(uv_async_t*, int) {};
|
||||
#else
|
||||
void dummyCallback(uv_async_t*) {};
|
||||
#endif
|
||||
|
||||
} // namespace
|
||||
|
||||
namespace mbgl {
|
||||
@@ -56,7 +62,19 @@ RunLoop* RunLoop::Get() {
|
||||
|
||||
class RunLoop::Impl {
|
||||
public:
|
||||
void closeHolder() {
|
||||
uv_close(holderHandle(), [](uv_handle_t* h) {
|
||||
delete reinterpret_cast<uv_async_t*>(h);
|
||||
});
|
||||
}
|
||||
|
||||
uv_handle_t* holderHandle() {
|
||||
return reinterpret_cast<uv_handle_t*>(holder);
|
||||
}
|
||||
|
||||
uv_loop_t *loop = nullptr;
|
||||
uv_async_t* holder = new uv_async_t;
|
||||
|
||||
RunLoop::Type type;
|
||||
std::unique_ptr<AsyncTask> async;
|
||||
|
||||
@@ -81,6 +99,12 @@ RunLoop::RunLoop(Type type) : impl(std::make_unique<Impl>()) {
|
||||
break;
|
||||
}
|
||||
|
||||
// Just for holding a ref to the main loop and keep
|
||||
// it alive as required by libuv.
|
||||
if (uv_async_init(impl->loop, impl->holder, dummyCallback) != 0) {
|
||||
throw std::runtime_error("Failed to initialize async.");
|
||||
}
|
||||
|
||||
impl->type = type;
|
||||
|
||||
current.set(this);
|
||||
@@ -90,6 +114,10 @@ RunLoop::RunLoop(Type type) : impl(std::make_unique<Impl>()) {
|
||||
RunLoop::~RunLoop() {
|
||||
current.set(nullptr);
|
||||
|
||||
// Close the dummy handle that we have
|
||||
// just to keep the main loop alive.
|
||||
impl->closeHolder();
|
||||
|
||||
if (impl->type == Type::Default) {
|
||||
return;
|
||||
}
|
||||
@@ -133,7 +161,7 @@ void RunLoop::runOnce() {
|
||||
}
|
||||
|
||||
void RunLoop::stop() {
|
||||
invoke([&] { impl->async->unref(); });
|
||||
invoke([&] { uv_unref(impl->holderHandle()); });
|
||||
}
|
||||
|
||||
void RunLoop::addWatch(int fd, Event event, std::function<void(int, Event)>&& callback) {
|
||||
|
||||
@@ -22,6 +22,7 @@ public:
|
||||
}
|
||||
|
||||
handle()->data = this;
|
||||
uv_unref(handle());
|
||||
}
|
||||
|
||||
~Impl() {
|
||||
@@ -44,10 +45,6 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void unref() {
|
||||
uv_unref(handle());
|
||||
}
|
||||
|
||||
private:
|
||||
static void timerCallback(UV_TIMER_PARAMS(handle)) {
|
||||
reinterpret_cast<Impl*>(handle->data)->cb();
|
||||
@@ -78,9 +75,5 @@ void Timer::stop() {
|
||||
impl->stop();
|
||||
}
|
||||
|
||||
void Timer::unref() {
|
||||
impl->unref();
|
||||
}
|
||||
|
||||
} // namespace util
|
||||
} // namespace mbgl
|
||||
|
||||
@@ -39,9 +39,6 @@ MapContext::MapContext(View& view_, FileSource& fileSource, MapMode mode_, GLCon
|
||||
util::ThreadContext::setFileSource(&fileSource);
|
||||
util::ThreadContext::setGLObjectStore(&glObjectStore);
|
||||
|
||||
asyncUpdate.unref();
|
||||
asyncInvalidate.unref();
|
||||
|
||||
view.activate();
|
||||
}
|
||||
|
||||
|
||||
@@ -15,7 +15,6 @@ public:
|
||||
~AsyncTask();
|
||||
|
||||
void send();
|
||||
void unref();
|
||||
|
||||
private:
|
||||
class Impl;
|
||||
|
||||
@@ -17,7 +17,6 @@ public:
|
||||
|
||||
void start(Duration timeout, Duration repeat, std::function<void()>&&);
|
||||
void stop();
|
||||
void unref();
|
||||
|
||||
private:
|
||||
class Impl;
|
||||
|
||||
1
test/fixtures/mock_file_source.cpp
vendored
1
test/fixtures/mock_file_source.cpp
vendored
@@ -18,7 +18,6 @@ public:
|
||||
|
||||
MockFileSource::MockFileSource(Type type_, const std::string& match_)
|
||||
: type(type_), match(match_) {
|
||||
timer.unref();
|
||||
timer.start(std::chrono::milliseconds(10), std::chrono::milliseconds(10), [this] {
|
||||
// Explicit move to avoid iterator invalidation if ~MockFileRequest gets called within the loop.
|
||||
auto pending_ = std::move(pending);
|
||||
|
||||
@@ -40,7 +40,6 @@ TEST(AsyncTask, RequestCoalescing) {
|
||||
|
||||
unsigned count = 0;
|
||||
AsyncTask async([&count] { ++count; });
|
||||
async.unref();
|
||||
|
||||
async.send();
|
||||
async.send();
|
||||
@@ -70,7 +69,6 @@ TEST(AsyncTask, RequestCoalescingMultithreaded) {
|
||||
|
||||
unsigned count = 0;
|
||||
AsyncTask async([&count] { ++count; });
|
||||
async.unref();
|
||||
|
||||
std::vector<std::unique_ptr<Thread<TestWorker>>> threads;
|
||||
ThreadContext context = {"Test", ThreadType::Map, ThreadPriority::Regular};
|
||||
@@ -97,7 +95,6 @@ TEST(AsyncTask, ThreadSafety) {
|
||||
|
||||
unsigned count = 0;
|
||||
AsyncTask async([&count] { ++count; });
|
||||
async.unref();
|
||||
|
||||
unsigned numThreads = 25;
|
||||
|
||||
|
||||
@@ -12,7 +12,6 @@ TEST(Timer, Basic) {
|
||||
RunLoop loop;
|
||||
|
||||
Timer timer;
|
||||
timer.unref();
|
||||
|
||||
auto callback = [&loop] { loop.stop(); };
|
||||
|
||||
@@ -38,7 +37,6 @@ TEST(Timer, Repeat) {
|
||||
RunLoop loop;
|
||||
|
||||
Timer timer;
|
||||
timer.unref();
|
||||
|
||||
unsigned count = 10;
|
||||
auto callback = [&] {
|
||||
@@ -66,10 +64,7 @@ TEST(Timer, Stop) {
|
||||
RunLoop loop;
|
||||
|
||||
Timer timer1;
|
||||
timer1.unref();
|
||||
|
||||
Timer timer2;
|
||||
timer2.unref();
|
||||
|
||||
auto interval1 = std::chrono::milliseconds(50);
|
||||
auto interval2 = std::chrono::milliseconds(250);
|
||||
@@ -106,10 +101,7 @@ TEST(Timer, DestroyShouldStop) {
|
||||
RunLoop loop;
|
||||
|
||||
auto timer1 = std::make_unique<Timer>();
|
||||
timer1->unref();
|
||||
|
||||
Timer timer2;
|
||||
timer2.unref();
|
||||
|
||||
auto interval1 = std::chrono::milliseconds(50);
|
||||
auto interval2 = std::chrono::milliseconds(250);
|
||||
@@ -146,7 +138,6 @@ TEST(Timer, StartOverrides) {
|
||||
RunLoop loop;
|
||||
|
||||
Timer timer;
|
||||
timer.unref();
|
||||
|
||||
auto interval1 = std::chrono::milliseconds(50);
|
||||
auto interval2 = std::chrono::milliseconds(250);
|
||||
@@ -182,6 +173,5 @@ TEST(Timer, CanStopNonStartedTimer) {
|
||||
RunLoop loop;
|
||||
|
||||
Timer timer;
|
||||
timer.unref();
|
||||
timer.stop();
|
||||
}
|
||||
|
||||
@@ -33,7 +33,6 @@ TEST_P(PendingResources, DeleteMapObjectWithPendingRequest) {
|
||||
loop.stop();
|
||||
});
|
||||
|
||||
endTest.unref();
|
||||
fileSource.requestEnqueuedCallback = [&endTest] { endTest.send(); };
|
||||
|
||||
const std::string style = util::read_file("test/fixtures/resources/style.json");
|
||||
|
||||
Reference in New Issue
Block a user