diff --git a/include/Async/Async.h b/include/Async/Async.h index ca38c791..48764838 100644 --- a/include/Async/Async.h +++ b/include/Async/Async.h @@ -7,4 +7,4 @@ #include "Network.h" #include "FileSystem.h" #include "ThreadPool.h" - +#include "libuv.h" diff --git a/include/Async/libuv.h b/include/Async/libuv.h index 30778c3b..30ba02ef 100644 --- a/include/Async/libuv.h +++ b/include/Async/libuv.h @@ -16,6 +16,7 @@ #include #include "Support/TypeTraits.h" +#include "Support/Logger.h" namespace clice::async { @@ -58,6 +59,8 @@ T* uv_cast(U& u) { return reinterpret_cast(&u); } +void uv_check_result(const int result, const std::source_location location = std::source_location::current()); + template class Task; diff --git a/src/Async/Async.cpp b/src/Async/Async.cpp index 41835ddd..f5725eb2 100644 --- a/src/Async/Async.cpp +++ b/src/Async/Async.cpp @@ -1,21 +1,9 @@ #include #include "Async/Async.h" -#include "Support/Logger.h" namespace clice::async { -/// Check the result of a libuv function call and log an error if it failed. -/// Use source_location to log the file, line, and function name where the error occurred. -void uv_check_result(const int result, const std::source_location location = std::source_location::current()) { - if(result < 0) { - log::warn("libuv error: {}", uv_strerror(result)); - log::warn("At {}:{}:{}", - location.file_name(), - location.line(), - location.function_name()); - } -} /// The default event loop. uv_loop_t* loop = nullptr; diff --git a/src/Async/Network.cpp b/src/Async/Network.cpp index 2946f856..a3bc6a7a 100644 --- a/src/Async/Network.cpp +++ b/src/Async/Network.cpp @@ -3,12 +3,6 @@ namespace clice::async::net { -/// The initialize should not have any error. If so, we can't continue. -#define UV_CHECK_RESUlT(error) \ - if(error < 0) { \ - log::fatal("{}", std::error_code(error, std::system_category())); \ - } - namespace { net::Callback callback = {}; @@ -79,13 +73,13 @@ void listen(Callback callback) { net::callback = std::move(callback); writer = uv_cast(out); - UV_CHECK_RESUlT(uv_pipe_init(async::loop, &in, 0)); - UV_CHECK_RESUlT(uv_pipe_open(&in, 0)); + uv_check_result(uv_pipe_init(async::loop, &in, 0)); + uv_check_result(uv_pipe_open(&in, 0)); - UV_CHECK_RESUlT(uv_pipe_init(async::loop, &out, 0)); - UV_CHECK_RESUlT(uv_pipe_open(&out, 1)); + uv_check_result(uv_pipe_init(async::loop, &out, 0)); + uv_check_result(uv_pipe_open(&out, 1)); - UV_CHECK_RESUlT(uv_read_start(uv_cast(in), net::on_alloc, net::on_read)); + uv_check_result(uv_read_start(uv_cast(in), net::on_alloc, net::on_read)); } void listen(const char* ip, unsigned int port, Callback callback) { @@ -95,20 +89,20 @@ void listen(const char* ip, unsigned int port, Callback callback) { net::callback = std::move(callback); writer = uv_cast(client); - UV_CHECK_RESUlT(uv_tcp_init(async::loop, &server)); - UV_CHECK_RESUlT(uv_tcp_init(async::loop, &client)); + uv_check_result(uv_tcp_init(async::loop, &server)); + uv_check_result(uv_tcp_init(async::loop, &client)); struct ::sockaddr_in addr; - UV_CHECK_RESUlT(uv_ip4_addr(ip, port, &addr)); - UV_CHECK_RESUlT(uv_tcp_bind(&server, (const struct ::sockaddr*)&addr, 0)); + uv_check_result(uv_ip4_addr(ip, port, &addr)); + uv_check_result(uv_tcp_bind(&server, (const struct ::sockaddr*)&addr, 0)); auto on_connection = [](uv_stream_t* server, int status) { - UV_CHECK_RESUlT(status); - UV_CHECK_RESUlT(uv_accept(server, uv_cast(client))); - UV_CHECK_RESUlT(uv_read_start(uv_cast(client), net::on_alloc, net::on_read)); + uv_check_result(status); + uv_check_result(uv_accept(server, uv_cast(client))); + uv_check_result(uv_read_start(uv_cast(client), net::on_alloc, net::on_read)); }; - UV_CHECK_RESUlT(uv_listen(uv_cast(server), 1, on_connection)); + uv_check_result(uv_listen(uv_cast(server), 1, on_connection)); } void spawn(llvm::StringRef path, llvm::ArrayRef args, Callback callback) { @@ -119,9 +113,9 @@ void spawn(llvm::StringRef path, llvm::ArrayRef args, Callback call net::callback = std::move(callback); writer = reinterpret_cast(&in); - UV_CHECK_RESUlT(uv_pipe_init(async::loop, &in, 0)); - UV_CHECK_RESUlT(uv_pipe_init(async::loop, &out, 0)); - UV_CHECK_RESUlT(uv_pipe_init(async::loop, &err, 0)); + uv_check_result(uv_pipe_init(async::loop, &in, 0)); + uv_check_result(uv_pipe_init(async::loop, &out, 0)); + uv_check_result(uv_pipe_init(async::loop, &err, 0)); static uv_process_t process; static uv_process_options_t options; @@ -164,8 +158,8 @@ void spawn(llvm::StringRef path, llvm::ArrayRef args, Callback call } options.args = argv.data(); - UV_CHECK_RESUlT(uv_spawn(async::loop, &process, &options)); - UV_CHECK_RESUlT(uv_read_start((uv_stream_t*)&out, net::on_alloc, net::on_read)); + uv_check_result(uv_spawn(async::loop, &process, &options)); + uv_check_result(uv_read_start((uv_stream_t*)&out, net::on_alloc, net::on_read)); /// FIXME: This implementation is not correct. auto on_read = [](uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) { @@ -179,7 +173,7 @@ void spawn(llvm::StringRef path, llvm::ArrayRef args, Callback call } }; - UV_CHECK_RESUlT(uv_read_start((uv_stream_t*)&err, net::on_alloc, on_read)); + uv_check_result(uv_read_start((uv_stream_t*)&err, net::on_alloc, on_read)); } namespace awaiter { diff --git a/src/Async/libuv.cpp b/src/Async/libuv.cpp index 371155a2..7e601484 100644 --- a/src/Async/libuv.cpp +++ b/src/Async/libuv.cpp @@ -25,4 +25,16 @@ const std::error_category& category() { return instance; } +/// Check the result of a libuv function call and log an error if it failed. +/// Use source_location to log the file, line, and function name where the error occurred. +void uv_check_result(const int result, const std::source_location location) { + if(result < 0) { + log::warn("libuv error: {}", uv_strerror(result)); + log::warn("At {}:{}:{}", + location.file_name(), + location.line(), + location.function_name()); + } +} + } // namespace clice::async