WorkReq review

This commit is contained in:
Michele Caini 2016-07-28 18:12:35 +02:00
parent 8973f55bea
commit a6e67f061d
2 changed files with 9 additions and 7 deletions

View File

@ -17,24 +17,26 @@ struct WorkEvent: Event<WorkEvent> { };
class WorkReq final: public Request<WorkReq, uv_work_t> {
using InternalTask = std::function<void(void)>;
static void workCallback(uv_work_t *req) {
static_cast<WorkReq*>(req->data)->task();
}
using Request::Request;
explicit WorkReq(std::shared_ptr<Loop> ref, InternalTask t)
: Request{std::move(ref)}, task{t}
{ }
public:
using Task = std::function<void(void)>;
using Task = InternalTask;
template<typename... Args>
static std::shared_ptr<WorkReq> create(Args&&... args) {
return std::shared_ptr<WorkReq>{new WorkReq{std::forward<Args>(args)...}};
}
void queue(Task t) {
if(0 == invoke(&uv_queue_work, parent(), get<uv_work_t>(), &workCallback, &defaultCallback<uv_work_t, WorkEvent>)) {
task = std::move(t);
}
void queue() {
invoke(&uv_queue_work, parent(), get<uv_work_t>(), &workCallback, &defaultCallback<uv_work_t, WorkEvent>);
}
private:

View File

@ -15,7 +15,7 @@ TEST(Loop, Basics) {
auto loop = uvw::Loop::create();
auto handle = loop->resource<uvw::PrepareHandle>();
auto req = loop->resource<uvw::WorkReq>();
auto req = loop->resource<uvw::WorkReq>([](){});
auto err = [](uvw::ErrorEvent, auto &) { ASSERT_TRUE(false); };