Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TTreeCacheUnzip.h
Go to the documentation of this file.
1 // Authors: Rene Brun 04/06/2006
2 // Leandro Franco 10/04/2008
3 // Fabrizio Furano (CERN) Aug 2009
4 
5 /*************************************************************************
6  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
7  * All rights reserved. *
8  * *
9  * For the licensing terms see $ROOTSYS/LICENSE. *
10  * For the list of contributors see $ROOTSYS/README/CREDITS. *
11  *************************************************************************/
12 
13 #ifndef ROOT_TTreeCacheUnzip
14 #define ROOT_TTreeCacheUnzip
15 
16 #include "Bytes.h"
17 #include "TTreeCache.h"
18 #include <atomic>
19 #include <memory>
20 #include <vector>
21 
22 class TBasket;
23 class TBranch;
24 class TMutex;
25 class TTree;
26 
27 #ifdef R__USE_IMT
28 namespace ROOT {
29 namespace Experimental {
30 class TTaskGroup;
31 }
32 }
33 #endif
34 
35 class TTreeCacheUnzip : public TTreeCache {
36 
37 public:
38  // We have three possibilities for the unzipping mode:
39  // enable, disable and force
40  enum EParUnzipMode { kEnable, kDisable, kForce };
41 
42  // Unzipping states for a basket:
43  enum EUnzipState { kUntouched, kProgress, kFinished };
44 
45 protected:
46  // Unzipping state for baskets
47  struct UnzipState {
48  // Note: we cannot use std::unique_ptr<std::unique_ptr<char[]>[]> or vector of unique_ptr
49  // for fUnzipChunks since std::unique_ptr is not copy constructable.
50  // However, in future upgrade we cannot use make_vector in C++14.
51  std::unique_ptr<char[]> *fUnzipChunks; ///<! [fNseek] Individual unzipped chunks. Their summed size is kept under control.
52  std::vector<Int_t> fUnzipLen; ///<! [fNseek] Length of the unzipped buffers
53  std::atomic<Byte_t> *fUnzipStatus; ///<! [fNSeek]
54 
55  UnzipState() {
56  fUnzipChunks = nullptr;
57  fUnzipStatus = nullptr;
58  }
59  ~UnzipState() {
60  if (fUnzipChunks) delete [] fUnzipChunks;
61  if (fUnzipStatus) delete [] fUnzipStatus;
62  }
63  void Clear(Int_t size);
64  Bool_t IsUntouched(Int_t index) const;
65  Bool_t IsProgress(Int_t index) const;
66  Bool_t IsFinished(Int_t index) const;
67  Bool_t IsUnzipped(Int_t index) const;
68  void Reset(Int_t oldSize, Int_t newSize);
69  void SetUntouched(Int_t index);
70  void SetProgress(Int_t index);
71  void SetFinished(Int_t index);
72  void SetMissed(Int_t index);
73  void SetUnzipped(Int_t index, char* buf, Int_t len);
74  Bool_t TryUnzipping(Int_t index);
75  };
76 
77  typedef struct UnzipState UnzipState_t;
78  UnzipState_t fUnzipState;
79 
80  // Members for paral. managing
81  Bool_t fAsyncReading;
82  Bool_t fEmpty;
83  Int_t fCycle;
84  Bool_t fParallel; ///< Indicate if we want to activate the parallelism (for this instance)
85 
86  std::unique_ptr<TMutex> fIOMutex;
87 
88  static TTreeCacheUnzip::EParUnzipMode fgParallel; ///< Indicate if we want to activate the parallelism
89 
90  // IMT TTaskGroup Manager
91 #ifdef R__USE_IMT
92  std::unique_ptr<ROOT::Experimental::TTaskGroup> fUnzipTaskGroup;
93 #endif
94 
95  // Unzipping related members
96  Int_t fNseekMax; ///<! fNseek can change so we need to know its max size
97  Int_t fUnzipGroupSize; ///<! Min accumulated size of a group of baskets ready to be unzipped by a IMT task
98  Long64_t fUnzipBufferSize; ///<! Max Size for the ready unzipped blocks (default is 2*fBufferSize)
99 
100  static Double_t fgRelBuffSize; ///< This is the percentage of the TTreeCacheUnzip that will be used
101 
102  // Members use to keep statistics
103  Int_t fNFound; ///<! number of blocks that were found in the cache
104  Int_t fNMissed; ///<! number of blocks that were not found in the cache and were unzipped
105  Int_t fNStalls; ///<! number of hits which caused a stall
106  Int_t fNUnzip; ///<! number of blocks that were unzipped
107 
108 private:
109  TTreeCacheUnzip(const TTreeCacheUnzip &); //this class cannot be copied
110  TTreeCacheUnzip& operator=(const TTreeCacheUnzip &);
111 
112  char *fCompBuffer;
113  Int_t fCompBufferSize;
114 
115  // Private methods
116  void Init();
117 
118 public:
119  TTreeCacheUnzip();
120  TTreeCacheUnzip(TTree *tree, Int_t buffersize=0);
121  virtual ~TTreeCacheUnzip();
122 
123  virtual Int_t AddBranch(TBranch *b, Bool_t subbranches = kFALSE);
124  virtual Int_t AddBranch(const char *branch, Bool_t subbranches = kFALSE);
125  Bool_t FillBuffer();
126  virtual Int_t ReadBufferExt(char *buf, Long64_t pos, Int_t len, Int_t &loc);
127  void SetEntryRange(Long64_t emin, Long64_t emax);
128  virtual void StopLearningPhase();
129  void UpdateBranches(TTree *tree);
130 
131  // Methods related to the thread
132  static EParUnzipMode GetParallelUnzip();
133  static Bool_t IsParallelUnzip();
134  static Int_t SetParallelUnzip(TTreeCacheUnzip::EParUnzipMode option = TTreeCacheUnzip::kEnable);
135 
136  // Unzipping related methods
137 #ifdef R__USE_IMT
138  Int_t CreateTasks();
139 #endif
140  Int_t GetRecordHeader(char *buf, Int_t maxbytes, Int_t &nbytes, Int_t &objlen, Int_t &keylen);
141  virtual Int_t GetUnzipBuffer(char **buf, Long64_t pos, Int_t len, Bool_t *free);
142  Int_t GetUnzipGroupSize() { return fUnzipGroupSize; }
143  virtual void ResetCache();
144  virtual Int_t SetBufferSize(Int_t buffersize);
145  void SetUnzipBufferSize(Long64_t bufferSize);
146  void SetUnzipGroupSize(Int_t groupSize) { fUnzipGroupSize = groupSize; }
147  static void SetUnzipRelBufferSize(Float_t relbufferSize);
148  Int_t UnzipBuffer(char **dest, char *src);
149  Int_t UnzipCache(Int_t index);
150 
151  // Methods to get stats
152  Int_t GetNUnzip() { return fNUnzip; }
153  Int_t GetNMissed(){ return fNMissed; }
154  Int_t GetNFound() { return fNFound; }
155 
156  void Print(Option_t* option = "") const;
157 
158  // static members
159  ClassDef(TTreeCacheUnzip,0) //Specialization of TTreeCache for parallel unzipping
160 };
161 
162 #endif