00001 #ifndef __XRDCMSRRQ_HH__
00002 #define __XRDCMSRRQ_HH__
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <sys/uio.h>
00016
00017 #include "XProtocol/XPtypes.hh"
00018 #include "XProtocol/YProtocol.hh"
00019
00020 #include "XrdCms/XrdCmsTypes.hh"
00021 #include "XrdOuc/XrdOucDLlist.hh"
00022 #include "XrdSys/XrdSysPthread.hh"
00023
00024
00025
00026
00027
00028 class XrdCmsRRQInfo
00029 {
00030 public:
00031 void *Key;
00032 kXR_unt32 ID;
00033 int Rinst;
00034 short Rnum;
00035 char isRW;
00036 char isLU;
00037 SMask_t rwVec;
00038
00039 XrdCmsRRQInfo() {isLU = 0;}
00040 XrdCmsRRQInfo(int rinst, short rnum, kXR_unt32 id)
00041 {Key = 0; ID = id;
00042 Rinst = rinst; Rnum = rnum; isRW = isLU = 0;
00043 }
00044 ~XrdCmsRRQInfo() {}
00045 };
00046
00047
00048
00049
00050
00051 class XrdCmsRRQSlot
00052 {
00053 friend class XrdCmsRRQ;
00054
00055 static XrdCmsRRQSlot *Alloc(XrdCmsRRQInfo *Info);
00056
00057 void Recycle();
00058
00059 XrdCmsRRQSlot();
00060 ~XrdCmsRRQSlot() {}
00061
00062 private:
00063
00064 static XrdSysMutex myMutex;
00065 static XrdCmsRRQSlot *freeSlot;
00066 static short initSlot;
00067
00068 XrdOucDLlist<XrdCmsRRQSlot> Link;
00069 XrdCmsRRQSlot *Cont;
00070 XrdCmsRRQSlot *LkUp;
00071 XrdCmsRRQInfo Info;
00072 SMask_t Arg1;
00073 SMask_t Arg2;
00074 unsigned int Expire;
00075 int slotNum;
00076 };
00077
00078
00079
00080
00081
00082 class XrdCmsRRQ
00083 {
00084 public:
00085
00086 short Add(short Snum, XrdCmsRRQInfo *ip);
00087
00088 void Del(short Snum, const void *Key);
00089
00090 int Init(int Tint=0, int Tdly=0);
00091
00092 void Ready(int Snum, const void *Key, SMask_t mask1, SMask_t mask2);
00093
00094 void *Respond();
00095
00096 void *TimeOut();
00097
00098 XrdCmsRRQ() : isWaiting(0), isReady(0), Tslice(178),
00099 Tdelay(5), myClock(0) {}
00100 ~XrdCmsRRQ() {}
00101
00102 private:
00103
00104 void sendLocResp(XrdCmsRRQSlot *lP);
00105 void sendResponse(XrdCmsRRQInfo *Info, int doredir, int totlen = 0);
00106 static const int numSlots = 1024;
00107
00108 XrdSysMutex myMutex;
00109 XrdSysSemaphore isWaiting;
00110 XrdSysSemaphore isReady;
00111 XrdCmsRRQSlot Slot[numSlots];
00112 XrdOucDLlist<XrdCmsRRQSlot> waitQ;
00113 XrdOucDLlist<XrdCmsRRQSlot> readyQ;
00114 static const int iov_cnt = 2;
00115 struct iovec data_iov[iov_cnt];
00116 struct iovec redr_iov[iov_cnt];
00117 XrdCms::CmsResponse dataResp;
00118 XrdCms::CmsResponse redrResp;
00119 XrdCms::CmsResponse waitResp;
00120 union {char hostbuff[288];
00121 char databuff[XrdCms::CmsLocateRequest::RILen
00122 *STMax];
00123 };
00124 int Tslice;
00125 int Tdelay;
00126 unsigned int myClock;
00127 };
00128
00129 namespace XrdCms
00130 {
00131 extern XrdCmsRRQ RRQ;
00132 }
00133 #endif