xrootd
XrdXrootdFile.hh
Go to the documentation of this file.
1#ifndef _XROOTD_FILE_H_
2#define _XROOTD_FILE_H_
3/******************************************************************************/
4/* */
5/* X r d X r o o t d F i l e . h h */
6/* */
7/* (c) 2004 by the Board of Trustees of the Leland Stanford, Jr., University */
8/* Produced by Andrew Hanushevsky for Stanford University under contract */
9/* DE-AC02-76-SFO0515 with the Department of Energy */
10/* */
11/* This file is part of the XRootD software suite. */
12/* */
13/* XRootD is free software: you can redistribute it and/or modify it under */
14/* the terms of the GNU Lesser General Public License as published by the */
15/* Free Software Foundation, either version 3 of the License, or (at your */
16/* option) any later version. */
17/* */
18/* XRootD is distributed in the hope that it will be useful, but WITHOUT */
19/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
20/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */
21/* License for more details. */
22/* */
23/* You should have received a copy of the GNU Lesser General Public License */
24/* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
25/* COPYING (GPL license). If not, see <http://www.gnu.org/licenses/>. */
26/* */
27/* The copyright holder's institutional names and contributor's names may not */
28/* be used to endorse or promote products derived from this software without */
29/* specific prior written permission of the institution or contributor. */
30/******************************************************************************/
31
32#include <string.h>
33#include <vector>
34
35#include "XProtocol/XPtypes.hh"
38
39/******************************************************************************/
40/* X r d X r o o t d F i l e H P */
41/******************************************************************************/
42
44{
45public:
46
47void Avail(int fHandle) {fhMutex.Lock();
48 bool done = (1 == refs--);
49 if (noMore)
50 {fhMutex.UnLock();
51 if (done) delete this;
52 } else {
53 fhAvail.push_back(fHandle);
55 }
56 }
57
59 if (!refs) {fhMutex.UnLock(); delete this;}
60 else {noMore = true; fhMutex.UnLock();}
61 }
62
63int Get() {int fh;
64 fhMutex.Lock();
65 if (fhAvail.empty()) fh = -1;
66 else {fh = fhAvail.back();
67 fhAvail.pop_back();
68 }
70 return fh;
71 }
72
73void Ref() {fhMutex.Lock(); refs++; fhMutex.UnLock();}
74
75 XrdXrootdFileHP(int rsv=2) : refs(1), noMore(false)
76 {fhAvail.reserve(rsv);}
77
78private:
79
81
83std::vector<int> fhAvail;
84int refs;
85bool noMore;
86};
87
88
89/******************************************************************************/
90/* X r d X r o o t d F i l e */
91/******************************************************************************/
92
93class XrdSfsFile;
96
98{
99public:
100
101XrdSfsFile *XrdSfsp; // -> Actual file object
102union {char *mmAddr; // Memory mapped location, if any
103 unsigned
104 long long cbArg; // Callback argument upon close()
105 };
106char *FileKey; // -> File hash name (actual file name now)
107char FileMode; // 'r' or 'w'
108char AsyncMode; // 1 -> if file in async r/w mode
109char isMMapped; // 1 -> file is memory mapped
110char sfEnabled; // 1 -> file is sendfile enabled
111union {int fdNum; // File descriptor number if regular file
112 int fHandle; // The file handle upon close()
113 };
114XrdXrootdFileHP *fhProc; // File handle processor (set at close time)
115const char *ID; // File user
116
117XrdXrootdFileStats Stats; // File access statistics
118
119static void Init(XrdXrootdFileLock *lp, XrdSysError *erP, int sfok);
120
121 XrdXrootdFile(const char *id, const char *path, XrdSfsFile *fp,
122 char mode='r', bool async=false, int sfOK=0,
123 struct stat *sP=0);
125
126private:
127int bin2hex(char *outbuff, char *inbuff, int inlen);
129static int sfOK;
130static const char *TraceID;
131};
132
133/******************************************************************************/
134/* X r d X r o o t d F i l e T a b l e */
135/******************************************************************************/
136
137// The before define the structure of the file table. We will have FTABSIZE
138// internal table entries. We will then provide an external linear table
139// that increases by FTABSIZE entries. There is one file table per link and
140// it is owned by the base protocol object.
141//
142#define XRD_FTABSIZE 16
143
144// WARNING! Manipulation (i.e., Add/Del/delete) of this object must be
145// externally serialized at the link level. Only one thread
146// may be active w.r.t this object during manipulation!
147//
149{
150public:
151
153
154 XrdXrootdFile *Del(XrdXrootdMonitor *monP, int fnum, bool dodel=true);
155
156inline XrdXrootdFile *Get(int fnum)
157 {if (fnum >= 0)
158 {if (fnum < XRD_FTABSIZE) return FTab[fnum];
159 if (XTab && (fnum-XRD_FTABSIZE)<XTnum)
160 return XTab[fnum-XRD_FTABSIZE];
161 }
162 return (XrdXrootdFile *)0;
163 }
164
166
167 XrdXrootdFileTable(unsigned int mid=0) : fhProc(0), FTfree(0), monID(mid),
168 XTab(0), XTnum(0), XTfree(0)
169 {memset((void *)FTab, 0, sizeof(FTab));}
170
171private:
172
173 ~XrdXrootdFileTable() {} // Always use Recycle() to delete this object!
174
175static const char *TraceID;
176static const char *ID;
178
181unsigned int monID;
182
186};
187#endif
#define stat(a, b)
Definition: XrdPosix.hh:96
#define XRD_FTABSIZE
Definition: XrdXrootdFile.hh:142
Definition: XrdSfsInterface.hh:652
Definition: XrdSysError.hh:90
Definition: XrdSysPthread.hh:166
void Lock()
Definition: XrdSysPthread.hh:220
void UnLock()
Definition: XrdSysPthread.hh:222
Definition: XrdXrootdFile.hh:44
int Get()
Definition: XrdXrootdFile.hh:63
void Avail(int fHandle)
Definition: XrdXrootdFile.hh:47
void Delete()
Definition: XrdXrootdFile.hh:58
~XrdXrootdFileHP()
Definition: XrdXrootdFile.hh:80
int refs
Definition: XrdXrootdFile.hh:84
XrdSysMutex fhMutex
Definition: XrdXrootdFile.hh:82
void Ref()
Definition: XrdXrootdFile.hh:73
XrdXrootdFileHP(int rsv=2)
Definition: XrdXrootdFile.hh:75
std::vector< int > fhAvail
Definition: XrdXrootdFile.hh:83
bool noMore
Definition: XrdXrootdFile.hh:85
Definition: XrdXrootdFileLock.hh:33
Definition: XrdXrootdFileStats.hh:36
Definition: XrdXrootdFile.hh:149
int XTnum
Definition: XrdXrootdFile.hh:184
void Recycle(XrdXrootdMonitor *monP)
int XTfree
Definition: XrdXrootdFile.hh:185
XrdXrootdFile * FTab[XRD_FTABSIZE]
Definition: XrdXrootdFile.hh:179
XrdXrootdFileTable(unsigned int mid=0)
Definition: XrdXrootdFile.hh:167
int Add(XrdXrootdFile *fp)
XrdXrootdFileHP * fhProc
Definition: XrdXrootdFile.hh:177
unsigned int monID
Definition: XrdXrootdFile.hh:181
int FTfree
Definition: XrdXrootdFile.hh:180
~XrdXrootdFileTable()
Definition: XrdXrootdFile.hh:173
XrdXrootdFile ** XTab
Definition: XrdXrootdFile.hh:183
static const char * TraceID
Definition: XrdXrootdFile.hh:175
static const char * ID
Definition: XrdXrootdFile.hh:176
XrdXrootdFile * Get(int fnum)
Definition: XrdXrootdFile.hh:156
XrdXrootdFile * Del(XrdXrootdMonitor *monP, int fnum, bool dodel=true)
Definition: XrdXrootdFile.hh:98
const char * ID
Definition: XrdXrootdFile.hh:115
static const char * TraceID
Definition: XrdXrootdFile.hh:130
XrdXrootdFileHP * fhProc
Definition: XrdXrootdFile.hh:114
int fdNum
Definition: XrdXrootdFile.hh:111
static void Init(XrdXrootdFileLock *lp, XrdSysError *erP, int sfok)
static XrdXrootdFileLock * Locker
Definition: XrdXrootdFile.hh:128
char AsyncMode
Definition: XrdXrootdFile.hh:108
int bin2hex(char *outbuff, char *inbuff, int inlen)
static int sfOK
Definition: XrdXrootdFile.hh:129
char sfEnabled
Definition: XrdXrootdFile.hh:110
int fHandle
Definition: XrdXrootdFile.hh:112
XrdSfsFile * XrdSfsp
Definition: XrdXrootdFile.hh:101
char * FileKey
Definition: XrdXrootdFile.hh:106
XrdXrootdFile(const char *id, const char *path, XrdSfsFile *fp, char mode='r', bool async=false, int sfOK=0, struct stat *sP=0)
char isMMapped
Definition: XrdXrootdFile.hh:109
char FileMode
Definition: XrdXrootdFile.hh:107
XrdXrootdFileStats Stats
Definition: XrdXrootdFile.hh:117
char * mmAddr
Definition: XrdXrootdFile.hh:102
unsigned long long cbArg
Definition: XrdXrootdFile.hh:104
Definition: XrdXrootdMonitor.hh:72