ROOT logo
// @(#)root/io:$Id$
// Author: Elvin Sindrilaru   19/05/2011

/*************************************************************************
 * Copyright (C) 1995-2011, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TFPBlock                                                             //
//                                                                      //
// This class represents the encapsulation of a block request.          //
// It contains the chunks to be prefetched and also serves as a         //
// container for the information read.                                  //
// These blocks are prefetch in a special reader thread by the          //
// TFilePrefetch class.                                                 //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TFPBlock.h"
#include "TStorage.h"
#include <cstdlib>

using std::calloc;
using std::free;
using std::realloc;

ClassImp(TFPBlock)

//__________________________________________________________________
TFPBlock::TFPBlock(Long64_t* offset, Int_t* length, Int_t nb)
{
   // Constructor.

   Long64_t aux = 0;

   fNblock = nb;
   fPos = new Long64_t[nb];
   fRelOffset = new Long64_t[nb];
   fLen = new Int_t[nb];

   for (Int_t i=0; i < nb; i++){
      fPos[i] = offset[i];
      fLen[i] = length[i];
      fRelOffset[i] = aux;
      aux += length[i];
   }

   fCapacity = aux;
   fDataSize = aux;
   fBuffer = (char*) calloc(fCapacity, sizeof(char));
}

//__________________________________________________________________
TFPBlock::~TFPBlock()
{
   // Destructor.

   delete[] fPos;
   delete[] fLen;
   delete[] fRelOffset;
   free(fBuffer);
}


//__________________________________________________________________
void TFPBlock::SetPos(Int_t idx, Long64_t value)
{
   // Set pos value for index idx.

   fPos[idx] = value;
}


//__________________________________________________________________
void TFPBlock::SetBuffer(char* buf)
{
   // Set block buffer.
   if ( fBuffer ) {
     free(fBuffer);
   }
   fBuffer = buf;

}

//__________________________________________________________________
void TFPBlock::ReallocBlock(Long64_t* offset, Int_t* length, Int_t nb)
{
   // Reallocate the block's buffer based on the length
   // of the elements it will contain.

   Long64_t newSize = 0;

   fPos = (Long64_t*) TStorage::ReAlloc(fPos, nb * sizeof(Long64_t), fNblock * sizeof(Long64_t));
   fRelOffset = (Long64_t*) TStorage::ReAlloc(fRelOffset, nb * sizeof(Long64_t), fNblock * sizeof(Long64_t));
   fLen = TStorage::ReAllocInt(fLen, nb, fNblock);
   fNblock = nb;

   for(Int_t i=0; i < nb; i++){
      fPos[i] = offset[i];
      fLen[i] = length[i];
      fRelOffset[i] = newSize;
      newSize += fLen[i];
   }

   if (newSize > fCapacity) {
     fCapacity = newSize;
     fBuffer = (char*) realloc(fBuffer, fCapacity);
   }

   fDataSize = newSize;
}
 TFPBlock.cxx:1
 TFPBlock.cxx:2
 TFPBlock.cxx:3
 TFPBlock.cxx:4
 TFPBlock.cxx:5
 TFPBlock.cxx:6
 TFPBlock.cxx:7
 TFPBlock.cxx:8
 TFPBlock.cxx:9
 TFPBlock.cxx:10
 TFPBlock.cxx:11
 TFPBlock.cxx:12
 TFPBlock.cxx:13
 TFPBlock.cxx:14
 TFPBlock.cxx:15
 TFPBlock.cxx:16
 TFPBlock.cxx:17
 TFPBlock.cxx:18
 TFPBlock.cxx:19
 TFPBlock.cxx:20
 TFPBlock.cxx:21
 TFPBlock.cxx:22
 TFPBlock.cxx:23
 TFPBlock.cxx:24
 TFPBlock.cxx:25
 TFPBlock.cxx:26
 TFPBlock.cxx:27
 TFPBlock.cxx:28
 TFPBlock.cxx:29
 TFPBlock.cxx:30
 TFPBlock.cxx:31
 TFPBlock.cxx:32
 TFPBlock.cxx:33
 TFPBlock.cxx:34
 TFPBlock.cxx:35
 TFPBlock.cxx:36
 TFPBlock.cxx:37
 TFPBlock.cxx:38
 TFPBlock.cxx:39
 TFPBlock.cxx:40
 TFPBlock.cxx:41
 TFPBlock.cxx:42
 TFPBlock.cxx:43
 TFPBlock.cxx:44
 TFPBlock.cxx:45
 TFPBlock.cxx:46
 TFPBlock.cxx:47
 TFPBlock.cxx:48
 TFPBlock.cxx:49
 TFPBlock.cxx:50
 TFPBlock.cxx:51
 TFPBlock.cxx:52
 TFPBlock.cxx:53
 TFPBlock.cxx:54
 TFPBlock.cxx:55
 TFPBlock.cxx:56
 TFPBlock.cxx:57
 TFPBlock.cxx:58
 TFPBlock.cxx:59
 TFPBlock.cxx:60
 TFPBlock.cxx:61
 TFPBlock.cxx:62
 TFPBlock.cxx:63
 TFPBlock.cxx:64
 TFPBlock.cxx:65
 TFPBlock.cxx:66
 TFPBlock.cxx:67
 TFPBlock.cxx:68
 TFPBlock.cxx:69
 TFPBlock.cxx:70
 TFPBlock.cxx:71
 TFPBlock.cxx:72
 TFPBlock.cxx:73
 TFPBlock.cxx:74
 TFPBlock.cxx:75
 TFPBlock.cxx:76
 TFPBlock.cxx:77
 TFPBlock.cxx:78
 TFPBlock.cxx:79
 TFPBlock.cxx:80
 TFPBlock.cxx:81
 TFPBlock.cxx:82
 TFPBlock.cxx:83
 TFPBlock.cxx:84
 TFPBlock.cxx:85
 TFPBlock.cxx:86
 TFPBlock.cxx:87
 TFPBlock.cxx:88
 TFPBlock.cxx:89
 TFPBlock.cxx:90
 TFPBlock.cxx:91
 TFPBlock.cxx:92
 TFPBlock.cxx:93
 TFPBlock.cxx:94
 TFPBlock.cxx:95
 TFPBlock.cxx:96
 TFPBlock.cxx:97
 TFPBlock.cxx:98
 TFPBlock.cxx:99
 TFPBlock.cxx:100
 TFPBlock.cxx:101
 TFPBlock.cxx:102
 TFPBlock.cxx:103
 TFPBlock.cxx:104
 TFPBlock.cxx:105
 TFPBlock.cxx:106
 TFPBlock.cxx:107
 TFPBlock.cxx:108
 TFPBlock.cxx:109
 TFPBlock.cxx:110
 TFPBlock.cxx:111
 TFPBlock.cxx:112
 TFPBlock.cxx:113
 TFPBlock.cxx:114
 TFPBlock.cxx:115
 TFPBlock.cxx:116