diff --git a/libc/docs/gpu/support.rst b/libc/docs/gpu/support.rst --- a/libc/docs/gpu/support.rst +++ b/libc/docs/gpu/support.rst @@ -89,6 +89,7 @@ atof |check| atol |check| atoll |check| +exit |check| |check| labs |check| llabs |check| strtod |check| diff --git a/libc/src/__support/OSUtil/gpu/quick_exit.cpp b/libc/src/__support/OSUtil/gpu/quick_exit.cpp --- a/libc/src/__support/OSUtil/gpu/quick_exit.cpp +++ b/libc/src/__support/OSUtil/gpu/quick_exit.cpp @@ -17,7 +17,9 @@ namespace __llvm_libc { void quick_exit(int status) { + // We want to first make sure the server is listening before we exit. rpc::Client::Port port = rpc::client.open(); + port.send_and_recv([](rpc::Buffer *) {}, [](rpc::Buffer *) {}); port.send([&](rpc::Buffer *buffer) { reinterpret_cast(buffer->data)[0] = status; }); diff --git a/libc/utils/gpu/server/rpc_server.cpp b/libc/utils/gpu/server/rpc_server.cpp --- a/libc/utils/gpu/server/rpc_server.cpp +++ b/libc/utils/gpu/server/rpc_server.cpp @@ -102,6 +102,8 @@ break; } case RPC_EXIT: { + // Send a response to the client to signal that we are ready to exit. + port->recv_and_send([](rpc::Buffer *) {}); port->recv([](rpc::Buffer *buffer) { int status = 0; std::memcpy(&status, buffer->data, sizeof(int));