#ifndef __CMS_CLIENTMSG__
#define __CMS_CLIENTMSG__
/******************************************************************************/
/*                                                                            */
/*                    X r d C m s C l i e n t M s g . h h                     */
/*                                                                            */
/* (c) 2007 by the Board of Trustees of the Leland Stanford, Jr., University  */
/*                            All Rights Reserved                             */
/*   Produced by Andrew Hanushevsky for Stanford University under contract    */
/*              DE-AC02-76-SFO0515 with the Department of Energy              */
/*                                                                            */
/* 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 <http://www.gnu.org/licenses/>.        */
/*                                                                            */
/* 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.       */
/******************************************************************************/

#include "XProtocol/YProtocol.hh"

#include "XrdSys/XrdSysPthread.hh"

class  XrdOucErrInfo;
class  XrdOucBuffer;

class XrdCmsClientMsg
{
public:

static XrdCmsClientMsg *Alloc(XrdOucErrInfo *erp);

inline int       getResult() {return Result;}

inline int       ID() {return id;}

static int       Init();

static int       inQ() {return numinQ;}

       void      Lock() {Hold.Lock();}

       void      Recycle();

static int       Reply(const char *Man,XrdCms::CmsRRHdr &hdr,XrdOucBuffer *buff);

       void      UnLock() {Hold.UnLock();}

       int       Wait4Reply(int wtime) {return Hold.Wait(wtime);}

      XrdCmsClientMsg() : Hold(0) {next = 0; inwaitq = 0; Resp = 0; Result = 0;}
     ~XrdCmsClientMsg() {}

private:
static const int          MidMask = 1023;
static const int          MaxMsgs = 1024;
static const int          MidIncr = 1024;
static const int          IncMask = 0x3ffffc00;
static XrdCmsClientMsg   *RemFromWaitQ(int msgid);

static int                nextid;
static int                numinQ;

static XrdCmsClientMsg   *msgTab;
static XrdCmsClientMsg   *nextfree;
static XrdSysMutex        FreeMsgQ;

XrdCmsClientMsg          *next;
XrdSysCondVar             Hold;
int                       inwaitq;
int                       id;
XrdOucErrInfo            *Resp;
int                       Result;
};
#endif
