@@ -42,8 +42,19 @@ static_assert(sizeof(rpc_buffer_t) == sizeof(rpc::Buffer),
42
42
static_assert (RPC_MAXIMUM_PORT_COUNT == rpc::MAX_PORT_COUNT,
43
43
" Incorrect maximum port count" );
44
44
45
+ namespace {
46
+ struct TempStorage {
47
+ char *alloc (size_t size) {
48
+ storage.emplace_back (std::make_unique<char []>(size));
49
+ return storage.back ().get ();
50
+ }
51
+
52
+ std::vector<std::unique_ptr<char []>> storage;
53
+ };
54
+ } // namespace
55
+
45
56
template <bool packed, uint32_t lane_size>
46
- void handle_printf (rpc::Server::Port &port) {
57
+ static void handle_printf (rpc::Server::Port &port, TempStorage &temp_storage ) {
47
58
FILE *files[lane_size] = {nullptr };
48
59
// Get the appropriate output stream to use.
49
60
if (port.get_opcode () == RPC_PRINTF_TO_STREAM ||
@@ -65,7 +76,7 @@ void handle_printf(rpc::Server::Port &port) {
65
76
66
77
// Recieve the format string and arguments from the client.
67
78
port.recv_n (format, format_sizes,
68
- [&](uint64_t size) { return new char [ size] ; });
79
+ [&](uint64_t size) { return temp_storage. alloc ( size) ; });
69
80
70
81
// Parse the format string to get the expected size of the buffer.
71
82
for (uint32_t lane = 0 ; lane < lane_size; ++lane) {
@@ -88,7 +99,8 @@ void handle_printf(rpc::Server::Port &port) {
88
99
port.send ([&](rpc::Buffer *buffer, uint32_t id) {
89
100
buffer->data [0 ] = args_sizes[id];
90
101
});
91
- port.recv_n (args, args_sizes, [&](uint64_t size) { return new char [size]; });
102
+ port.recv_n (args, args_sizes,
103
+ [&](uint64_t size) { return temp_storage.alloc (size); });
92
104
93
105
// Identify any arguments that are actually pointers to strings on the client.
94
106
// Additionally we want to determine how much buffer space we need to print.
@@ -137,7 +149,8 @@ void handle_printf(rpc::Server::Port &port) {
137
149
});
138
150
uint64_t str_sizes[lane_size] = {0 };
139
151
void *strs[lane_size] = {nullptr };
140
- port.recv_n (strs, str_sizes, [](uint64_t size) { return new char [size]; });
152
+ port.recv_n (strs, str_sizes,
153
+ [&](uint64_t size) { return temp_storage.alloc (size); });
141
154
for (uint32_t lane = 0 ; lane < lane_size; ++lane) {
142
155
if (!strs[lane])
143
156
continue ;
@@ -149,13 +162,12 @@ void handle_printf(rpc::Server::Port &port) {
149
162
150
163
// Perform the final formatting and printing using the LLVM C library printf.
151
164
int results[lane_size] = {0 };
152
- std::vector<void *> to_be_deleted;
153
165
for (uint32_t lane = 0 ; lane < lane_size; ++lane) {
154
166
if (!format[lane])
155
167
continue ;
156
168
157
- std::unique_ptr< char []> buffer ( new char [ buffer_size[lane] ]);
158
- WriteBuffer wb (buffer. get () , buffer_size[lane]);
169
+ char * buffer = temp_storage. alloc ( buffer_size[lane]);
170
+ WriteBuffer wb (buffer, buffer_size[lane]);
159
171
Writer writer (&wb);
160
172
161
173
internal::StructArgList<packed> printf_args (args[lane], args_sizes[lane]);
@@ -173,7 +185,6 @@ void handle_printf(rpc::Server::Port &port) {
173
185
if (cur_section.has_conv && cur_section.conv_name == ' s' ) {
174
186
if (!copied_strs[lane].empty ()) {
175
187
cur_section.conv_val_ptr = copied_strs[lane].back ();
176
- to_be_deleted.push_back (copied_strs[lane].back ());
177
188
copied_strs[lane].pop_back ();
178
189
} else {
179
190
cur_section.conv_val_ptr = nullptr ;
@@ -188,8 +199,7 @@ void handle_printf(rpc::Server::Port &port) {
188
199
}
189
200
}
190
201
191
- results[lane] =
192
- fwrite (buffer.get (), 1 , writer.get_chars_written (), files[lane]);
202
+ results[lane] = fwrite (buffer, 1 , writer.get_chars_written (), files[lane]);
193
203
if (results[lane] != writer.get_chars_written () || ret == -1 )
194
204
results[lane] = -1 ;
195
205
}
@@ -199,24 +209,9 @@ void handle_printf(rpc::Server::Port &port) {
199
209
port.send ([&](rpc::Buffer *buffer, uint32_t id) {
200
210
buffer->data [0 ] = static_cast <uint64_t >(results[id]);
201
211
buffer->data [1 ] = reinterpret_cast <uintptr_t >(nullptr );
202
- delete[] reinterpret_cast <char *>(format[id]);
203
- delete[] reinterpret_cast <char *>(args[id]);
204
212
});
205
- for (void *ptr : to_be_deleted)
206
- delete[] reinterpret_cast <char *>(ptr);
207
213
}
208
214
209
- namespace {
210
- struct TempStorage {
211
- char *alloc (size_t size) {
212
- storage.emplace_back (std::make_unique<char []>(size));
213
- return storage.back ().get ();
214
- }
215
-
216
- std::vector<std::unique_ptr<char []>> storage;
217
- };
218
- } // namespace
219
-
220
215
template <uint32_t lane_size>
221
216
rpc_status_t handle_server_impl (
222
217
rpc::Server &server,
@@ -381,13 +376,13 @@ rpc_status_t handle_server_impl(
381
376
case RPC_PRINTF_TO_STREAM_PACKED:
382
377
case RPC_PRINTF_TO_STDOUT_PACKED:
383
378
case RPC_PRINTF_TO_STDERR_PACKED: {
384
- handle_printf<true , lane_size>(*port);
379
+ handle_printf<true , lane_size>(*port, temp_storage );
385
380
break ;
386
381
}
387
382
case RPC_PRINTF_TO_STREAM:
388
383
case RPC_PRINTF_TO_STDOUT:
389
384
case RPC_PRINTF_TO_STDERR: {
390
- handle_printf<false , lane_size>(*port);
385
+ handle_printf<false , lane_size>(*port, temp_storage );
391
386
break ;
392
387
}
393
388
case RPC_REMOVE: {
0 commit comments