XRootD
XrdClSIDManager.hh
Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // Copyright (c) 2011-2012 by European Organization for Nuclear Research (CERN)
3 // Author: Lukasz Janyst <ljanyst@cern.ch>
4 //------------------------------------------------------------------------------
5 // XRootD is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU Lesser General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // XRootD is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public License
16 // along with XRootD. If not, see <http://www.gnu.org/licenses/>.
17 //------------------------------------------------------------------------------
18 
19 #ifndef __XRD_CL_SID_MANAGER_HH__
20 #define __XRD_CL_SID_MANAGER_HH__
21 
22 #include <list>
23 #include <set>
24 #include <memory>
25 #include <unordered_map>
26 #include <string>
27 #include <cstdint>
28 #include "XrdSys/XrdSysPthread.hh"
29 #include "XrdCl/XrdClStatus.hh"
30 #include "XrdCl/XrdClURL.hh"
31 
32 namespace XrdCl
33 {
34  //----------------------------------------------------------------------------
35  // We need the forward declaration for the friendship to work properly
36  //----------------------------------------------------------------------------
37  class SIDMgrPool;
38 
39  //----------------------------------------------------------------------------
41  //----------------------------------------------------------------------------
42  class SIDManager
43  {
44  friend class SIDMgrPool;
45 
46  private:
47 
48  //------------------------------------------------------------------------
50  //------------------------------------------------------------------------
51  SIDManager(): pSIDCeiling(1), pRefCount(0) { }
52 
53 #if __cplusplus < 201103L
54  //------------------------------------------------------------------------
55  // For older complilers we have to make the destructor public, although
56  // the shared_pointer is using a custom deleter. It will go away once
57  // we drop SLC6 support.
58  //------------------------------------------------------------------------
59  public:
60 #endif
61  //------------------------------------------------------------------------
63  //------------------------------------------------------------------------
65 
66  public:
67 
68  //------------------------------------------------------------------------
73  //------------------------------------------------------------------------
74  Status AllocateSID( uint8_t sid[2] );
75 
76  //------------------------------------------------------------------------
78  //------------------------------------------------------------------------
79  void ReleaseSID( uint8_t sid[2] );
80 
81  //------------------------------------------------------------------------
83  //------------------------------------------------------------------------
84  void TimeOutSID( uint8_t sid[2] );
85 
86  //----------------------------------------------------------------------------
88  //----------------------------------------------------------------------------
89  bool IsAnySIDOldAs( const time_t tlim ) const;
90 
91  //------------------------------------------------------------------------
93  //------------------------------------------------------------------------
94  bool IsTimedOut( uint8_t sid[2] );
95 
96  //------------------------------------------------------------------------
98  //------------------------------------------------------------------------
99  void ReleaseTimedOut( uint8_t sid[2] );
100 
101  //------------------------------------------------------------------------
103  //------------------------------------------------------------------------
104  void ReleaseAllTimedOut();
105 
106  //------------------------------------------------------------------------
108  //------------------------------------------------------------------------
109  uint32_t NumberOfTimedOutSIDs() const
110  {
111  XrdSysMutexHelper scopedLock( pMutex );
112  return pTimeOutSIDs.size();
113  }
114 
115  //------------------------------------------------------------------------
117  //------------------------------------------------------------------------
118  uint16_t GetNumberOfAllocatedSIDs() const;
119 
120  private:
121  std::unordered_map<uint16_t, time_t> pAllocTime;
122  std::list<uint16_t> pFreeSIDs;
123  std::set<uint16_t> pTimeOutSIDs;
124  uint16_t pSIDCeiling;
125  mutable XrdSysMutex pMutex;
126  mutable size_t pRefCount;
127  };
128 
129  //----------------------------------------------------------------------------
131  //----------------------------------------------------------------------------
133  {
134  public:
135 
136  //------------------------------------------------------------------------
138  //------------------------------------------------------------------------
140  {
141  //----------------------------------------------------------------------
142  // We could also use a nifty counter but this is simpler and will do!
143  //----------------------------------------------------------------------
144  static SIDMgrPool *instance = new SIDMgrPool();
145  return *instance;
146  }
147 
148  //------------------------------------------------------------------------
150  //------------------------------------------------------------------------
152 
153  //------------------------------------------------------------------------
156  // a custom deleter that will return the object to the pool
157  //------------------------------------------------------------------------
158  std::shared_ptr<SIDManager> GetSIDMgr( const URL &url );
159 
160  //------------------------------------------------------------------------
162  //------------------------------------------------------------------------
163  void Recycle( SIDManager *mgr );
164 
165  private:
166 
167  //------------------------------------------------------------------------
169  //------------------------------------------------------------------------
170  struct RecycleSidMgr
171  {
172  inline void operator()( SIDManager *mgr )
173  {
175  pool.Recycle( mgr );
176  }
177  };
178 
179  //------------------------------------------------------------------------
181  //------------------------------------------------------------------------
182  SIDMgrPool() { }
183 
184  //------------------------------------------------------------------------
186  //------------------------------------------------------------------------
187  SIDMgrPool( const SIDMgrPool& ) = delete;
188  SIDMgrPool( SIDMgrPool&& ) = delete;
189 
190  //------------------------------------------------------------------------
192  //------------------------------------------------------------------------
193  SIDMgrPool& operator=( const SIDMgrPool& ) = delete;
194  SIDMgrPool& operator=( SIDMgrPool&& ) = delete;
195 
196  XrdSysMutex mtx;
197  std::unordered_map<std::string, SIDManager*> pool;
198  };
199 }
200 
201 #endif // __XRD_CL_SID_MANAGER_HH__
Handle XRootD stream IDs.
void ReleaseTimedOut(uint8_t sid[2])
Release a timed out SID.
uint16_t GetNumberOfAllocatedSIDs() const
Number of allocated streams.
void TimeOutSID(uint8_t sid[2])
Register a SID of a request that timed out.
bool IsAnySIDOldAs(const time_t tlim) const
Check if any SID was allocated at or before a given time.
bool IsTimedOut(uint8_t sid[2])
Check if a SID is timed out.
~SIDManager()
Destructor.
Status AllocateSID(uint8_t sid[2])
uint32_t NumberOfTimedOutSIDs() const
Number of timeout sids.
void ReleaseAllTimedOut()
Release all timed out SIDs.
void ReleaseSID(uint8_t sid[2])
Release the SID that is no longer needed.
Pool of SID manager objects.
static SIDMgrPool & Instance()
~SIDMgrPool()
Destructor.
void Recycle(SIDManager *mgr)
std::shared_ptr< SIDManager > GetSIDMgr(const URL &url)
URL representation.
Definition: XrdClURL.hh:31
Procedure execution status.
Definition: XrdClStatus.hh:115