XRootD
BufferUtils.hh
Go to the documentation of this file.
1 #ifndef __CEPH_BUFFER_UTILS_HH__
2 #define __CEPH_BUFFER_UTILS_HH__
3 
4 // holder of various small utility classes for debugging, profiling, logging, and general stuff
5 
6 #include <list>
7 #include <vector>
8 #include <atomic>
9 #include <chrono>
10 #include <sys/types.h>
11 #include <memory>
12 #include <mutex>
13 #include <sstream>
14 #include <iomanip>
15 #include <ctime>
16 
17 
18 // basic logging
19 // #TODO; merge this into the xrootd logging, when xrootd is available
20 #define CEPHBUFDEBUG 1
21 #ifdef CEPHBUFDEBUG
22 extern std::mutex cephbuf_iolock;
23 #define BUFLOG(x) {std::unique_lock<std::mutex>cephbuf_iolock; std::stringstream _bs; _bs << x; std::clog << _bs.str() << std::endl;}
24 #else
25 #define BUFLOG(x)
26 #endif
27 
28 namespace XrdCephBuffer
29 {
30 
31 
32  class Timer_ns
33  {
41  public:
42  explicit Timer_ns(long &output_ns);
43  ~Timer_ns();
44 
45  private:
46  std::chrono::steady_clock::time_point m_start;
47  long &m_output_val;
48 
49  }; //Timer_ns
50 
51 
52 
53  class Extent
54  {
63  public:
64  Extent(off_t offset, size_t len) : m_offset(offset), m_len(len){}
65  inline off_t offset() const { return m_offset; }
66  inline size_t len() const { return m_len; }
67  inline off_t begin() const { return m_offset; }
68  inline off_t end() const { return m_offset + m_len; }
69  inline bool empty() const {return m_len == 0;}
70 
75  bool isContiguous(const Extent& rhs) const;
76 
77  inline off_t last_pos() const { return m_offset + m_len - 1; }
78 
79  bool in_extent(off_t pos) const;
80  bool allInExtent(off_t pos, size_t len) const;
81  bool someInExtent(off_t pos, size_t len) const;
82 
83  Extent containedExtent(off_t pos, size_t len) const;
84  Extent containedExtent(const Extent &in) const;
85 
86  bool operator<(const Extent &rhs) const;
87  bool operator==(const Extent &rhs) const;
88 
89 
90  private:
91  off_t m_offset;
92  size_t m_len;
93  };
94 
99  typedef std::vector<Extent> ExtentContainer;
100 
109  class ExtentHolder {
110  // holder of a list of extent objects
111  public:
112  ExtentHolder();
113  explicit ExtentHolder(size_t elements);
114  explicit ExtentHolder(const ExtentContainer& extents);
115  ~ExtentHolder();
116 
117  off_t begin() const {return m_begin;}
118  off_t end() const {return m_end;}
119  size_t len() const {return m_end - m_begin;}
120 
121  bool empty() const {return m_extents.empty();}
122  size_t size() const {return m_extents.size();}
123 
124  Extent asExtent() const; // return an extent covering the whole range
125 
126 
127  size_t bytesContained() const; // number of bytes across the extent not considering overlaps!
128  size_t bytesMissing() const; // number of bytes missing across the extent, not considering overlaps!
129 
130  void push_back(const Extent & in);
131  void sort();
132 
133  const ExtentContainer & extents() const {return m_extents;}
134  //ExtentContainer & extents() {return m_extents;}
135 
137  ExtentContainer getExtents() const;
138 
139 
140 
141  protected:
143 
144  off_t m_begin{0}; //lowest offset value
145  off_t m_end{0}; // one past end of last byte used.
146 
147  };
148 
149 
150 }
151 
152 #endif
std::mutex cephbuf_iolock
Definition: BufferUtils.cc:9
Designed to hold individual extents, but itself provide Extent-like capabilities Useful in cases of c...
Definition: BufferUtils.hh:109
bool empty() const
Total range in bytes of the extents.
Definition: BufferUtils.hh:121
size_t bytesContained() const
Definition: BufferUtils.cc:124
ExtentContainer getExtents() const
Definition: BufferUtils.cc:151
size_t size() const
number of extent elements
Definition: BufferUtils.hh:122
ExtentContainer getSortedExtents() const
Definition: BufferUtils.cc:144
void push_back(const Extent &in)
Definition: BufferUtils.cc:101
void sort()
inplace sort by offset of contained extents
Definition: BufferUtils.cc:139
const ExtentContainer & extents() const
Definition: BufferUtils.hh:133
off_t end() const
similar to stl vector end.
Definition: BufferUtils.hh:68
Extent containedExtent(off_t pos, size_t len) const
return the subset of range that is in this extent
Definition: BufferUtils.cc:45
off_t begin() const
Same as offset, but a bit more stl container like.
Definition: BufferUtils.hh:67
bool isContiguous(const Extent &rhs) const
Definition: BufferUtils.cc:20
off_t offset() const
Definition: BufferUtils.hh:65
bool operator==(const Extent &rhs) const
Definition: BufferUtils.cc:68
size_t len() const
Definition: BufferUtils.hh:66
off_t last_pos() const
last real position
Definition: BufferUtils.hh:77
bool empty() const
Definition: BufferUtils.hh:69
bool operator<(const Extent &rhs) const
Definition: BufferUtils.cc:58
bool allInExtent(off_t pos, size_t len) const
is all the range in this extent
Definition: BufferUtils.cc:28
bool in_extent(off_t pos) const
is this position within the range of this extent
Definition: BufferUtils.cc:15
Extent(off_t offset, size_t len)
Ecapsulates an offsets and length, with added functionaliyu Class that represents an offset possition...
Definition: BufferUtils.hh:64
bool someInExtent(off_t pos, size_t len) const
is some of the range in this extent
Definition: BufferUtils.cc:38
Timer_ns(long &output_ns)
RAII based timer information outputing a long value of ns Almost trivial class to time something and ...
Definition: BufferUtils.cc:160
is a simple implementation of IXrdCephBufferData using std::vector<char> representation for the buffe...
Definition: BufferUtils.hh:29
std::vector< Extent > ExtentContainer
Container defintion for Extents Typedef to provide a container of extents as a simple stl vector cont...
Definition: BufferUtils.hh:99