MCPcopy Create free account
hub / github.com/axboe/liburing / recv_fn

Function recv_fn

test/recvsend_bundle.c:275–334  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

273}
274
275static void *recv_fn(void *data)
276{
277 struct recv_data *rd = data;
278 struct io_uring_params p = { };
279 struct io_uring ring;
280 struct io_uring_buf_ring *br;
281 void *buf = NULL, *ptr;
282 int ret, sock, i;
283
284 p.cq_entries = 4096;
285 p.flags = IORING_SETUP_CQSIZE;
286 ret = t_create_ring_params(16, &ring, &p);
287 if (ret == T_SETUP_SKIP) {
288 ret = 0;
289 goto err;
290 } else if (ret < 0) {
291 goto err;
292 }
293
294 if (posix_memalign(&buf, sysconf(_SC_PAGESIZE), MSG_SIZE * RECV_BIDS))
295 goto err;
296
297 if (!classic_buffers) {
298 br = io_uring_setup_buf_ring(&ring, RECV_BIDS, RECV_BGID, 0, &ret);
299 if (!br) {
300 if (ret != -EINVAL)
301 fprintf(stderr, "failed setting up recv ring %d\n", ret);
302 goto err;
303 }
304
305 ptr = buf;
306 for (i = 0; i < RECV_BIDS; i++) {
307 io_uring_buf_ring_add(br, ptr, MSG_SIZE, i, RECV_BID_MASK, i);
308 ptr += MSG_SIZE;
309 }
310 io_uring_buf_ring_advance(br, RECV_BIDS);
311 rd->recv_buf = buf;
312 } else {
313 ret = provide_classic_buffers(&ring, buf, RECV_BIDS, RECV_BGID);
314 if (ret) {
315 fprintf(stderr, "failed providing classic buffers\n");
316 goto err;
317 }
318 }
319
320 ret = recv_prep(&ring, rd, &sock);
321 if (ret) {
322 fprintf(stderr, "recv_prep failed: %d\n", ret);
323 goto err;
324 }
325
326 ret = do_recv(&ring, rd);
327
328 close(sock);
329 close(rd->accept_fd);
330 io_uring_queue_exit(&ring);
331err:
332 free(buf);

Callers

nothing calls this directly

Calls 6

t_create_ring_paramsFunction · 0.85
io_uring_setup_buf_ringFunction · 0.85
provide_classic_buffersFunction · 0.85
io_uring_queue_exitFunction · 0.85
recv_prepFunction · 0.70
do_recvFunction · 0.70

Tested by

no test coverage detected