diff --git a/reactor.cc b/reactor.cc index 7eb4fae1d1..fcca98f1b7 100644 --- a/reactor.cc +++ b/reactor.cc @@ -11,6 +11,21 @@ #include #include +template +struct syscall_result { + T result; + int error; +}; + +template +syscall_result +wrap_syscall(T result) { + syscall_result sr; + sr.result = result; + sr.error = errno; + return sr; +} + reactor::reactor() : _epollfd(epoll_create1(EPOLL_CLOEXEC)) , _io_eventfd(eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK)) @@ -166,10 +181,12 @@ reactor::read_dma(file& f, uint64_t pos, std::vector iov) { future reactor::open_file_dma(sstring name) { - auto fd = ::open(name.c_str(), O_DIRECT | O_CLOEXEC | O_CREAT | O_RDWR, S_IRWXU); - assert(fd != -1); - // FIXME: make async - return make_ready_future(file(fd)); + return _thread_pool.submit>([name] { + return wrap_syscall(::open(name.c_str(), O_DIRECT | O_CLOEXEC | O_CREAT | O_RDWR, S_IRWXU)); + }).then([] (syscall_result sr) { + assert(sr.result != -1); + return make_ready_future(file(sr.result)); + }); }