00001 #ifndef __FRCREQFILE_H__
00002 #define __FRCREQFILE_H__
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "XrdFrc/XrdFrcRequest.hh"
00034 #include "XrdSys/XrdSysPthread.hh"
00035
00036 class XrdFrcReqFile
00037 {
00038 public:
00039
00040 void Add(XrdFrcRequest *rP);
00041
00042 void Can(XrdFrcRequest *rP);
00043
00044 void Del(XrdFrcRequest *rP);
00045
00046 int Get(XrdFrcRequest *rP);
00047
00048 int Init();
00049
00050 char *List(char *Buff, int bsz, int &Offs,
00051 XrdFrcRequest::Item *ITList=0, int ITNum=0);
00052
00053 void ListL(XrdFrcRequest &tmpReq, char *Buff, int bsz,
00054 XrdFrcRequest::Item *ITList, int ITNum);
00055
00056 XrdFrcReqFile(const char *fn, int aVal);
00057 ~XrdFrcReqFile() {}
00058
00059 private:
00060 enum LockType {lkNone, lkShare, lkExcl, lkInit};
00061
00062 static const int ReqSize = sizeof(XrdFrcRequest);
00063
00064 void FailAdd(char *lfn, int unlk=1);
00065 void FailCan(char *rid, int unlk=1);
00066 void FailDel(char *lfn, int unlk=1);
00067 int FailIni(const char *lfn);
00068 int FileLock(LockType ltype=lkExcl);
00069 int reqRead(void *Buff, int Offs);
00070 int reqWrite(void *Buff, int Offs, int updthdr=1);
00071
00072 XrdSysMutex flMutex;
00073
00074 struct FileHdr
00075 {
00076 int First;
00077 int Last;
00078 int Free;
00079 } HdrData;
00080
00081 char *lokFN;
00082 int lokFD;
00083 int reqFD;
00084 char *reqFN;
00085
00086 int isAgent;
00087
00088 struct recEnt {recEnt *Next;
00089 XrdFrcRequest reqData;
00090 recEnt(XrdFrcRequest &reqref) {Next = 0; reqData = reqref;}
00091 };
00092 int ReWrite(recEnt *rP);
00093
00094 class rqMonitor
00095 {
00096 public:
00097 rqMonitor(int isAgent) : doUL(isAgent)
00098 {if (isAgent) rqMutex.Lock();}
00099 ~rqMonitor() {if (doUL) rqMutex.UnLock();}
00100 private:
00101 static XrdSysMutex rqMutex;
00102 int doUL;
00103 };
00104 };
00105 #endif