23 #define DFLT_CONNECTMAXTRY 10
32 #include "XProtocol/XPtypes.hh"
43 class TXSocketHandler;
44 class XrdClientMessage;
59 class TXSocket :
public TSocket,
public XrdClientAbsUnsolMsgHandler {
61 friend class TXProofMgr;
62 friend class TXProofServ;
64 friend class TXSocketHandler;
65 friend class TXSockPipe;
66 friend class TXUnixSocket;
86 std::recursive_mutex fAMtx;
88 std::list<TXSockBuf *> fAQue;
96 std::recursive_mutex fIMtx;
108 Int_t fXrdProofdVersion;
111 static TXSockPipe fgPipe;
112 static TString fgLoc;
113 static Bool_t fgInitDone;
116 static std::mutex fgSMtx;
117 static std::list<TXSockBuf *> fgSQue;
121 TXSockBuf *PopUpSpare(Int_t sz);
122 void PushBackSpare();
125 void PostMsg(Int_t type,
const char *msg = 0);
131 Int_t GetLowSocket()
const;
133 static void SetLocation(
const char *loc =
"");
135 static void InitEnvs();
139 enum EUrgentMsgType { kStopProcess = 2000 };
141 TXSocket(
const char *url, Char_t mode =
'M', Int_t psid = -1, Char_t ver = -1,
142 const char *logbuf = 0, Int_t loglevel = -1, TXHandler *handler = 0);
145 virtual void Close(Option_t *opt =
"");
146 Bool_t Create(Bool_t attach = kFALSE);
147 void DisconnectSession(Int_t
id, Option_t *opt =
"");
149 void DoError(
int level,
150 const char *location,
const char *fmt, va_list va)
const;
152 virtual UnsolRespProcResult ProcessUnsolicitedMsg(XrdClientUnsolMsgSender *s,
153 XrdClientMessage *msg);
155 virtual Int_t GetClientID()
const {
return -1; }
156 virtual Int_t GetClientIDSize()
const {
return 1; }
157 Int_t GetLogConnID()
const;
158 Int_t GetOpenError()
const;
159 Int_t GetServType()
const;
160 Int_t GetSessionID()
const;
161 Int_t GetXrdProofdVersion()
const {
return fXrdProofdVersion; }
163 Bool_t IsValid()
const;
164 Bool_t IsServProofd();
165 virtual void RemoveClientID() { }
166 virtual void SetClientID(Int_t) { }
167 void SetSendOpt(ESendRecvOptions o) { fSendOpt = o; }
168 void SetSessionID(Int_t
id);
171 Int_t Send(
const TMessage &mess);
172 Int_t Send(Int_t kind) {
return TSocket::Send(kind); }
173 Int_t Send(Int_t status, Int_t kind)
174 {
return TSocket::Send(status, kind); }
175 Int_t Send(
const char *mess, Int_t kind = kMESS_STRING)
176 {
return TSocket::Send(mess, kind); }
177 Int_t SendRaw(
const void *buf, Int_t len,
178 ESendRecvOptions opt = kDontBlock);
180 TObjString *SendCoordinator(Int_t kind,
const char *msg = 0, Int_t int2 = 0,
181 Long64_t l64 = 0, Int_t int3 = 0,
const char *opt = 0);
184 Int_t Recv(TMessage *&mess);
185 Int_t Recv(Int_t &status, Int_t &kind)
186 {
return TSocket::Recv(status, kind); }
187 Int_t Recv(
char *mess, Int_t max)
188 {
return TSocket::Recv(mess, max); }
189 Int_t Recv(
char *mess, Int_t max, Int_t &kind)
190 {
return TSocket::Recv(mess, max, kind); }
191 Int_t RecvRaw(
void *buf, Int_t len,
192 ESendRecvOptions opt = kDefault);
195 Int_t SendInterrupt(Int_t type);
196 Int_t GetInterrupt(Bool_t &forward);
199 void SendUrgent(Int_t type, Int_t int1, Int_t int2);
202 void SetInterrupt(Bool_t i = kTRUE);
203 inline Bool_t IsInterrupt() { std::lock_guard<std::recursive_mutex> lock(fAMtx);
204 return fRDInterrupt; }
207 inline void SetAWait(Bool_t w = kTRUE) {
208 std::lock_guard<std::recursive_mutex> lock(fAMtx);
210 inline Bool_t IsAWait() { std::lock_guard<std::recursive_mutex> lock(fAMtx);
216 Bool_t Ping(
const char *ord = 0);
224 Int_t SetOption(ESockOptions, Int_t) {
return 0; }
227 void DisableTimeout() { fDontTimeout = kTRUE; }
228 void EnableTimeout() { fDontTimeout = kFALSE; }
231 virtual Int_t Reconnect();
233 ClassDef(TXSocket, 0)
248 TXSockBuf(Char_t *bp=0, Int_t sz=0, Bool_t own=1);
251 void Resize(Int_t sz);
253 static Long64_t BuffMem();
254 static Long64_t GetMemMax();
255 static void SetMemMax(Long64_t memmax);
259 static Long64_t fgBuffMem;
260 static Long64_t fgMemMax;
269 TXSockPipe(
const char *loc =
"");
270 virtual ~TXSockPipe();
272 Bool_t IsValid()
const {
return ((fPipe[0] >= 0 && fPipe[1] >= 0) ? kTRUE : kFALSE); }
274 TXSocket *GetLastReady();
276 Int_t GetRead()
const {
return fPipe[0]; }
277 Int_t Post(TSocket *s);
278 Int_t Clean(TSocket *s);
279 Int_t Flush(TSocket *s);
280 void DumpReadySock();
282 void SetLoc(
const char *loc =
"") { fLoc = loc; }
285 std::recursive_mutex fMutex;
294 class TXSemaphoreGuard {
297 TXSemaphoreGuard(TSemaphore *sem) : fSem(sem), fValid(kTRUE) {
if (!fSem || fSem->TryWait()) fValid = kFALSE; }
298 virtual ~TXSemaphoreGuard() {
if (fValid && fSem) fSem->Post(); }
300 Bool_t IsValid()
const {
return fValid; }