1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
use std::io;
use std::marker::PhantomData;
use std::ptr::NonNull;
use std::os::unix::io::RawFd;

use super::{IoUring, sys};

pub struct Registrar<'ring> {
    ring: NonNull<sys::io_uring>,
    _marker: PhantomData<&'ring mut IoUring>,
}

impl<'ring> Registrar<'ring> {
    pub(crate) fn new(ring: &'ring IoUring) -> Registrar<'ring> {
        Registrar {
            ring: NonNull::from(&ring.ring),
            _marker: PhantomData,
        }
    }
    pub fn register_buffers(&self, buffers: &[io::IoSlice<'_>]) -> io::Result<()> {
        let res = unsafe {
            let len = buffers.len();
            let addr = buffers as *const [io::IoSlice<'_>] as *const _;
            sys::io_uring_register_buffers(self.ring.as_ptr(), addr, len as _)
        };

        if res >= 0 {
            Ok(())
        } else {
            Err(io::Error::from_raw_os_error(res))
        }
    }

    pub fn unregister_buffers(&self) -> io::Result<()> {
        let res = unsafe {
            sys::io_uring_unregister_buffers(self.ring.as_ptr())
        };

        if res >= 0 {
            Ok(())
        } else {
            Err(io::Error::from_raw_os_error(res))
        }
    }

    pub fn register_files(&self, files: &[RawFd]) -> io::Result<()> {
        let res = unsafe {
            let len = files.len();
            let addr = files as *const [RawFd] as *const RawFd;
            sys::io_uring_register_files(self.ring.as_ptr(), addr, len as _)
        };

        if res >= 0 {
            Ok(())
        } else {
            Err(io::Error::from_raw_os_error(res))
        }
    }

    pub fn unregister_files(&self) -> io::Result<()> {
        let res = unsafe {
            sys::io_uring_unregister_files(self.ring.as_ptr())
        };

        if res >= 0 {
            Ok(())
        } else {
            Err(io::Error::from_raw_os_error(res))
        }
    }

    pub fn register_eventfd(&self, eventfd: RawFd) -> io::Result<()> {
        let res = unsafe {
            sys::io_uring_register_eventfd(self.ring.as_ptr(), eventfd)
        };

        if res >= 0 {
            Ok(())
        } else {
            Err(io::Error::from_raw_os_error(res))
        }
    }

    pub fn unregister_eventfd(&self) -> io::Result<()> {
        let res = unsafe {
            sys::io_uring_unregister_eventfd(self.ring.as_ptr())
        };

        if res >= 0 {
            Ok(())
        } else {
            Err(io::Error::from_raw_os_error(res))
        }
    }
}

unsafe impl<'ring> Send for Registrar<'ring> { }
unsafe impl<'ring> Sync for Registrar<'ring> { }