xrootd
XrdPosixFile.hh
Go to the documentation of this file.
1 #ifndef __XRDPOSIXFILE_HH__
2 #define __XRDPOSIXFILE_HH__
3 /******************************************************************************/
4 /* */
5 /* X r d P o s i x F i l e . h h */
6 /* */
7 /* (c) 2013 by the Board of Trustees of the Leland Stanford, Jr., University */
8 /* All Rights Reserved */
9 /* Produced by Andrew Hanushevsky for Stanford University under contract */
10 /* DE-AC02-76-SFO0515 with the Department of Energy */
11 /* */
12 /* This file is part of the XRootD software suite. */
13 /* */
14 /* XRootD is free software: you can redistribute it and/or modify it under */
15 /* the terms of the GNU Lesser General Public License as published by the */
16 /* Free Software Foundation, either version 3 of the License, or (at your */
17 /* option) any later version. */
18 /* */
19 /* XRootD is distributed in the hope that it will be useful, but WITHOUT */
20 /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
21 /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */
22 /* License for more details. */
23 /* */
24 /* You should have received a copy of the GNU Lesser General Public License */
25 /* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
26 /* COPYING (GPL license). If not, see <http://www.gnu.org/licenses/>. */
27 /* */
28 /* The copyright holder's institutional names and contributor's names may not */
29 /* be used to endorse or promote products derived from this software without */
30 /* specific prior written permission of the institution or contributor. */
31 /******************************************************************************/
32 
33 #include <errno.h>
34 #include <fcntl.h>
35 #include <sys/time.h>
36 #include <sys/param.h>
37 #include <sys/resource.h>
38 #include <sys/uio.h>
39 
40 #include "XrdCl/XrdClFileSystem.hh"
41 #include "XrdCl/XrdClFile.hh"
42 #include "XrdCl/XrdClURL.hh"
44 
45 #include "XrdOuc/XrdOucCache.hh"
46 
47 #include "XrdPosix/XrdPosixMap.hh"
49 
50 /******************************************************************************/
51 /* X r d P o s i x F i l e C l a s s */
52 /******************************************************************************/
53 
54 class XrdPosixCallBack;
55 class XrdPosixPrepIO;
56 
57 class XrdPosixFile : public XrdPosixObject,
58  public XrdOucCacheIO,
59  public XrdOucCacheIOCD,
61 {
62 public:
63 
67 
68  long long addOffset(long long offs, int updtSz=0)
69  {updMutex.Lock();
70  currOffset += offs;
71  if (updtSz && currOffset > (long long)mySize)
73  long long retOffset = currOffset;
74  updMutex.UnLock();
75  return retOffset;
76  }
77 
78 //atic XrdPosixFile *Alloc(const char *path, XrdPosixCallBack *cbP, int Opts);
79 
80 static void* DelayedDestroy(void*);
81 
82 static void DelayedDestroy(XrdPosixFile *fp);
83 
84  bool Close(XrdCl::XRootDStatus &Status);
85 
86  bool Detach(XrdOucCacheIOCD &cdP) {(void)cdP; return true;}
87 
88  void DetachDone() {unRef();}
89 
91 
92  long long FSize() {AtomicBeg(updMutex);
93  long long retSize = AtomicGet(mySize);
95  return retSize;
96  }
97 
98  int Fstat(struct stat &buf);
99 
100  const char *Location(bool refresh=false);
101 
103  XrdCl::AnyObject *response);
104 
105  void updLock() {updMutex.Lock();}
106 
108 
110 
111  const char *Origin() {return fOpen;}
112 
113  const char *Path() {return fPath;}
114 
115  int pgRead(char *buff, long long offs, int rdlen,
116  std::vector<uint32_t> &csvec, uint64_t opts=0);
117 
119  char *buff, long long offs, int rdlen,
120  std::vector<uint32_t> &csvec, uint64_t opts=0);
121 
122  int pgWrite(char *buff, long long offs, int wrlen,
123  std::vector<uint32_t> &csvec, uint64_t opts=0);
124 
126  char *buff, long long offs, int wrlen,
127  std::vector<uint32_t> &csvec, uint64_t opts=0);
128 
129  int Read (char *Buff, long long Offs, int Len);
130 
131  void Read (XrdOucCacheIOCB &iocb, char *buff, long long offs,
132  int rlen);
133 
134  int ReadV (const XrdOucIOVec *readV, int n);
135 
136  void ReadV (XrdOucCacheIOCB &iocb, const XrdOucIOVec *readV,
137  int n);
138 
139  long long setOffset(long long offs)
140  {updMutex.Lock();
141  currOffset = offs;
142  updMutex.UnLock();
143  return offs;
144  }
145 
146  bool Stat(XrdCl::XRootDStatus &Status, bool force=false);
147 
148  int Sync();
149 
150  void Sync(XrdOucCacheIOCB &iocb);
151 
152  int Trunc(long long Offset);
153 
154  void UpdtSize(size_t newsz)
155  {updMutex.Lock();
156  if (newsz > mySize) mySize = newsz;
157  updMutex.UnLock();
158  }
159 
160  using XrdPosixObject::Who;
161 
162  bool Who(XrdPosixFile **fileP)
163  {*fileP = this; return true;}
164 
165  int Write(char *Buff, long long Offs, int Len);
166 
167  void Write(XrdOucCacheIOCB &iocb, char *buff, long long offs,
168  int wlen);
169 
170  size_t mySize;
171  time_t myAtime;
172  time_t myCtime;
173  time_t myMtime;
174  dev_t myRdev;
175  ino_t myInode;
176  mode_t myMode;
177 
178 static
183 static char *sfSFX;
184 static short sfSLN;
185 static bool ddPosted;
186 static int ddNum;
187 
188 static const int realFD = 1;
189 static const int isStrm = 2;
190 static const int isUpdt = 4;
191 
192  XrdPosixFile(bool &aOK, const char *path, XrdPosixCallBack *cbP=0,
193  int Opts=0);
195 
196 private:
197 
198 union {long long currOffset;
201  };
202 
203 char *fPath;
204 char *fOpen;
205 char *fLoc;
206 union {int cOpt; int numTries;};
207 char isStream;
208 };
209 #endif
XrdPosixFile::UpdtSize
void UpdtSize(size_t newsz)
Definition: XrdPosixFile.hh:154
XrdClFileSystem.hh
XrdPosixFile::cOpt
int cOpt
Definition: XrdPosixFile.hh:206
XrdClXRootDResponses.hh
XrdPosixFile::Who
bool Who(XrdPosixFile **fileP)
Definition: XrdPosixFile.hh:162
XrdPosixObject::updMutex
XrdSysRecMutex updMutex
Definition: XrdPosixObject.hh:94
XrdCl::ResponseHandler
Handle an async response.
Definition: XrdClXRootDResponses.hh:1051
XrdPosixFile::currOffset
long long currOffset
Definition: XrdPosixFile.hh:198
AtomicBeg
#define AtomicBeg(Mtx)
Definition: XrdSysAtomics.hh:63
XrdPosixFile::clFile
XrdCl::File clFile
Definition: XrdPosixFile.hh:66
XrdPosixFile::pgRead
void pgRead(XrdOucCacheIOCB &iocb, char *buff, long long offs, int rdlen, std::vector< uint32_t > &csvec, uint64_t opts=0)
XrdOucCacheIO
Definition: XrdOucCache.hh:105
XrdPosixFile::ddMutex
static XrdSysMutex ddMutex
Definition: XrdPosixFile.hh:180
XrdPosixCallBack
An abstract class to define a callback for Open() call.
Definition: XrdPosixCallBack.hh:52
XrdPosixFile::myCtime
time_t myCtime
Definition: XrdPosixFile.hh:172
XrdPosixFile::DelayedDestroy
static void DelayedDestroy(XrdPosixFile *fp)
XrdPosixFile::Sync
void Sync(XrdOucCacheIOCB &iocb)
XrdSysMutex
Definition: XrdSysPthread.hh:165
XrdPosixFile::addOffset
long long addOffset(long long offs, int updtSz=0)
Definition: XrdPosixFile.hh:68
XrdPosixFile::myMtime
time_t myMtime
Definition: XrdPosixFile.hh:173
AtomicGet
#define AtomicGet(x)
Definition: XrdSysAtomics.hh:71
XrdPosixMap.hh
XrdPosixFile::Sync
int Sync()
XrdPosixFile::Read
void Read(XrdOucCacheIOCB &iocb, char *buff, long long offs, int rlen)
XrdPosixFile::myAtime
time_t myAtime
Definition: XrdPosixFile.hh:171
XrdPosixFile::DelayedDestroy
static void * DelayedDestroy(void *)
XrdPosixFile::ddList
static XrdPosixFile * ddList
Definition: XrdPosixFile.hh:181
XrdPosixFile::Offset
long long Offset()
Definition: XrdPosixFile.hh:109
XrdPosixFile::Location
const char * Location(bool refresh=false)
XrdPosixPrepIO
Definition: XrdPosixPrepIO.hh:39
XrdPosixFile::myRdev
dev_t myRdev
Definition: XrdPosixFile.hh:174
XrdPosixFile::mySize
size_t mySize
Definition: XrdPosixFile.hh:170
XrdPosixFile::HandleResponse
void HandleResponse(XrdCl::XRootDStatus *status, XrdCl::AnyObject *response)
AtomicRet
#define AtomicRet(mtx, x)
Definition: XrdSysAtomics.hh:76
XrdPosixFile::isUpdt
static const int isUpdt
Definition: XrdPosixFile.hh:190
XrdCl::File
A file.
Definition: XrdClFile.hh:46
XrdPosixFile::ReadV
int ReadV(const XrdOucIOVec *readV, int n)
XrdOucIOVec
Definition: XrdOucIOVec.hh:41
XrdPosixFile::fOpen
char * fOpen
Definition: XrdPosixFile.hh:204
XrdPosixFile::nextFile
XrdPosixFile * nextFile
Definition: XrdPosixFile.hh:200
XrdPosixFile::setOffset
long long setOffset(long long offs)
Definition: XrdPosixFile.hh:139
XrdPosixFile::XrdPosixFile
XrdPosixFile(bool &aOK, const char *path, XrdPosixCallBack *cbP=0, int Opts=0)
XrdPosixFile::numTries
int numTries
Definition: XrdPosixFile.hh:206
XrdPosixFile::Trunc
int Trunc(long long Offset)
XrdCl::XRootDStatus
Request status.
Definition: XrdClXRootDResponses.hh:219
XrdPosixFile::FSize
long long FSize()
Definition: XrdPosixFile.hh:92
XrdPosixFile::Stat
bool Stat(XrdCl::XRootDStatus &Status, bool force=false)
XrdPosixFile::Origin
const char * Origin()
Definition: XrdPosixFile.hh:111
XrdPosixFile::theCB
XrdPosixCallBack * theCB
Definition: XrdPosixFile.hh:199
XrdPosixFile::ReadV
void ReadV(XrdOucCacheIOCB &iocb, const XrdOucIOVec *readV, int n)
XrdSysSemaphore
Definition: XrdSysPthread.hh:438
XrdPosixObject::Who
virtual bool Who(XrdPosixDir **dirP)
Definition: XrdPosixObject.hh:86
XrdOucCacheIOCD
Definition: XrdOucCache.hh:82
XrdPosixFile::Write
void Write(XrdOucCacheIOCB &iocb, char *buff, long long offs, int wlen)
XrdPosixFile::ddPosted
static bool ddPosted
Definition: XrdPosixFile.hh:185
XrdClFile.hh
XrdPosixFile::ddLost
static XrdPosixFile * ddLost
Definition: XrdPosixFile.hh:182
XrdPosixFile::fPath
char * fPath
Definition: XrdPosixFile.hh:203
XrdPosixFile::sfSLN
static short sfSLN
Definition: XrdPosixFile.hh:184
XrdPosixObject
Definition: XrdPosixObject.hh:42
XrdPosixObject.hh
XrdPosixFile::isStrm
static const int isStrm
Definition: XrdPosixFile.hh:189
XrdPosixFile::Finalize
bool Finalize(XrdCl::XRootDStatus *Status)
XrdPosixObject::unRef
void unRef()
Definition: XrdPosixObject.hh:67
XrdPosixFile::Fstat
int Fstat(struct stat &buf)
AtomicEnd
#define AtomicEnd(Mtx)
Definition: XrdSysAtomics.hh:64
XrdPosixFile::~XrdPosixFile
~XrdPosixFile()
XrdSysMutex::UnLock
void UnLock()
Definition: XrdSysPthread.hh:224
XrdPosixFile::myMode
mode_t myMode
Definition: XrdPosixFile.hh:176
XrdPosixFile::updLock
void updLock()
Definition: XrdPosixFile.hh:105
XrdPosixFile::myInode
ino_t myInode
Definition: XrdPosixFile.hh:175
XrdPosixFile::updUnLock
void updUnLock()
Definition: XrdPosixFile.hh:107
XrdPosixFile::pgWrite
int pgWrite(char *buff, long long offs, int wrlen, std::vector< uint32_t > &csvec, uint64_t opts=0)
XrdOucCache.hh
XrdPosixFile::ddSem
static XrdSysSemaphore ddSem
Definition: XrdPosixFile.hh:179
XrdSysMutex::Lock
void Lock()
Definition: XrdSysPthread.hh:222
XrdPosixFile::isStream
char isStream
Definition: XrdPosixFile.hh:207
XrdClURL.hh
XrdOucCacheIOCB
Definition: XrdOucCache.hh:53
stat
#define stat(a, b)
Definition: XrdPosix.hh:96
XrdPosixFile::XCio
XrdOucCacheIO * XCio
Definition: XrdPosixFile.hh:64
XrdPosixFile::pgRead
int pgRead(char *buff, long long offs, int rdlen, std::vector< uint32_t > &csvec, uint64_t opts=0)
XrdPosixFile::PrepIO
XrdPosixPrepIO * PrepIO
Definition: XrdPosixFile.hh:65
XrdPosixFile::realFD
static const int realFD
Definition: XrdPosixFile.hh:188
XrdPosixFile::Read
int Read(char *Buff, long long Offs, int Len)
XrdPosixFile::Close
bool Close(XrdCl::XRootDStatus &Status)
XrdPosixFile::ddNum
static int ddNum
Definition: XrdPosixFile.hh:186
XrdCl::AnyObject
Definition: XrdClAnyObject.hh:33
XrdPosixFile
Definition: XrdPosixFile.hh:61
XrdPosixFile::Write
int Write(char *Buff, long long Offs, int Len)
XrdPosixFile::Path
const char * Path()
Definition: XrdPosixFile.hh:113
XrdPosixFile::fLoc
char * fLoc
Definition: XrdPosixFile.hh:205
XrdPosixFile::sfSFX
static char * sfSFX
Definition: XrdPosixFile.hh:183
XrdPosixFile::pgWrite
void pgWrite(XrdOucCacheIOCB &iocb, char *buff, long long offs, int wrlen, std::vector< uint32_t > &csvec, uint64_t opts=0)
XrdPosixFile::Detach
bool Detach(XrdOucCacheIOCD &cdP)
Definition: XrdPosixFile.hh:86
XrdPosixFile::DetachDone
void DetachDone()
Indicate that the CacheIO object has been detached.
Definition: XrdPosixFile.hh:88