xrootd
|
#include <XrdSysKernelBuffer.hh>
Public Member Functions | |
KernelBuffer () | |
Default constructor. | |
KernelBuffer (const KernelBuffer &)=delete | |
Copy constructor - deleted. | |
KernelBuffer (KernelBuffer &&kbuff) | |
KernelBuffer & | operator= (const KernelBuffer &)=delete |
Copy assignment operator - deleted. | |
KernelBuffer & | operator= (KernelBuffer &&kbuff) |
Move assignment operator. | |
~KernelBuffer () | |
Destructor. | |
bool | Empty () const |
Static Public Member Functions | |
static bool | IsPageAligned (const void *ptr) |
Private Member Functions | |
void | Free () |
Closes the underlying pipes (kernel buffers) | |
ssize_t | Alloc (size_t size) |
Allocates another pipe (kernel buffer) of size up to 1MB. | |
ssize_t | ReadFromFD (int fd, uint32_t length, int64_t *offset) |
ssize_t | WriteToFD (int fd, int64_t *offset) |
ssize_t | ToUser (char *&buffer) |
ssize_t | FromUser (char *&buffer, size_t length) |
Private Attributes | |
size_t | capacity |
size_t | size |
std::vector< std::tuple< std::array< int, 2 >, size_t > > | pipes |
std::vector< std::tuple< std::array< int, 2 >, size_t > >::iterator | pipes_cursor |
Static Private Attributes | |
static const size_t | PAGE_SZ = 4 * 1024 |
static const size_t | MAX_PIPE_SIZE = 1024 * 1024 |
Friends | |
ssize_t | Read (int, KernelBuffer &, uint32_t, int64_t) |
ssize_t | Read (int, KernelBuffer &, uint32_t) |
ssize_t | Write (int, KernelBuffer &, int64_t) |
ssize_t | Send (int, KernelBuffer &) |
ssize_t | Move (KernelBuffer &, char *&) |
ssize_t | Move (char *&, KernelBuffer &, size_t) |
A utility class for manipulating kernel space buffers
(Encapsulates the splice vmsplice & syscalls.)
|
inline |
Default constructor.
|
delete |
Copy constructor - deleted.
|
inline |
|
inlineprivate |
Allocates another pipe (kernel buffer) of size up to 1MB.
References capacity, MAX_PIPE_SIZE, pipes, and size.
Referenced by FromUser().
|
inline |
References size.
|
inlineprivate |
Closes the underlying pipes (kernel buffers)
References capacity, close, pipes, and size.
Referenced by FromUser(), ToUser(), and ~KernelBuffer().
|
inlineprivate |
Move a buffer from user space to kernel space
buffer | : buffer to be moved to kernel space (needs to be page aligned and deallocable with free) |
length | : length of the buffer |
NOTE: on success the user space buffer will be freed and the buffer will be set to NULL
NOTE: The user pages are a gift to the kernel. The application may not modify this memory ever, otherwise the page cache and on- disk data may differ.
References Alloc(), capacity, Free(), IsPageAligned(), pipes, pipes_cursor, and size.
|
inlinestatic |
Check if the user space buffer is page aligned
ptr | : user space buffer |
References PAGE_SZ.
Referenced by FromUser().
|
delete |
Copy assignment operator - deleted.
|
inline |
|
inlineprivate |
Read data from a file descriptor to a kernel buffer
fd | : file descriptor |
length | : amount of data to be read |
offset | : offset of the data in the source file |
|
inlineprivate |
Move the buffer to user space:
buffer | : a user space buffer containing the data, allocated by ToUser routine, to be deallocated with free() |
Note: vmsplice() really supports true splicing only from user memory to a pipe. In the opposite direction, it actually just copies the data to userspace. But this makes the interface nice and symmetric and enables people to build on vmsplice() with room for future improvement in performance.
References Free(), MAX_PIPE_SIZE, PAGE_SZ, pipes, pipes_cursor, and size.
|
inlineprivate |
Write data from a kernel buffer to a file descriptor
fd | : file descriptor |
offset | : offset in the target file |
|
friend |
Utility function for moving a user space buffer to kernel space.
|
friend |
Utility function for moving a kernel buffer to user space.
|
friend |
Utility function for reading data from a file descriptor into a kernel buffer.
|
friend |
Utility function for reading data from a file descriptor into a kernel buffer.
|
friend |
Utility function for sending data from a kernel buffer into a socket.
|
friend |
Utility function for writing data from a kernel buffer into a file descriptor.
|
private |
Referenced by Alloc(), Free(), FromUser(), KernelBuffer(), operator=(), and ~KernelBuffer().
|
staticprivate |
|
staticprivate |
Referenced by IsPageAligned(), and ToUser().
|
private |
Referenced by Alloc(), Free(), FromUser(), operator=(), and ToUser().
|
private |
Referenced by FromUser(), and ToUser().
|
private |
Referenced by Alloc(), Empty(), Free(), FromUser(), KernelBuffer(), operator=(), and ToUser().