25#ifndef SRC_XRDCL_XRDCLKERNELBUFFER_HH_
26#define SRC_XRDCL_XRDCLKERNELBUFFER_HH_
96 pipes = std::move( kbuff.pipes );
125 return ( ( uintptr_t ( ptr ) ) %
PAGE_SZ ) == 0 ;
135 auto itr =
pipes.begin();
136 for( ; itr !=
pipes.end() ; ++itr )
138 std::array<int, 2> &p = std::get<0>( *itr );
158 std::array<int, 2> pipe_fd;
159 ret = pipe( pipe_fd.data() );
160 if( ret < 0 )
return ret;
163 ret = fcntl( pipe_fd[0], F_SETPIPE_SZ,
size );
164 if( ret < 0 )
return ret;
167 pipes.emplace_back( pipe_fd, 0 );
184 inline ssize_t
ReadFromFD(
int fd, uint32_t length, int64_t *offset )
189 inline ssize_t
ReadFromFD(
int fd, uint32_t length, loff_t *offset )
195 ssize_t ret =
Alloc( length );
196 if( ret < 0 )
return ret;
197 if(
size_t( ret ) > length ) ret = length;
198 std::array<int, 2> &pipe_fd = std::get<0>(
pipes.back() );
199 size_t &pipedata = std::get<1>(
pipes.back() );
200 ret = splice( fd, offset, pipe_fd[1], NULL, ret, SPLICE_F_MOVE | SPLICE_F_MORE );
201 if( ret == 0 )
break;
202 if( ret < 0 )
return -1;
229 inline ssize_t
WriteToFD(
int fd, loff_t *offset )
231 if(
size == 0 )
return 0;
236 while( itr !=
pipes.end() )
238 std::array<int, 2> &pipe_fd = std::get<0>( *itr );
239 size_t &pipedata = std::get<1>( *itr );
241 int ret = splice( pipe_fd[0], NULL, fd, offset,
size, SPLICE_F_MOVE | SPLICE_F_MORE );
242 if( ret == 0 )
break;
243 if( ret < 0 )
return -1;
250 if( pipedata > 0 )
continue;
283 if(
size == 0 )
return 0;
288 int ret = posix_memalign( &void_ptr,
PAGE_SZ,
size );
294 char *ptr =
reinterpret_cast<char*
>( void_ptr );
297 while( itr !=
pipes.end() )
304 std::array<int, 2> &pipe_fd = std::get<0>( *itr );
305 size_t &pipedata = std::get<1>( *itr );
306 int ret = vmsplice( pipe_fd[0],
iov, 1, 0 );
324 if( pipedata > 0 )
continue;
332 buffer =
reinterpret_cast<char*
>( void_ptr );
355 inline ssize_t
FromUser(
char *&buffer,
size_t length )
371 ssize_t ret =
Alloc( length );
372 if( ret < 0 )
return ret;
373 std::array<int, 2> &pipe_fd = std::get<0>(
pipes.back() );
374 size_t &pipedata = std::get<1>(
pipes.back() );
377 iov->iov_len = size_t( ret ) < length ? ret : length;
378 iov->iov_base = buff;
379 ret = vmsplice( pipe_fd[1],
iov, 1, SPLICE_F_GIFT );
381 if( ret < 0 )
return -1;
400 std::vector<std::tuple<std::array<int,2>,
size_t>>
pipes;
401 std::vector<std::tuple<std::array<int,2>,
size_t>>::iterator
pipes_cursor;
412 return buffer.
ReadFromFD( fd, length, &offset );
454 return kbuff.
ToUser( ubuff );
464 return kbuff.
FromUser( ubuff, length );
#define close(a)
Definition XrdPosix.hh:43
Definition XrdSysKernelBuffer.hh:46
KernelBuffer()
Default constructor.
Definition XrdSysKernelBuffer.hh:64
static const size_t MAX_PIPE_SIZE
Definition XrdSysKernelBuffer.hh:396
friend ssize_t Move(KernelBuffer &, char *&)
Definition XrdSysKernelBuffer.hh:452
bool Empty() const
Definition XrdSysKernelBuffer.hh:111
ssize_t ReadFromFD(int fd, uint32_t length, int64_t *offset)
Definition XrdSysKernelBuffer.hh:184
size_t capacity
Definition XrdSysKernelBuffer.hh:398
static bool IsPageAligned(const void *ptr)
Definition XrdSysKernelBuffer.hh:123
KernelBuffer & operator=(const KernelBuffer &)=delete
Copy assignment operator - deleted.
ssize_t FromUser(char *&buffer, size_t length)
Definition XrdSysKernelBuffer.hh:355
friend ssize_t Read(int, KernelBuffer &, uint32_t, int64_t)
Definition XrdSysKernelBuffer.hh:410
friend ssize_t Send(int, KernelBuffer &)
Definition XrdSysKernelBuffer.hh:442
KernelBuffer(KernelBuffer &&kbuff)
Definition XrdSysKernelBuffer.hh:76
KernelBuffer & operator=(KernelBuffer &&kbuff)
Move assignment operator.
Definition XrdSysKernelBuffer.hh:92
ssize_t Alloc(size_t size)
Allocates another pipe (kernel buffer) of size up to 1MB.
Definition XrdSysKernelBuffer.hh:151
std::vector< std::tuple< std::array< int, 2 >, size_t > >::iterator pipes_cursor
Definition XrdSysKernelBuffer.hh:401
KernelBuffer(const KernelBuffer &)=delete
Copy constructor - deleted.
void Free()
Closes the underlying pipes (kernel buffers)
Definition XrdSysKernelBuffer.hh:133
ssize_t WriteToFD(int fd, int64_t *offset)
Definition XrdSysKernelBuffer.hh:224
static const size_t PAGE_SZ
Definition XrdSysKernelBuffer.hh:395
ssize_t ToUser(char *&buffer)
Definition XrdSysKernelBuffer.hh:278
~KernelBuffer()
Destructor.
Definition XrdSysKernelBuffer.hh:103
friend ssize_t Write(int, KernelBuffer &, int64_t)
Definition XrdSysKernelBuffer.hh:432
size_t size
Definition XrdSysKernelBuffer.hh:399
std::vector< std::tuple< std::array< int, 2 >, size_t > > pipes
Definition XrdSysKernelBuffer.hh:400
Definition XrdClPollerBuiltIn.hh:28
ssize_t Write(int fd, KernelBuffer &buffer, int64_t offset)
Definition XrdSysKernelBuffer.hh:432
ssize_t Read(int fd, KernelBuffer &buffer, uint32_t length, int64_t offset)
Definition XrdSysKernelBuffer.hh:410
ssize_t Move(KernelBuffer &kbuff, char *&ubuff)
Definition XrdSysKernelBuffer.hh:452
ssize_t Send(int fd, KernelBuffer &buffer)
Definition XrdSysKernelBuffer.hh:442
Definition XrdOucJson.hh:4517
Definition XrdOucIOVec.hh:65