1 /*
2 * Copyright 2024 The Netty Project
3 *
4 * The Netty Project licenses this file to you under the Apache License,
5 * version 2.0 (the "License"); you may not use this file except in compliance
6 * with the License. You may obtain a copy of the License at:
7 *
8 * https://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 * License for the specific language governing permissions and limitations
14 * under the License.
15 */
16 package io.netty.channel.uring;
17
18
19 final class RingBuffer {
20 private final SubmissionQueue ioUringSubmissionQueue;
21 private final CompletionQueue ioUringCompletionQueue;
22 private final int features;
23 private boolean closed;
24
25 RingBuffer(SubmissionQueue ioUringSubmissionQueue,
26 CompletionQueue ioUringCompletionQueue, int features) {
27 this.ioUringSubmissionQueue = ioUringSubmissionQueue;
28 this.ioUringCompletionQueue = ioUringCompletionQueue;
29 this.features = features;
30 }
31
32 /**
33 * Enable ring. This method must be called from the same method that will call {@link SubmissionQueue#submit()} and
34 * {@link SubmissionQueue#submitAndWait()}.
35 */
36 void enable() {
37 // We create our ring in disabled mode and so need to enable it first.
38 Native.ioUringRegisterEnableRings(fd());
39 // Now also register the ring filedescriptor itself. This needs to happen in the same thread
40 // that will also call the io_uring_enter(...)
41 ioUringSubmissionQueue.tryRegisterRingFd();
42 }
43
44 int fd() {
45 return ioUringCompletionQueue.ringFd;
46 }
47
48 int features() {
49 return features;
50 }
51
52 SubmissionQueue ioUringSubmissionQueue() {
53 return this.ioUringSubmissionQueue;
54 }
55
56 CompletionQueue ioUringCompletionQueue() {
57 return this.ioUringCompletionQueue;
58 }
59
60 void close() {
61 if (closed) {
62 return;
63 }
64 closed = true;
65 ioUringSubmissionQueue.close();
66 ioUringCompletionQueue.close();
67 Native.ioUringExit(
68 ioUringSubmissionQueue.submissionQueueArrayAddress(),
69 ioUringSubmissionQueue.ringEntries,
70 ioUringSubmissionQueue.ringAddress,
71 ioUringSubmissionQueue.ringSize,
72 ioUringCompletionQueue.ringAddress,
73 ioUringCompletionQueue.ringSize,
74 ioUringSubmissionQueue.ringFd,
75 ioUringSubmissionQueue.enterRingFd);
76 }
77 }