#ifndef __XRDPOSIXFILE_HH__ #define __XRDPOSIXFILE_HH__ /******************************************************************************/ /* */ /* X r d P o s i x F i l e . h h */ /* */ /* (c) 2013 by the Board of Trustees of the Leland Stanford, Jr., University */ /* All Rights Reserved */ /* Produced by Andrew Hanushevsky for Stanford University under contract */ /* DE-AC02-76-SFO0515 with the Department of Energy */ /* */ /* This file is part of the XRootD software suite. */ /* */ /* XRootD is free software: you can redistribute it and/or modify it under */ /* the terms of the GNU Lesser General Public License as published by the */ /* Free Software Foundation, either version 3 of the License, or (at your */ /* option) any later version. */ /* */ /* XRootD is distributed in the hope that it will be useful, but WITHOUT */ /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */ /* License for more details. */ /* */ /* You should have received a copy of the GNU Lesser General Public License */ /* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */ /* COPYING (GPL license). If not, see . */ /* */ /* The copyright holder's institutional names and contributor's names may not */ /* be used to endorse or promote products derived from this software without */ /* specific prior written permission of the institution or contributor. */ /******************************************************************************/ #include #include #include #include #include #include #include "XrdCl/XrdClFileSystem.hh" #include "XrdCl/XrdClFile.hh" #include "XrdCl/XrdClURL.hh" #include "XrdCl/XrdClXRootDResponses.hh" #include "XrdOuc/XrdOucCache2.hh" #include "XrdPosix/XrdPosixMap.hh" #include "XrdPosix/XrdPosixObject.hh" /******************************************************************************/ /* X r d P o s i x F i l e C l a s s */ /******************************************************************************/ class XrdPosixCallBack; class XrdPosixPrepIO; class XrdPosixFile : public XrdPosixObject, public XrdOucCacheIO2, public XrdCl::ResponseHandler { public: XrdOucCacheIO2 *XCio; XrdPosixPrepIO *PrepIO; XrdCl::File clFile; long long addOffset(long long offs, int updtSz=0) {updMutex.Lock(); currOffset += offs; if (updtSz && currOffset > (long long)mySize) mySize = currOffset; long long retOffset = currOffset; updMutex.UnLock(); return retOffset; } //atic XrdPosixFile *Alloc(const char *path, XrdPosixCallBack *cbP, int Opts); static void* DelayedDestroy(void*); static void DelayedDestroy(XrdPosixFile *fp); bool Close(XrdCl::XRootDStatus &Status); bool Finalize(XrdCl::XRootDStatus *Status); long long FSize() {AtomicBeg(updMutex); long long retSize = AtomicGet(mySize); AtomicEnd(updMutex); return retSize; } int Fstat(struct stat &buf); const char *Location(); void HandleResponse(XrdCl::XRootDStatus *status, XrdCl::AnyObject *response); void isOpen(); void updLock() {updMutex.Lock();} void updUnLock() {updMutex.UnLock();} long long Offset() {AtomicRet(updMutex, currOffset);} const char *Origin() {return fOpen;} const char *Path() {return fPath;} int Read (char *Buff, long long Offs, int Len); void Read (XrdOucCacheIOCB &iocb, char *buff, long long offs, int rlen); int ReadV (const XrdOucIOVec *readV, int n); void ReadV (XrdOucCacheIOCB &iocb, const XrdOucIOVec *readV, int n); long long setOffset(long long offs) {updMutex.Lock(); currOffset = offs; updMutex.UnLock(); return offs; } bool Stat(XrdCl::XRootDStatus &Status, bool force=false); int Sync(); void Sync(XrdOucCacheIOCB &iocb); int Trunc(long long Offset); void UpdtSize(size_t newsz) {updMutex.Lock(); if (newsz > mySize) mySize = newsz; updMutex.UnLock(); } using XrdPosixObject::Who; bool Who(XrdPosixFile **fileP) {*fileP = this; return true;} int Write(char *Buff, long long Offs, int Len); void Write(XrdOucCacheIOCB &iocb, char *buff, long long offs, int wlen); size_t mySize; time_t myMtime; dev_t myRdev; ino_t myInode; mode_t myMode; static XrdSysSemaphore ddSem; static XrdSysMutex ddMutex; static XrdPosixFile *ddList; static XrdPosixFile *ddLost; static char *sfSFX; static short sfSLN; static bool ddPosted; static int ddNum; static const int realFD = 1; static const int isStrm = 2; static const int isUpdt = 4; XrdPosixFile(bool &aOK, const char *path, XrdPosixCallBack *cbP=0, int Opts=0); ~XrdPosixFile(); private: union {long long currOffset; XrdPosixCallBack *theCB; XrdPosixFile *nextFile; }; char *fPath; char *fOpen; char *fLoc; union {int cOpt; int numTries;}; char isStream; }; #endif