xrootd
Loading...
Searching...
No Matches
Public Member Functions | Static Public Member Functions | Private Member Functions | Private Attributes | Static Private Attributes | Friends | List of all members
XrdSys::KernelBuffer Class Reference

#include <XrdSysKernelBuffer.hh>

Public Member Functions

 KernelBuffer ()
 Default constructor.
 
 KernelBuffer (const KernelBuffer &)=delete
 Copy constructor - deleted.
 
 KernelBuffer (KernelBuffer &&kbuff)
 
KernelBufferoperator= (const KernelBuffer &)=delete
 Copy assignment operator - deleted.
 
KernelBufferoperator= (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)
 

Detailed Description

A utility class for manipulating kernel space buffers

(Encapsulates the splice vmsplice & syscalls.)

Constructor & Destructor Documentation

◆ KernelBuffer() [1/3]

XrdSys::KernelBuffer::KernelBuffer ( )
inline

Default constructor.

◆ KernelBuffer() [2/3]

XrdSys::KernelBuffer::KernelBuffer ( const KernelBuffer )
delete

Copy constructor - deleted.

◆ KernelBuffer() [3/3]

XrdSys::KernelBuffer::KernelBuffer ( KernelBuffer &&  kbuff)
inline

References capacity, and size.

◆ ~KernelBuffer()

XrdSys::KernelBuffer::~KernelBuffer ( )
inline

Destructor.

References capacity, and Free().

Member Function Documentation

◆ Alloc()

ssize_t XrdSys::KernelBuffer::Alloc ( size_t  size)
inlineprivate

Allocates another pipe (kernel buffer) of size up to 1MB.

References capacity, MAX_PIPE_SIZE, pipes, and size.

Referenced by FromUser().

◆ Empty()

bool XrdSys::KernelBuffer::Empty ( ) const
inline
Returns
: true is buffer is empty, false otherwise

References size.

◆ Free()

void XrdSys::KernelBuffer::Free ( )
inlineprivate

Closes the underlying pipes (kernel buffers)

References capacity, close, pipes, and size.

Referenced by FromUser(), ToUser(), and ~KernelBuffer().

◆ FromUser()

ssize_t XrdSys::KernelBuffer::FromUser ( char *&  buffer,
size_t  length 
)
inlineprivate

Move a buffer from user space to kernel space

Parameters
buffer: buffer to be moved to kernel space (needs to be page aligned and deallocable with free)
length: length of the buffer
Returns
: number of bytes transferred to kernel space or -1 on error

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.

◆ IsPageAligned()

static bool XrdSys::KernelBuffer::IsPageAligned ( const void *  ptr)
inlinestatic

Check if the user space buffer is page aligned

Parameters
ptr: user space buffer
Returns
: true if the buffer is page aligned, false otherwise

References PAGE_SZ.

Referenced by FromUser().

◆ operator=() [1/2]

KernelBuffer & XrdSys::KernelBuffer::operator= ( const KernelBuffer )
delete

Copy assignment operator - deleted.

◆ operator=() [2/2]

KernelBuffer & XrdSys::KernelBuffer::operator= ( KernelBuffer &&  kbuff)
inline

Move assignment operator.

References capacity, pipes, and size.

◆ ReadFromFD()

ssize_t XrdSys::KernelBuffer::ReadFromFD ( int  fd,
uint32_t  length,
int64_t *  offset 
)
inlineprivate

Read data from a file descriptor to a kernel buffer

Parameters
fd: file descriptor
length: amount of data to be read
offset: offset of the data in the source file
Returns
: size of the data read from the file descriptor or -1 on error

◆ ToUser()

ssize_t XrdSys::KernelBuffer::ToUser ( char *&  buffer)
inlineprivate

Move the buffer to user space:

Parameters
buffer: a user space buffer containing the data, allocated by ToUser routine, to be deallocated with free()
Returns
: number of bytes transferred to user space or -1 on error

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.

◆ WriteToFD()

ssize_t XrdSys::KernelBuffer::WriteToFD ( int  fd,
int64_t *  offset 
)
inlineprivate

Write data from a kernel buffer to a file descriptor

Parameters
fd: file descriptor
offset: offset in the target file
Returns
: size of the data written into the file descriptor or -1 on error

Friends And Related Symbol Documentation

◆ Move [1/2]

ssize_t Move ( char *&  ubuff,
KernelBuffer kbuff,
size_t  length 
)
friend

Utility function for moving a user space buffer to kernel space.

See also
KernelBuffer::FromUser

◆ Move [2/2]

ssize_t Move ( KernelBuffer kbuff,
char *&  ubuff 
)
friend

Utility function for moving a kernel buffer to user space.

See also
KernelBuffer::ToUser

◆ Read [1/2]

ssize_t Read ( int  fd,
KernelBuffer buffer,
uint32_t  length 
)
friend

Utility function for reading data from a file descriptor into a kernel buffer.

See also
KernelBuffer::ReadFromFD

◆ Read [2/2]

ssize_t Read ( int  fd,
KernelBuffer buffer,
uint32_t  length,
int64_t  offset 
)
friend

Utility function for reading data from a file descriptor into a kernel buffer.

See also
KernelBuffer::ReadFromFD

◆ Send

ssize_t Send ( int  fd,
KernelBuffer buffer 
)
friend

Utility function for sending data from a kernel buffer into a socket.

See also
KernelBuffer::WriteToFD

◆ Write

ssize_t Write ( int  fd,
KernelBuffer buffer,
int64_t  offset 
)
friend

Utility function for writing data from a kernel buffer into a file descriptor.

See also
KernelBuffer::WriteToFD

Member Data Documentation

◆ capacity

size_t XrdSys::KernelBuffer::capacity
private

◆ MAX_PIPE_SIZE

const size_t XrdSys::KernelBuffer::MAX_PIPE_SIZE = 1024 * 1024
staticprivate

Referenced by Alloc(), and ToUser().

◆ PAGE_SZ

const size_t XrdSys::KernelBuffer::PAGE_SZ = 4 * 1024
staticprivate

Referenced by IsPageAligned(), and ToUser().

◆ pipes

std::vector<std::tuple<std::array<int,2>, size_t> > XrdSys::KernelBuffer::pipes
private

Referenced by Alloc(), Free(), FromUser(), operator=(), and ToUser().

◆ pipes_cursor

std::vector<std::tuple<std::array<int,2>,size_t>>::iterator XrdSys::KernelBuffer::pipes_cursor
private

Referenced by FromUser(), and ToUser().

◆ size

size_t XrdSys::KernelBuffer::size
private

The documentation for this class was generated from the following file: