#ifndef XRC_CONNMGR_H
#define XRC_CONNMGR_H
/******************************************************************************/
/* */
/* X r d C l i e n t C o n n M g r . h h */
/* */
/* Author: Fabrizio Furano (INFN Padova, 2004) */
/* Adapted from TXNetFile (root.cern.ch) originally done by */
/* Alvise Dorigo, Fabrizio Furano */
/* INFN Padova, 2003 */
/* */
/* 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. */
/******************************************************************************/
//////////////////////////////////////////////////////////////////////////
// //
// The connection manager maps multiple logical connections on a single //
// physical connection. //
// There is one and only one logical connection per client //
// and one and only one physical connection per server:port. //
// Thus multiple objects withing a given application share //
// the same physical TCP channel to communicate with a server. //
// This reduces the time overhead for socket creation and reduces also //
// the server load due to handling many sockets. //
// //
//////////////////////////////////////////////////////////////////////////
#include "XrdOuc/XrdOucHash.hh"
#include "XrdSys/XrdSysPthread.hh"
#include "XrdClient/XrdClientUnsolMsg.hh"
#include "XrdClient/XrdClientPhyConnection.hh"
#include "XrdClient/XrdClientVector.hh"
class XrdClientSid;
class XrdClientLogConnection;
class XrdClientMessage;
class XrdClientThread;
// Ugly prototype to avoid warnings under solaris
//void * GarbageCollectorThread(void * arg, XrdClientThread *thr);
class XrdClientConnectionMgr: public XrdClientAbsUnsolMsgHandler,
XrdClientUnsolMsgSender {
private:
XrdClientSid *fSidManager;
XrdClientVector fLogVec;
XrdOucHash fPhyHash;
// To try not to reuse too much the same array ids
int fLastLogIdUsed;
// Phyconns are inserted here when they have to be destroyed later
// All the phyconns here are disconnected.
XrdClientVector fPhyTrash;
// To arbitrate between multiple threads trying to connect to the same server.
// The first has to connect, all the others have to wait for the completion
// The meaning of this is: if there is a condvar associated to the hostname key,
// then wait for it to be signalled before deciding what to do
class CndVarInfo {
public:
XrdSysCondVar cv;
int cnt;
CndVarInfo(): cv(0), cnt(0) {};
};
XrdOucHash fConnectingCondVars;
XrdSysRecMutex fMutex; // mutex used to protect local variables
// of this and TXLogConnection, TXPhyConnection
// classes; not used to protect i/o streams
XrdClientThread *fGarbageColl;
friend void * GarbageCollectorThread(void *, XrdClientThread *thr);
UnsolRespProcResult
ProcessUnsolicitedMsg(XrdClientUnsolMsgSender *sender,
XrdClientMessage *unsolmsg);
public:
XrdClientConnectionMgr();
virtual ~XrdClientConnectionMgr();
bool BootUp();
bool ShutDown();
int Connect(XrdClientUrlInfo RemoteAddress);
void Disconnect(int LogConnectionID, bool ForcePhysicalDisc);
void GarbageCollect();
XrdClientLogConnection
*GetConnection(int LogConnectionID);
XrdClientPhyConnection *GetPhyConnection(XrdClientUrlInfo server);
XrdClientMessage*
ReadMsg(int LogConnectionID);
int ReadRaw(int LogConnectionID, void *buffer, int BufferLength);
int WriteRaw(int LogConnectionID, const void *buffer,
int BufferLength, int substreamid);
XrdClientSid *SidManager() { return fSidManager; }
friend int DisconnectElapsedPhyConn(const char *,
XrdClientPhyConnection *, void *);
friend int DestroyPhyConn(const char *,
XrdClientPhyConnection *, void *);
};
#endif