xrootd
Loading...
Searching...
No Matches
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>
29#include "XrdCl/XrdClStatus.hh"
30#include "XrdCl/XrdClURL.hh"
31
32namespace XrdCl
33{
34 //----------------------------------------------------------------------------
35 // We need the forward declaration for the friendship to work properly
36 //----------------------------------------------------------------------------
37 class SIDMgrPool;
38
39 //----------------------------------------------------------------------------
41 //----------------------------------------------------------------------------
43 {
44 friend class SIDMgrPool;
45
46 private:
47
48 //------------------------------------------------------------------------
50 //------------------------------------------------------------------------
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 //------------------------------------------------------------------------
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;
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 //------------------------------------------------------------------------
171 {
172 inline void operator()( SIDManager *mgr )
173 {
175 pool.Recycle( mgr );
176 }
177 };
178
179 //------------------------------------------------------------------------
181 //------------------------------------------------------------------------
183
184 //------------------------------------------------------------------------
186 //------------------------------------------------------------------------
187 SIDMgrPool( const SIDMgrPool& ) = delete;
188 SIDMgrPool( SIDMgrPool&& ) = delete;
189
190 //------------------------------------------------------------------------
192 //------------------------------------------------------------------------
193 SIDMgrPool& operator=( const SIDMgrPool& ) = delete;
195
197 std::unordered_map<std::string, SIDManager*> pool;
198 };
199}
200
201#endif // __XRD_CL_SID_MANAGER_HH__
Handle XRootD stream IDs.
Definition XrdClSIDManager.hh:43
void ReleaseTimedOut(uint8_t sid[2])
Release a timed out SID.
uint16_t GetNumberOfAllocatedSIDs() const
Number of allocated streams.
SIDManager()
Constructor.
Definition XrdClSIDManager.hh:51
std::list< uint16_t > pFreeSIDs
Definition XrdClSIDManager.hh:122
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.
std::set< uint16_t > pTimeOutSIDs
Definition XrdClSIDManager.hh:123
std::unordered_map< uint16_t, time_t > pAllocTime
Definition XrdClSIDManager.hh:121
XrdSysMutex pMutex
Definition XrdClSIDManager.hh:125
size_t pRefCount
Definition XrdClSIDManager.hh:126
uint16_t pSIDCeiling
Definition XrdClSIDManager.hh:124
bool IsTimedOut(uint8_t sid[2])
Check if a SID is timed out.
~SIDManager()
Destructor.
Definition XrdClSIDManager.hh:64
Status AllocateSID(uint8_t sid[2])
uint32_t NumberOfTimedOutSIDs() const
Number of timeout sids.
Definition XrdClSIDManager.hh:109
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.
Definition XrdClSIDManager.hh:133
SIDMgrPool(SIDMgrPool &&)=delete
static SIDMgrPool & Instance()
Definition XrdClSIDManager.hh:139
XrdSysMutex mtx
Definition XrdClSIDManager.hh:196
std::unordered_map< std::string, SIDManager * > pool
Definition XrdClSIDManager.hh:197
~SIDMgrPool()
Destructor.
Definition XrdClSIDManager.hh:151
SIDMgrPool(const SIDMgrPool &)=delete
Deleted constructors.
SIDMgrPool & operator=(SIDMgrPool &&)=delete
SIDMgrPool & operator=(const SIDMgrPool &)=delete
Deleted assigment operators.
void Recycle(SIDManager *mgr)
std::shared_ptr< SIDManager > GetSIDMgr(const URL &url)
SIDMgrPool()
Constructor.
Definition XrdClSIDManager.hh:182
URL representation.
Definition XrdClURL.hh:31
Definition XrdSysPthread.hh:263
Definition XrdSysPthread.hh:165
Definition XrdClAction.hh:34
A functional object for handling the deletion of SIDManager objects.
Definition XrdClSIDManager.hh:171
void operator()(SIDManager *mgr)
Definition XrdClSIDManager.hh:172
Procedure execution status.
Definition XrdClStatus.hh:115