summaryrefslogtreecommitdiff
path: root/platform/qt/src/async_task.cpp
blob: 79abd2945e38e3af4405fe9a51db357d8644f579 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "async_task_impl.hpp"

#include <mbgl/util/async_task.hpp>
#include <mbgl/util/run_loop.hpp>

#include <cassert>

namespace mbgl {
namespace util {

AsyncTask::Impl::Impl(std::function<void()>&& fn)
    : runLoop(RunLoop::Get()),
      task(std::move(fn)) {
    connect(this, SIGNAL(send(void)), this, SLOT(runTask(void)), Qt::QueuedConnection);
}

void AsyncTask::Impl::maySend() {
    if (!queued.test_and_set()) {
        emit send();
    }
}

void AsyncTask::Impl::runTask() {
    assert(runLoop == RunLoop::Get());

    queued.clear();
    task();
}

AsyncTask::AsyncTask(std::function<void()>&& fn)
    : impl(std::make_unique<Impl>(std::move(fn))) {
}

AsyncTask::~AsyncTask() {
}

void AsyncTask::send() {
    impl->maySend();
}

}
}