diff --git a/libc/utils/gpu/server/rpc_server.cpp b/libc/utils/gpu/server/rpc_server.cpp index 602b266f9dacb..888fca6cb0bb3 100644 --- a/libc/utils/gpu/server/rpc_server.cpp +++ b/libc/utils/gpu/server/rpc_server.cpp @@ -206,6 +206,17 @@ void handle_printf(rpc::Server::Port &port) { delete[] reinterpret_cast(ptr); } +namespace { +struct TempStorage { + char *alloc(size_t size) { + storage.emplace_back(std::make_unique(size)); + return storage.back().get(); + } + + std::vector> storage; +}; +} // namespace + template rpc_status_t handle_server_impl( rpc::Server &server, @@ -216,6 +227,8 @@ rpc_status_t handle_server_impl( if (!port) return RPC_STATUS_SUCCESS; + TempStorage temp_storage; + switch (port->get_opcode()) { case RPC_WRITE_TO_STREAM: case RPC_WRITE_TO_STDERR: @@ -234,7 +247,8 @@ rpc_status_t handle_server_impl( std::fill(files, files + lane_size, stdout); } - port->recv_n(strs, sizes, [&](uint64_t size) { return new char[size]; }); + port->recv_n(strs, sizes, + [&](uint64_t size) { return temp_storage.alloc(size); }); port->send([&](rpc::Buffer *buffer, uint32_t id) { flockfile(files[id]); buffer->data[0] = fwrite_unlocked(strs[id], 1, sizes[id], files[id]); @@ -242,7 +256,6 @@ rpc_status_t handle_server_impl( buffer->data[0] == sizes[id]) buffer->data[0] += fwrite_unlocked("\n", 1, 1, files[id]); funlockfile(files[id]); - delete[] reinterpret_cast(strs[id]); }); break; } @@ -250,13 +263,12 @@ rpc_status_t handle_server_impl( uint64_t sizes[lane_size] = {0}; void *data[lane_size] = {nullptr}; port->recv([&](rpc::Buffer *buffer, uint32_t id) { - data[id] = new char[buffer->data[0]]; + data[id] = temp_storage.alloc(buffer->data[0]); sizes[id] = fread(data[id], 1, buffer->data[0], file::to_stream(buffer->data[1])); }); port->send_n(data, sizes); port->send([&](rpc::Buffer *buffer, uint32_t id) { - delete[] reinterpret_cast(data[id]); std::memcpy(buffer->data, &sizes[id], sizeof(uint64_t)); }); break; @@ -265,27 +277,24 @@ rpc_status_t handle_server_impl( uint64_t sizes[lane_size] = {0}; void *data[lane_size] = {nullptr}; port->recv([&](rpc::Buffer *buffer, uint32_t id) { - data[id] = new char[buffer->data[0]]; + data[id] = temp_storage.alloc(buffer->data[0]); const char *str = fgets(reinterpret_cast(data[id]), buffer->data[0], file::to_stream(buffer->data[1])); sizes[id] = !str ? 0 : std::strlen(str) + 1; }); port->send_n(data, sizes); - for (uint32_t id = 0; id < lane_size; ++id) - if (data[id]) - delete[] reinterpret_cast(data[id]); break; } case RPC_OPEN_FILE: { uint64_t sizes[lane_size] = {0}; void *paths[lane_size] = {nullptr}; - port->recv_n(paths, sizes, [&](uint64_t size) { return new char[size]; }); + port->recv_n(paths, sizes, + [&](uint64_t size) { return temp_storage.alloc(size); }); port->recv_and_send([&](rpc::Buffer *buffer, uint32_t id) { FILE *file = fopen(reinterpret_cast(paths[id]), reinterpret_cast(buffer->data)); buffer->data[0] = reinterpret_cast(file); - delete[] reinterpret_cast(paths[id]); }); break; } @@ -316,13 +325,12 @@ rpc_status_t handle_server_impl( case RPC_HOST_CALL: { uint64_t sizes[lane_size] = {0}; void *args[lane_size] = {nullptr}; - port->recv_n(args, sizes, [&](uint64_t size) { return new char[size]; }); + port->recv_n(args, sizes, + [&](uint64_t size) { return temp_storage.alloc(size); }); port->recv([&](rpc::Buffer *buffer, uint32_t id) { reinterpret_cast(buffer->data[0])(args[id]); }); - port->send([&](rpc::Buffer *, uint32_t id) { - delete[] reinterpret_cast(args[id]); - }); + port->send([&](rpc::Buffer *, uint32_t id) {}); break; } case RPC_FEOF: { @@ -385,11 +393,11 @@ rpc_status_t handle_server_impl( case RPC_REMOVE: { uint64_t sizes[lane_size] = {0}; void *args[lane_size] = {nullptr}; - port->recv_n(args, sizes, [&](uint64_t size) { return new char[size]; }); + port->recv_n(args, sizes, + [&](uint64_t size) { return temp_storage.alloc(size); }); port->send([&](rpc::Buffer *buffer, uint32_t id) { buffer->data[0] = static_cast( remove(reinterpret_cast(args[id]))); - delete[] reinterpret_cast(args[id]); }); break; } @@ -399,26 +407,24 @@ rpc_status_t handle_server_impl( void *oldpath[lane_size] = {nullptr}; void *newpath[lane_size] = {nullptr}; port->recv_n(oldpath, oldsizes, - [&](uint64_t size) { return new char[size]; }); + [&](uint64_t size) { return temp_storage.alloc(size); }); port->recv_n(newpath, newsizes, - [&](uint64_t size) { return new char[size]; }); + [&](uint64_t size) { return temp_storage.alloc(size); }); port->send([&](rpc::Buffer *buffer, uint32_t id) { buffer->data[0] = static_cast( rename(reinterpret_cast(oldpath[id]), reinterpret_cast(newpath[id]))); - delete[] reinterpret_cast(oldpath[id]); - delete[] reinterpret_cast(newpath[id]); }); break; } case RPC_SYSTEM: { uint64_t sizes[lane_size] = {0}; void *args[lane_size] = {nullptr}; - port->recv_n(args, sizes, [&](uint64_t size) { return new char[size]; }); + port->recv_n(args, sizes, + [&](uint64_t size) { return temp_storage.alloc(size); }); port->send([&](rpc::Buffer *buffer, uint32_t id) { buffer->data[0] = static_cast( system(reinterpret_cast(args[id]))); - delete[] reinterpret_cast(args[id]); }); break; }