diff --git a/src/uvw/fs.hpp b/src/uvw/fs.hpp index c8f325d8..9daf3068 100644 --- a/src/uvw/fs.hpp +++ b/src/uvw/fs.hpp @@ -173,19 +173,9 @@ using FsEvent = TypedEvent; class Fs final: public Request { template static void fsGenericCallback(uv_fs_t *req) { - Fs &fs = *(static_cast(req->data)); - - auto ptr = fs.shared_from_this(); - (void)ptr; - - fs.reset(); - - if(req->result) { - int err = req->result; - fs.publish(ErrorEvent{err}); - } else { - fs.publish(FsEvent{req->path}); - } + auto ptr = reserve(reinterpret_cast(req)); + if(req->result) { ptr->publish(ErrorEvent{static_cast(req->result)}); } + else { ptr->publish(FsEvent{req->path}); } } static void fsReadCallback(uv_fs_t *req) { @@ -193,52 +183,22 @@ class Fs final: public Request { } static void fsWriteCallback(uv_fs_t *req) { - Fs &fs = *(static_cast(req->data)); - - auto ptr = fs.shared_from_this(); - (void)ptr; - - fs.reset(); - - if(req->result) { - int err = req->result; - fs.publish(ErrorEvent{err}); - } else { - fs.publish(FsEvent{req->path, req->result}); - } + auto ptr = reserve(reinterpret_cast(req)); + if(req->result) { ptr->publish(ErrorEvent{static_cast(req->result)}); } + else { ptr->publish(FsEvent{req->path, req->result}); } } template static void fsStatCallback(uv_fs_t *req) { - Fs &fs = *(static_cast(req->data)); - - auto ptr = fs.shared_from_this(); - (void)ptr; - - fs.reset(); - - if(req->result) { - int err = req->result; - fs.publish(ErrorEvent{err}); - } else { - fs.publish(FsEvent{req->path, req->statbuf}); - } + auto ptr = reserve(reinterpret_cast(req)); + if(req->result) { ptr->publish(ErrorEvent{static_cast(req->result)}); } + else { ptr->publish(FsEvent{req->path, req->statbuf}); } } static void fsReadlinkCallback(uv_fs_t *req) { - Fs &fs = *(static_cast(req->data)); - - auto ptr = fs.shared_from_this(); - (void)ptr; - - fs.reset(); - - if(req->result) { - int err = req->result; - fs.publish(ErrorEvent{err}); - } else { - fs.publish(FsEvent{req->path, static_cast(req->ptr)}); - } + auto ptr = reserve(reinterpret_cast(req)); + if(req->result) { ptr->publish(ErrorEvent{static_cast(req->result)}); } + else { ptr->publish(FsEvent{req->path, static_cast(req->ptr)}); } } using Request::Request; diff --git a/src/uvw/request.hpp b/src/uvw/request.hpp index d8891158..4c062836 100644 --- a/src/uvw/request.hpp +++ b/src/uvw/request.hpp @@ -16,20 +16,17 @@ class Request: public Resource { protected: using Resource::Resource; + static auto reserve(uv_req_t *req) { + auto ptr = static_cast(req->data)->shared_from_this(); + ptr->reset(); + return ptr; + } + template static void defaultCallback(R *req, int status) { - T &res = *(static_cast(req->data)); - - auto ptr = res.shared_from_this(); - (void)ptr; - - res.reset(); - - if(status) { - res.publish(ErrorEvent{status}); - } else { - res.publish(E{}); - } + auto ptr = reserve(reinterpret_cast(req)); + if(status) { ptr->publish(ErrorEvent{status}); } + else { ptr->publish(E{}); } } template