xrootd
|
00001 #ifndef __XRDOFSEVS_H__ 00002 #define __XRDOFSEVS_H__ 00003 /******************************************************************************/ 00004 /* */ 00005 /* X r d O f s E v s . h h */ 00006 /* */ 00007 /* (c) 2005 by the Board of Trustees of the Leland Stanford, Jr., University */ 00008 /* All Rights Reserved */ 00009 /* Produced by Andrew Hanushevsky for Stanford University under contract */ 00010 /* DE-AC02-76-SFO0515 with the Department of Energy */ 00011 /* Based on code developed by Derek Feichtinger, CERN. */ 00012 /******************************************************************************/ 00013 00014 // $Id$ 00015 00016 #include <strings.h> 00017 #include "XrdSys/XrdSysPthread.hh" 00018 00019 class XrdOfsEvsMsg; 00020 class XrdOucEnv; 00021 class XrdOucProg; 00022 class XrdSysError; 00023 00024 /******************************************************************************/ 00025 /* X r d O f s E v s I n f o */ 00026 /******************************************************************************/ 00027 00028 class XrdOfsEvsInfo 00029 { 00030 public: 00031 00032 enum evArg {evTID=0, evLFN1, evCGI1, evLFN2, evCGI2, evFMODE, evFSIZE, evARGS}; 00033 00034 inline long long FSize() {return theFSize;} 00035 00036 inline mode_t FMode() {return theFMode;} 00037 00038 inline void Set(evArg aNum, const char *aVal) {Arg[aNum] = aVal;} 00039 00040 inline const char *Val(evArg aNum) {return Arg[aNum];} 00041 00042 XrdOfsEvsInfo(const char *tid, 00043 const char *lfn1, const char *cgi1="", XrdOucEnv *env1=0, 00044 mode_t mode=0, long long fsize=0, 00045 const char *lfn2="$LFN2", const char *cgi2="", XrdOucEnv *env2=0) 00046 {Arg[evTID] = tid; 00047 Arg[evLFN1] = lfn1; 00048 Arg[evCGI1] = (cgi1 ? cgi1 : ""); Env1 = env1; 00049 Arg[evLFN2] = (lfn2 ? lfn2 : "$LFN2"); 00050 Arg[evCGI2] = (cgi2 ? cgi2 : ""); Env2 = env2; 00051 theFMode = mode; theFSize = fsize; 00052 } 00053 00054 ~XrdOfsEvsInfo() {} 00055 00056 private: 00057 00058 const char *Arg[evARGS]; 00059 XrdOucEnv *Env1; 00060 XrdOucEnv *Env2; 00061 long long theFSize; 00062 mode_t theFMode; 00063 }; 00064 00065 /******************************************************************************/ 00066 /* X r d O f s E v s F o r m a t */ 00067 /******************************************************************************/ 00068 00069 class XrdOfsEvsFormat 00070 { 00071 public: 00072 00073 enum evFlags {Null = 0, freeFmt = 1, cvtMode = 2, cvtFSize = 4}; 00074 00075 const char *Format; 00076 evFlags Flags; 00077 XrdOfsEvsInfo::evArg Args[XrdOfsEvsInfo::evARGS]; 00078 00079 int SNP(XrdOfsEvsInfo &Info, char *buff, int blen) 00080 {return snprintf(buff,blen,Format, Info.Val(Args[0]), 00081 Info.Val(Args[1]), Info.Val(Args[2]), 00082 Info.Val(Args[3]), Info.Val(Args[4]), 00083 Info.Val(Args[5]), Info.Val(Args[6])); 00084 } 00085 00086 void Def(evFlags theFlags, const char *Fmt, ...); 00087 00088 void Set(evFlags theFlags, const char *Fmt, int *fullArgs) 00089 {if (Format && Flags & freeFmt) free((char *)Format); 00090 Format = Fmt; Flags = theFlags; 00091 memcpy(Args, fullArgs, sizeof(Args)); 00092 } 00093 00094 XrdOfsEvsFormat() : Format(0), Flags(Null) {} 00095 ~XrdOfsEvsFormat() {} 00096 }; 00097 00098 /******************************************************************************/ 00099 /* X r d O f s E v s */ 00100 /******************************************************************************/ 00101 00102 class XrdOfsEvs 00103 { 00104 public: 00105 00106 enum Event {All = 0x7fffff00, None = 0x00000000, 00107 Chmod = 0x00000100, Closer = 0x00000201, 00108 Closew = 0x00000402, Close = 0x00000600, 00109 Create = 0x00000803, Fwrite = 0x00001004, 00110 Mkdir = 0x00002005, Mv = 0x00004006, 00111 Openr = 0x00008007, Openw = 0x00010008, 00112 Open = 0x00018000, Rm = 0x00020009, 00113 Rmdir = 0x0004000a, Trunc = 0x0008000b, 00114 nCount = 12, 00115 Mask = 0X000000ff, enMask = 0x7fffff00 00116 }; 00117 00118 static const int minMsgSize = 1360; // (16+320+1024) 00119 static const int maxMsgSize = 2384; // (16+320+1024+1024); 00120 00121 int Enabled(Event theEvents) {return theEvents & enEvents;} 00122 00123 int maxSmsg() {return maxMin;} 00124 int maxLmsg() {return maxMax;} 00125 00126 void Notify(Event eNum, XrdOfsEvsInfo &Info); 00127 00128 static int Parse(XrdSysError &Eroute, Event eNum, char *mText); 00129 00130 const char *Prog() {return theTarget;} 00131 00132 void sendEvents(void); 00133 00134 int Start(XrdSysError *eobj); 00135 00136 XrdOfsEvs(Event theEvents, const char *Target, int minq=90, int maxq=10); 00137 ~XrdOfsEvs(); 00138 00139 private: 00140 const char *eName(int eNum); 00141 int Feed(const char *data, int dlen); 00142 XrdOfsEvsMsg *getMsg(int bigmsg); 00143 void retMsg(XrdOfsEvsMsg *tp); 00144 00145 static XrdOfsEvsFormat MsgFmt[XrdOfsEvs::nCount]; 00146 00147 pthread_t tid; 00148 char *theTarget; 00149 Event enEvents; 00150 XrdSysError *eDest; 00151 XrdOucProg *theProg; 00152 XrdSysMutex qMut; 00153 XrdSysSemaphore qSem; 00154 XrdOfsEvsMsg *msgFirst; 00155 XrdOfsEvsMsg *msgLast; 00156 XrdSysMutex fMut; 00157 XrdOfsEvsMsg *msgFreeMax; 00158 XrdOfsEvsMsg *msgFreeMin; 00159 int endIT; 00160 int msgFD; 00161 int numMax; 00162 int maxMax; 00163 int numMin; 00164 int maxMin; 00165 }; 00166 #endif