19#ifndef SRC_XRDCL_XRDCLASYNCPAGEREADER_HH_
20#define SRC_XRDCL_XRDCLASYNCPAGEREADER_HH_
48 std::vector<uint32_t> &digests ) :
60 uint64_t rdoff = chunks.front().offset;
62 for(
auto &ch : chunks )
66 digests.resize( pgcnt );
82 rspoff = rsp->
info.pgread.offset;
84 uint64_t bufoff = rspoff - chunks[0].offset;
87 for( chindex = 0; chindex < chunks.size(); ++chindex )
89 if( chunks[chindex].length < bufoff )
91 bufoff -= chunks[chindex].length;
107 if( dlen == 0 || chindex >= chunks.size() )
118 auto st = socket.
ReadV(
iov.
data() + iovindex, iovcnt, nbbts );
127 while( nbbts > 0 && dlen > 0 && chindex < chunks.size() );
142 value = sysconf(_SC_IOV_MAX);
150 value &= ~uint32_t( 1 );
158 inline static int max_iovcnt()
160 static iovmax_t iovmax;
167 inline void addiov(
char *&buf,
size_t len )
170 iov.back().iov_base = buf;
171 iov.back().iov_len = len;
179 inline void addiov(
char *&buf, uint32_t len, uint32_t &dleft )
181 if( len > dleft ) len = dleft;
190 inline static uint32_t CalcIOVSize( uint32_t dleft )
192 uint32_t ret = ( dleft / PageWithDigest + 2 ) * 2;
193 return ( ret > uint32_t( max_iovcnt() ) ? max_iovcnt() : ret );
199 uint32_t CalcRdSize()
202 uint32_t dleft = dlen;
204 uint32_t pgspace = chunks[chindex].length - choff;
206 uint32_t dgspace =
sizeof( uint32_t ) * (digests.size() - dgindex ) - dgoff;
207 if( dleft > pgspace + dgspace )
208 dleft = pgspace + dgspace;
219 uint32_t dleft = CalcRdSize();
223 iov.reserve( CalcIOVSize( dleft ) );
225 ChunkInfo ch = chunks[chindex];
226 char* pgbuf =
static_cast<char*
>( ch.buffer ) + choff;
227 uint64_t rdoff = ch.offset + choff;
228 char* dgbuf =
reinterpret_cast<char*
>( digests.data() + dgindex ) + dgoff;
230 uint32_t fdglen =
sizeof( uint32_t ) - dgoff;
231 addiov( dgbuf, fdglen, dleft );
232 if( dleft == 0 || iovcnt >= max_iovcnt() )
236 addiov( pgbuf, fpglen, dleft );
237 if( dleft == 0 || iovcnt >= max_iovcnt() )
240 size_t fullpgs = dleft / PageWithDigest;
241 for(
size_t i = 0; i < fullpgs; ++i )
243 addiov( dgbuf,
sizeof( uint32_t ), dleft );
244 if( dleft == 0 || iovcnt >= max_iovcnt() )
247 if( dleft == 0 || iovcnt >= max_iovcnt() )
251 uint32_t ldglen =
sizeof( uint32_t );
252 addiov( dgbuf, ldglen, dleft );
253 if( dleft == 0 || iovcnt >= max_iovcnt() )
256 addiov( pgbuf, dleft, dleft );
262 inline void shift(
void *&buffer,
size_t nbbts )
264 char *buf =
static_cast<char*
>( buffer );
274 inline void shiftdgbuf( uint32_t &btsread )
276 if(
iov[iovindex].iov_len > btsread )
278 iov[iovindex].iov_len -= btsread;
279 shift(
iov[iovindex].iov_base, btsread );
285 btsread -=
iov[iovindex].iov_len;
286 iov[iovindex].iov_len = 0;
288 digests[dgindex] = ntohl( digests[dgindex] );
299 inline void shiftpgbuf( uint32_t &btsread )
301 if(
iov[iovindex].iov_len > btsread )
303 iov[iovindex].iov_len -= btsread;
304 shift(
iov[iovindex].iov_base, btsread );
310 btsread -=
iov[iovindex].iov_len;
311 choff +=
iov[iovindex].iov_len;
312 iov[iovindex].iov_len = 0;
320 void ShiftIOV( uint32_t btsread )
323 if( iovindex % 2 == 0 )
324 shiftdgbuf( btsread );
329 shiftpgbuf( btsread );
330 if( btsread == 0 )
break;
332 shiftdgbuf( btsread );
338 if( choff >= chunks[chindex].length )
346 std::vector<uint32_t> &digests;
355 std::vector<iovec>
iov;
ServerResponseStatus status
struct ServerResponseBody_Status bdy
union ServerResponseV2::@105 info
XRootDStatus ReadV(iovec *iov, int iocnt, int &bytesRead)
static int csNum(off_t offs, int count)
Compute the required size of a checksum vector based on offset & length.
std::vector< ChunkInfo > ChunkList
List of chunks.
static const int PageSize