///////////////////////////////////////////////////////////////////////////////
//
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
//
///////////////////////////////////////////////////////////////////////////////

#ifndef REQQUEUE_H_
#define REQQUEUE_H_

#include <list>
using namespace std;

#include "lock.h"
#include "monitor.h"
#include "config.h"

#define MAX_REVIVE_QUEUE_SIZE 10000

class CReqResource
{
 protected:
    int            eyecatcher_;      // Debuggging aid -- leave as first
                                     // member variable of the class
public:
    CReqResource();
    virtual ~CReqResource();

    typedef enum ResStat {UnAvailable, Acquired, Busy, NotUp} ResourceStatus_t;

    virtual ResourceStatus_t acquireResource( long requestId ) = 0;
    virtual void releaseResource() = 0;
};

class CReqResourceProc: public CReqResource
{
public:
    CReqResourceProc(int nid, int pid, const char *name, Verifier_t verifier );
    virtual ~CReqResourceProc();

    ResourceStatus_t acquireResource( long requestId );
    void releaseResource();
    CProcess* getProcess();

private:
    CReqResourceProc();
    int       nid_;
    int       pid_;
    Verifier_t verifier_;
    string     processName_;
};

class CReqResourceConfig: public CReqResource
{
public:
    CReqResourceConfig(CConfigGroup *config);
    virtual ~CReqResourceConfig();

    ResourceStatus_t acquireResource( long requestId );
    void releaseResource();

private:
    CReqResourceConfig();
// tbd: should be CConfigGroup or CConfigKey?
    CConfigGroup* config_;
};

class CRequest
{
 protected:
    int            eyecatcher_;      // Debuggging aid -- leave as first
                                     // member variable of the class
                                     // (see comment block at end of file for 
                                     //  assignments).
 public:
    CRequest();
    virtual ~CRequest();

    virtual void performRequest() = 0;
    const char *requestString() { return( requestString_.c_str() ); }

    virtual bool isExclusive() { return concurrent_ == false; }
    virtual bool isSyncDependent() = 0;
    virtual bool isShutdown() = 0;
    virtual bool prepare() { return true; }
    virtual bool takeOwnership( bool & ownershipFailure ) = 0;
    virtual void giveupOwnership() = 0;
    virtual void errorReply( int rc ) = 0;
    void evalReqPerformance( void );
    struct timespec startTime () { return reqStart_; }

    void setConcurrent(bool reqType) { concurrent_ = reqType; }

    void addResource(CReqResource *);

    void setId(long id) { id_ = id; }
    long getId() { return id_; }

#ifdef NAMESERVER_PROCESS
    static void monreply(struct message_def *msg, int sockFd, int *error = NULL);
#else
    static void lioreply(struct message_def *msg, int Pid, int *error = NULL);
#endif

    void timeDiff ( struct timespec t1, struct timespec t2,
                    struct timespec &tDiff );

    typedef enum ReqStatus {OkToExec, WaitToExec, Failed} ReqStatus_t;
    ReqStatus_t okToExecute();
    virtual void validateObj( void ) = 0;

    int getExecTimeMax() { return execTimeMax_; }

    typedef enum ReqPriority {Normal, High} ReqPriority_t;
    ReqPriority_t getPriority() { return priority_; }
    void setPriority(ReqPriority_t priority) { priority_ = priority; }

    virtual void populateRequestString( void ) = 0;

private:
    bool concurrent_;  // true if request can be executed concurrently
                       // with others.

    struct timespec reqArrival_; 
    struct timespec reqStart_; 

protected:
    long id_;
    int numResources_;
    static const int MAX_RESOURCES=5;
    CReqResource * resources_[MAX_RESOURCES];
    string requestString_;
    int execTimeMax_; // maximum execution time allowed 

    ReqPriority_t priority_;
};

class CExternalReq: public CRequest
{
public:
    typedef enum
    {
        AttachStartupMsg,
        StartupMsg,
        NonStartupMsg,
        ShutdownWork
    } reqQueueMsg_t;

    CExternalReq( reqQueueMsg_t msgType
                , int pid
                , struct message_def *msg)
        : msgType_(msgType)
        , nid_(-1)
        , pid_(pid)
        , verifier_(-1)
        , sockFd_(-1)
        , msg_(msg)
        , reqType_(msg?msg->u.request.type:ReqType_Invalid) {}
    CExternalReq( reqQueueMsg_t msgType
                , int nid
                , int pid
                , int sockFd
                , struct message_def *msg)
        : msgType_(msgType)
        , nid_(nid)
        , pid_(pid)
        , verifier_(-1)
        , sockFd_(sockFd)
        , msg_(msg)
        , reqType_(msg?msg->u.request.type:ReqType_Invalid) {}

    virtual ~CExternalReq() {}

    virtual void performRequest() = 0;
    bool isSyncDependent() { return false; }
    bool isShutdown() { return msgType_ == ShutdownWork; }
    bool takeOwnership( bool & ownershipFailure );
    void giveupOwnership();
    bool setResourceNeeds();
    void errorReply( int rc );
    void validateObj( void );

private:
    void errorOpenReq(struct message_def * msg);

protected:
    reqQueueMsg_t msgType_;
    int nid_;
    int pid_;
    Verifier_t verifier_;
    int sockFd_;
    string processName_;
    struct message_def * msg_;
    // Request save data
    REQTYPE reqType_;
};

#ifndef NAMESERVER_PROCESS
class CExtAttachStartupReq: public CExternalReq
{
public:
    CExtAttachStartupReq (reqQueueMsg_t msgType, int pid,
                          struct message_def *msg );
    virtual ~CExtAttachStartupReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtDumpReq: public CExternalReq
{
public:
    CExtDumpReq (reqQueueMsg_t msgType, int pid,
                 struct message_def *msg );
    virtual ~CExtDumpReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtNodeNameReq: public CExternalReq
{
public:
    CExtNodeNameReq (reqQueueMsg_t msgType, int pid,
                 struct message_def *msg );
    virtual ~CExtNodeNameReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtEventReq: public CExternalReq
{
public:
    CExtEventReq (reqQueueMsg_t msgType, int pid,
                  struct message_def *msg );
    virtual ~CExtEventReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtExitReq: public CExternalReq
{
public:
    CExtExitReq (reqQueueMsg_t msgType, int pid,
                 struct message_def *msg );
    virtual ~CExtExitReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtGetReq: public CExternalReq
{
public:
    CExtGetReq (reqQueueMsg_t msgType, int pid,
                struct message_def *msg );
    virtual ~CExtGetReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

class CExtKillReq: public CExternalReq
{
public:
    CExtKillReq (reqQueueMsg_t msgType, int pid,
                 struct message_def *msg );
    virtual ~CExtKillReq();

    void performRequest();

private:
    void populateRequestString( void );
    void Kill( CProcess *process );
};

#ifndef NAMESERVER_PROCESS
class CExtMonStatsReq: public CExternalReq
{
public:
    CExtMonStatsReq (reqQueueMsg_t msgType, int pid,
                     struct message_def *msg );
    virtual ~CExtMonStatsReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtMountReq: public CExternalReq
{
public:
    CExtMountReq (reqQueueMsg_t msgType, int pid,
                  struct message_def *msg );
    virtual ~CExtMountReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifdef NAMESERVER_PROCESS
class CExtNameServerStartNsReq: public CExternalReq
{
public:
    CExtNameServerStartNsReq (reqQueueMsg_t msgType,
                              int nid, int pid, int sockFd,
                              struct message_def *msg );
    virtual ~CExtNameServerStartNsReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifdef NAMESERVER_PROCESS
class CExtNameServerStopNsReq: public CExternalReq
{
public:
    CExtNameServerStopNsReq (reqQueueMsg_t msgType,
                             int nid, int pid, int sockFd,
                             struct message_def *msg );
    virtual ~CExtNameServerStopNsReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifdef NAMESERVER_PROCESS
class CExtNewProcNsReq: public CExternalReq
{
public:
    CExtNewProcNsReq (reqQueueMsg_t msgType,
                      int nid, int pid, int sockFd,
                      struct message_def *msg );
    virtual ~CExtNewProcNsReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtNewProcReq: public CExternalReq
{
public:
    CExtNewProcReq (reqQueueMsg_t msgType,
                    int nid, int pid, int sockFd,
                    struct message_def *msg );
    virtual ~CExtNewProcReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtNodeAddReq: public CExternalReq
{
public:
    CExtNodeAddReq (reqQueueMsg_t msgType, int pid,
                     struct message_def *msg );
    virtual ~CExtNodeAddReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtNodeDeleteReq: public CExternalReq
{
public:
    CExtNodeDeleteReq (reqQueueMsg_t msgType, int pid,
                     struct message_def *msg );
    virtual ~CExtNodeDeleteReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtNodeDownReq: public CExternalReq
{
public:
    CExtNodeDownReq (reqQueueMsg_t msgType, int pid,
                     struct message_def *msg );
    virtual ~CExtNodeDownReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifdef NAMESERVER_PROCESS
class CExtNodeDownNsReq: public CExternalReq
{
public:
    CExtNodeDownNsReq( reqQueueMsg_t msgType
                     , int pid
                     , int sockFd
                     , struct message_def *msg );
    virtual ~CExtNodeDownNsReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtNameServerAddReq: public CExternalReq
{
public:
    CExtNameServerAddReq (reqQueueMsg_t msgType, int pid,
                          struct message_def *msg );
    virtual ~CExtNameServerAddReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtNameServerDeleteReq: public CExternalReq
{
public:
    CExtNameServerDeleteReq (reqQueueMsg_t msgType, int pid,
                             struct message_def *msg );
    virtual ~CExtNameServerDeleteReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtNameServerStartReq: public CExternalReq
{
public:
    CExtNameServerStartReq (reqQueueMsg_t msgType, int pid,
                            struct message_def *msg );
    virtual ~CExtNameServerStartReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtNameServerStopReq: public CExternalReq
{
public:
    CExtNameServerStopReq (reqQueueMsg_t msgType, int pid,
                           struct message_def *msg );
    virtual ~CExtNameServerStopReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtNodeInfoReq: public CExternalReq
{
public:
    CExtNodeInfoReq (reqQueueMsg_t msgType, int pid,
                     struct message_def *msg );
    virtual ~CExtNodeInfoReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtPNodeInfoReq: public CExternalReq
{
public:
    CExtPNodeInfoReq (reqQueueMsg_t msgType, int pid,
                      struct message_def *msg );
    virtual ~CExtPNodeInfoReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtNodeUpReq: public CExternalReq
{
public:
    CExtNodeUpReq (reqQueueMsg_t msgType, int pid,
                   struct message_def *msg );
    virtual ~CExtNodeUpReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtNotifyReq: public CExternalReq
{
public:
    CExtNotifyReq (reqQueueMsg_t msgType, int pid,
                   struct message_def *msg );
    virtual ~CExtNotifyReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

class CExtNullReq: public CExternalReq
{
public:
    CExtNullReq (reqQueueMsg_t msgType,
                 int nid, int pid, int sockFd,
                 struct message_def *msg );
    virtual ~CExtNullReq();

    void performRequest() {}

private:
    void populateRequestString( void ){}
};

#ifndef NAMESERVER_PROCESS
class CExtOpenReq: public CExternalReq
{
public:
    CExtOpenReq(reqQueueMsg_t msgType, int pid, struct message_def *msg);
    virtual ~CExtOpenReq();

    bool prepare();
    void performRequest();
    bool prepareRequest();
    void errorReply( int rc );

private:
    bool prepared_;
    CExtOpenReq();
    void populateRequestString( void );
};
#endif

class CExtProcInfoBase: public CExternalReq
{
 public:
    CExtProcInfoBase (reqQueueMsg_t msgType,
                      int nid, int pid, int sockFd,
                      struct message_def *msg )
        : CExternalReq(msgType, nid, pid, sockFd, msg) {}
    virtual ~CExtProcInfoBase() {}

 protected:
    void ProcessInfo_CopyPairData( CProcess *process
                                 , ProcessInfoState &procState );
    void ProcessInfo_CopyData(CProcess *process, ProcessInfoState &procState);

    CProcess * ProcessInfo_GetProcess (int &nid, bool getDataForAllNodes);
    int ProcessInfo_BuildReply(CProcess *process,
                               struct message_def * msg,
                               PROCESSTYPE type,
                               bool getDataForAllNodes,
                               char *pattern);
};

class CExtProcInfoReq: public CExtProcInfoBase
{
public:
    CExtProcInfoReq (reqQueueMsg_t msgType,
                     int nid, int pid, int sockFd,
                     struct message_def *msg );
    virtual ~CExtProcInfoReq();

    void performRequest();

private:
    void populateRequestString( void );
};

class CExtProcInfoContReq: public CExtProcInfoBase
{
public:
    CExtProcInfoContReq (reqQueueMsg_t msgType,
                         int nid, int pid, int sockFd,
                         struct message_def *msg );
    virtual ~CExtProcInfoContReq();

    void performRequest();

private:
    void populateRequestString( void );
};

#ifdef NAMESERVER_PROCESS

class CExtProcInfoNsReq: public CExternalReq
{
public:
    CExtProcInfoNsReq( reqQueueMsg_t msgType,
                       int nid, int pid, int sockFd,
                       struct message_def *msg );
    virtual ~CExtProcInfoNsReq();

    void performRequest();

private:
    void copyInfo(CProcess *process, ProcessInfoNs_reply_def &procInfo);
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtSetReq: public CExternalReq
{
public:
    CExtSetReq (reqQueueMsg_t msgType, int pid,
                struct message_def *msg );
    virtual ~CExtSetReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtShutdownReq: public CExternalReq
{
public:
    CExtShutdownReq (reqQueueMsg_t msgType, int pid,
                     struct message_def *msg );
    virtual ~CExtShutdownReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifdef NAMESERVER_PROCESS
class CExtShutdownNsReq: public CExternalReq
{
public:
    CExtShutdownNsReq (reqQueueMsg_t msgType,
                       int nid, int pid, int sockFd,
                       struct message_def *msg );
    virtual ~CExtShutdownNsReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtStartupReq: public CExternalReq
{
public:
    CExtStartupReq (reqQueueMsg_t msgType, int pid,
                    struct message_def *msg );
    virtual ~CExtStartupReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtTmLeaderReq: public CExternalReq
{
public:
    CExtTmLeaderReq (reqQueueMsg_t msgType, int pid,
                     struct message_def *msg );
    virtual ~CExtTmLeaderReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtTmReadyReq: public CExternalReq
{
public:
    CExtTmReadyReq(reqQueueMsg_t msgType, int pid,
                   struct message_def *msg );
    virtual ~CExtTmReadyReq();

    void performRequest();

private:
    void populateRequestString( void );

    int nid_;
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtTmSyncReq: public CExternalReq
{
public:
    CExtTmSyncReq (reqQueueMsg_t msgType, int pid,
                   struct message_def *msg );
    virtual ~CExtTmSyncReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CExtZoneInfoReq: public CExternalReq
{
public:
    CExtZoneInfoReq (reqQueueMsg_t msgType, int pid,
                     struct message_def *msg );
    virtual ~CExtZoneInfoReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

class CInternalReq: public CRequest
{
public:
    CInternalReq();
    virtual ~CInternalReq();

    void performRequest();
    bool isSyncDependent() { return true; }
    bool isShutdown() { return false; }
    bool takeOwnership( bool &  ) { return true; }
    void giveupOwnership();
    void errorReply( int rc );
    void validateObj( void );

    void populateRequestString( void );

    void setSeqNum( unsigned long long seqNum ) { seqNum_ = seqNum; }
    unsigned long long getSeqNum() { return seqNum_; }
    int GetReviveFlag() { return reviveFlag_; }
    void SetReviveFlag(int value) { reviveFlag_ = value; }

private:

    unsigned long long seqNum_;
    int reviveFlag_; // set if this request is needed for revive operation
};


#ifndef NAMESERVER_PROCESS
class CIntCloneProcReq: public CInternalReq
{
public:
    CIntCloneProcReq( bool backup, bool unhooked, bool eventMessages, bool systemMessages, int nid, PROCESSTYPE type, int priority, int parentNid, int parentPid, int parentVerifier, int osPid, int verifier, pid_t priorPid, int persistentRetries, int  argc, struct timespec creationTime, strId_t pathStrId, strId_t ldpathStrId, strId_t programStrId, int nameLen, int portLen, int infileLen, int outfileLen, int argvLen, const char * stringData, int origPNidNs);
    virtual ~CIntCloneProcReq();

    void performRequest();

private:
    void populateRequestString( void );

    bool backup_;
    bool unhooked_;
    bool eventMessages_;
    bool systemMessages_;
    int nid_;
    PROCESSTYPE type_;
    int priority_;
    int parentNid_;
    int parentPid_;
    int parentVerifier_;
    int osPid_;
    int verifier_; 
    pid_t priorPid_;
    int persistentRetries_;
    int  argc_;
    struct timespec creationTime_;
    strId_t pathStrId_;
    strId_t ldpathStrId_;
    strId_t programStrId_;
    int  nameLen_;
    int  portLen_;
    int  infileLen_;
    int  outfileLen_;
    int  argvLen_;
    char * stringData_;
    int origPNidNs_;
};
#endif

#ifdef NAMESERVER_PROCESS
class CIntCloneProcNsReq: public CInternalReq
{
public:
    CIntCloneProcNsReq( bool backup
                      , bool unhooked
                      , bool eventMessages
                      , bool systemMessages
                      , int nid
                      , PROCESSTYPE type
                      , int priority
                      , int parentNid
                      , int parentPid
                      , int parentVerifier
                      , int osPid
                      , int verifier
                      , pid_t priorPid
                      , int persistentRetries
                      , int argc
                      , struct timespec creationTime
                      , int pathLen
                      , int ldpathLen
                      , int programLen
                      , int nameLen
                      , int portLen
                      , int infileLen
                      , int outfileLen
                      , int argvLen
                      , const char * stringData
                      , int origPNidNs);
//    CIntCloneProcNsReq( bool backup, bool unhooked, bool eventMessages, bool systemMessages, int nid, PROCESSTYPE type, int priority, int parentNid, int parentPid, int parentVerifier, int osPid, int verifier, pid_t priorPid, int persistentRetries, int  argc, struct timespec creationTime, strId_t pathStrId, strId_t ldpathStrId, strId_t programStrId, int nameLen, int portLen, int infileLen, int outfileLen, int argvLen, const char * stringData, int origPNidNs);
    virtual ~CIntCloneProcNsReq();

    void performRequest();

private:
    void populateRequestString( void );

    bool backup_;
    bool unhooked_;
    bool eventMessages_;
    bool systemMessages_;
    int nid_;
    PROCESSTYPE type_;
    int priority_;
    int parentNid_;
    int parentPid_;
    int parentVerifier_;
    int osPid_;
    int verifier_; 
    pid_t priorPid_;
    int persistentRetries_;
    int  argc_;
    struct timespec creationTime_;
    int  pathLen_;
    int  ldpathLen_;
    int  programLen_;
//    strId_t pathStrId_;
//    strId_t ldpathStrId_;
//    strId_t programStrId_;
    int  nameLen_;
    int  portLen_;
    int  infileLen_;
    int  outfileLen_;
    int  argvLen_;
    char * stringData_;
    int origPNidNs_;
};
#endif

#ifndef NAMESERVER_PROCESS
class CIntDeviceReq: public CInternalReq
{
public:
    CIntDeviceReq( char *ldevName );
    virtual ~CIntDeviceReq();

    void performRequest();

private:
    void populateRequestString( void );

    char ldevName_[MAX_KEY_NAME];   // Logical device name
};
#endif

#ifndef NAMESERVER_PROCESS
class CIntExitReq: public CInternalReq
{
public:
    CIntExitReq();
    virtual ~CIntExitReq();

    void prepRequest( struct exit_def *exitDef );
    void performRequest();

private:
    void populateRequestString( void );

    int nid_;
    int pid_;
    Verifier_t verifier_;
    bool abended_;
    char name_[MAX_PROCESS_NAME];
};
#endif

#ifdef NAMESERVER_PROCESS
class CIntExitNsReq: public CInternalReq
{
public:
    CIntExitNsReq();
    virtual ~CIntExitNsReq();

    void prepRequest( struct exit_ns_def *exitDef );
    void performRequest();

private:
    void populateRequestString( void );

    int nid_;
    int pid_;
    Verifier_t verifier_;
    bool abended_;
    char name_[MAX_PROCESS_NAME];
    struct message_def *msg_;
    int  sockFd_;
    int  origPNid_;
};
#endif

#ifdef NAMESERVER_PROCESS
class CExtDelProcessNsReq: public CExternalReq
{
public:
    CExtDelProcessNsReq (reqQueueMsg_t msgType,
                         int nid, int pid, int sockFd,
                         struct message_def *msg );
    virtual ~CExtDelProcessNsReq();

    void performRequest();

private:
    void populateRequestString( void );
};
#endif

#ifndef NAMESERVER_PROCESS
class CIntIoDataReq: public CInternalReq
{
public:
    CIntIoDataReq( ioData_t *ioData );
    virtual ~CIntIoDataReq();

    void performRequest();

private:
    void populateRequestString( void );

    int nid_;
    int pid_;
    Verifier_t verifier_;
    StdIoType ioType_;
    int  length_;                     // Length in bytes of Data buffer used
    char data_[MAX_SYNC_DATA];
};
#endif

#ifndef NAMESERVER_PROCESS
class CIntKillReq: public CInternalReq
{
public:
    CIntKillReq( struct kill_def *killDef );
    virtual ~CIntKillReq();

    void performRequest();

private:
    void populateRequestString( void );

    int nid_;
    int pid_;
    Verifier_t verifier_;
    bool abort_;
};
#endif

#ifndef NAMESERVER_PROCESS
class CIntNewProcReq: public CInternalReq
{
public:
    CIntNewProcReq( int nid
                  , PROCESSTYPE type
                  , int priority
                  , int backup
                  , int parentNid
                  , int parentPid
                  , Verifier_t parentVerifier
                  , int pairParentNid
                  , int pairParentPid
                  , Verifier_t pairParentVerifier
                  , int argc
                  , bool unhooked
                  , void *reqTag
                  , strId_t pathStrId
                  , strId_t ldpathStrId
                  , strId_t programStrId
                  , int nameLen
                  , int infileLen
                  , int outfileLen
                  , int argvLen
                  , const char* stringData );
    virtual ~CIntNewProcReq ( );

    void performRequest();

private:
    void populateRequestString( void );

    int nid_;
    PROCESSTYPE type_;
    int priority_;
    int backup_;
    int parentNid_;
    int parentPid_;
    Verifier_t parentVerifier_;
    int pairParentNid_;
    int pairParentPid_;
    Verifier_t pairParentVerifier_;
    int argc_;
    bool unhooked_;
    void *reqTag_;
    strId_t pathStrId_;
    strId_t ldpathStrId_;
    strId_t programStrId_;
    int nameLen_;
    int infileLen_;
    int outfileLen_;
    int argvLen_;
    char* stringData_;
};
#endif

#ifdef NAMESERVER_PROCESS
class CIntNewProcNsReq: public CInternalReq
{
public:
    CIntNewProcNsReq( int nid
                    , int pid
                    , Verifier_t verifier
                    , PROCESSTYPE type
                    , int priority
                    , int backup
                    , int parentNid
                    , int parentPid
                    , Verifier_t parentVerifier
                    , int pairParentNid
                    , int pairParentPid
                    , Verifier_t pairParentVerifier
                    , int argc
                    , bool unhooked
                    , void* reqTag
                    , int pathLen
                    , int ldpathLen
                    , int programLen
                    , int nameLen
                    , int infileLen
                    , int outfileLen
                    , int argvLen
                    , const char* stringData );
    virtual ~CIntNewProcNsReq ( );

    void performRequest();

private:
    void populateRequestString( void );

    int nid_;
    int pid_;
    Verifier_t verifier_;
    PROCESSTYPE type_;
    int priority_;
    int backup_;
    int parentNid_;
    int parentPid_;
    Verifier_t parentVerifier_;
    int pairParentNid_;
    int pairParentPid_;
    Verifier_t pairParentVerifier_;
    int argc_;
    bool unhooked_;
    void *reqTag_;
    int pathLen_;
    int ldpathLen_;
    int programLen_;
    int nameLen_;
    int infileLen_;
    int outfileLen_;
    int argvLen_;
    char* stringData_;
};
#endif

class CIntNotifyReq: public CInternalReq
{
public:
    CIntNotifyReq( struct notify_def *notifyDef );
    virtual ~CIntNotifyReq( );

    void performRequest();

private:
    void populateRequestString( void );

    int nid_;
    int pid_;
    Verifier_t verifier_;
    bool canceled_;
    int targetNid_;
    int targetPid_;
    Verifier_t targetVerifier_;
    _TM_Txid_External transId_;
};


class CIntOpenReq: public CInternalReq
{
public:
    CIntOpenReq ( struct open_def *openDef  );
    virtual ~CIntOpenReq ( );

    void performRequest();

private:
    void populateRequestString( void );

    int openerNid_;
    int openerPid_;
    Verifier_t openerVerifier_;
    int openedNid_;
    int openedPid_;
    Verifier_t openedVerifier_;
};


class CIntProcInitReq: public CInternalReq
{
public:
    CIntProcInitReq ( struct process_init_def *procInitDef  );
    virtual ~CIntProcInitReq ( );

    void performRequest();

private:
    void populateRequestString( void );

    int nid_;
    int pid_;
    Verifier_t verifier_;
    STATE state_;
    int result_;
    CProcess *process_;
    char name_[MAX_PROCESS_NAME];
};

class CIntSetReq: public CInternalReq
{
public:
    CIntSetReq ( ConfigType type, const char *group, const char *key,
                 const char *value  );
    virtual ~CIntSetReq ( );

    void performRequest();

private:
    void populateRequestString( void );

    ConfigType type_;
    char group_[MAX_KEY_NAME];
    char key_[MAX_KEY_NAME];
    char value_[MAX_VALUE_SIZE_INT];
};

#ifndef NAMESERVER_PROCESS
class CIntStdInReq: public CInternalReq
{
public:
    CIntStdInReq( struct stdin_req_def *stdin_req );
    virtual ~CIntStdInReq();

    void performRequest();

private:
    void populateRequestString( void );

    int nid_;
    int pid_;
    Verifier_t verifier_;
    StdinReqType reqType_;
    int supplierNid_;       // Node id of process supplying stdin data
    int supplierPid_;       // Process id of process to supplying stdin data
};
#endif

class CIntUniqStrReq: public CInternalReq
{
public:
    CIntUniqStrReq ( int nid, int id, const char *value  );
    virtual ~CIntUniqStrReq ( );

    void performRequest();

private:
    void populateRequestString( void );

    int nid_;
    int id_;
    char value_[MAX_VALUE_SIZE_INT];
};


class CIntChildDeathReq: public CInternalReq
{
 public:
    CIntChildDeathReq ( pid_t pid );
    virtual ~CIntChildDeathReq ( );

    void performRequest();

 private:
    void populateRequestString( void );

    pid_t pid_;
    CProcess * process_;
};

class CIntAttachedDeathReq: public CInternalReq
{
 public:
    CIntAttachedDeathReq ( pid_t pid );
    virtual ~CIntAttachedDeathReq ( );

    void performRequest();

 private:
    void populateRequestString( void );

    pid_t pid_;
};

class CIntShutdownReq: public CInternalReq
{
public:
    CIntShutdownReq( int level );
    virtual ~CIntShutdownReq();

    void performRequest();

private:
    void populateRequestString( void );

    int level_;
};

class CIntNameServerAddReq: public CInternalReq
{
public:
    CIntNameServerAddReq( int req_nid
                        , int req_pid
                        , Verifier_t req_verifier
                        , char *nodeName
                        );
    virtual ~CIntNameServerAddReq();

    void performRequest();

private:
    void populateRequestString( void );

    int req_nid_;
    int req_pid_;
    Verifier_t req_verifier_;
    char nodeName_[MPI_MAX_PROCESSOR_NAME];
};

class CIntNameServerDeleteReq: public CInternalReq
{
public:
    CIntNameServerDeleteReq( int req_nid
                           , int req_pid
                           , Verifier_t req_verifier
                           , const char *nodeName );
    virtual ~CIntNameServerDeleteReq();

    void performRequest();

private:
    void populateRequestString( void );

    int req_nid_;
    int req_pid_;
    Verifier_t req_verifier_;
    char nodeName_[MPI_MAX_PROCESSOR_NAME];
};

class CIntNodeNameReq: public CInternalReq
{
public:
    CIntNodeNameReq( int req_nid
                   , int req_pid
                   , Verifier_t req_verifier
                   , const char *current_name
                   , const char *new_name );
    virtual ~CIntNodeNameReq();

    void performRequest();

private:
    void populateRequestString( void );

    int req_nid_;
    int req_pid_;
    Verifier_t req_verifier_;
    string current_name_;
    string new_name_;
};

class CIntNodeAddReq: public CInternalReq
{
public:
    CIntNodeAddReq( int req_nid
                  , int req_pid
                  , Verifier_t req_verifier
                  , char *nodeName
                  , int  firstCore
                  , int  lastCore
                  , int  processors
                  , int  roles
                  );
    virtual ~CIntNodeAddReq();

    void performRequest();

private:
    void populateRequestString( void );

    int req_nid_;
    int req_pid_;
    Verifier_t req_verifier_;
    char nodeName_[MPI_MAX_PROCESSOR_NAME];
    int  first_core_;
    int  last_core_;
    int  processors_;
    int  roles_;
};

class CIntNodeDeleteReq: public CInternalReq
{
public:
    CIntNodeDeleteReq( int req_nid
                     , int req_pid
                     , Verifier_t req_verifier
                     , int pnid );
    virtual ~CIntNodeDeleteReq();

    void performRequest();

private:
    void populateRequestString( void );

    int req_nid_;
    int req_pid_;
    Verifier_t req_verifier_;
    int  pnid_;
};

class CIntDownReq: public CInternalReq
{
public:
    CIntDownReq( int pnid );
    virtual ~CIntDownReq();

    void performRequest();

private:
    void populateRequestString( void );

    int pnid_;
};

class CIntSoftNodeDownReq: public CInternalReq
{
public:
    CIntSoftNodeDownReq( int pnid );
    virtual ~CIntSoftNodeDownReq();

    void performRequest();

private:
    void populateRequestString( void );

    int pnid_;
};

class CIntSoftNodeUpReq: public CInternalReq
{
public:
    CIntSoftNodeUpReq( int pnid );
    virtual ~CIntSoftNodeUpReq();

    void performRequest();

private:
    void populateRequestString( void );

    int pnid_;
};

class CIntUpReq: public CInternalReq
{
public:
    CIntUpReq( int pnid, char *node_name, int merge_lead );
    virtual ~CIntUpReq();

    void performRequest();

private:
    void populateRequestString( void );

    string nodeName_;
    int mergeLead_;
    int pnid_;
};

class CIntActivateSpareReq: public CInternalReq
{
public:
    CIntActivateSpareReq(CNode *spareNode, CNode *downNode, bool checkHealth);
    virtual ~CIntActivateSpareReq();

    void performRequest();

private:
    void populateRequestString( void );

    CNode *spareNode_;
    CNode *downNode_;
    bool   checkHealth_;
};

class CIntReviveReq: public CInternalReq
{
public:
    CIntReviveReq();
    virtual ~CIntReviveReq();

    void performRequest();

private:
    void populateRequestString( void );
};

class CIntSnapshotReq: public CInternalReq
{
public:
    CIntSnapshotReq(unsigned long long seqNum);
    virtual ~CIntSnapshotReq();

    void performRequest();

    void setSeqNum(unsigned long long seqNum) { seqNum_ = seqNum; }
    unsigned long long getSeqNum() { return seqNum_; }

private:
    void populateRequestString( void );

    unsigned long long seqNum_;
};

class CQuiesceReq: public CInternalReq
{
public:
    CQuiesceReq();
    virtual ~CQuiesceReq();

    void performRequest();

private:
    void populateRequestString( void );
};

class CPostQuiesceReq: public CInternalReq
{
public:
    CPostQuiesceReq();
    virtual ~CPostQuiesceReq();

    void performRequest();

private:
    void populateRequestString( void );
};

#ifndef NAMESERVER_PROCESS
class CIntCreatePrimitiveReq: public CInternalReq
{
public:
    CIntCreatePrimitiveReq( int pnid );
    virtual ~CIntCreatePrimitiveReq();

    void performRequest();

private:
    void populateRequestString( void );

    int pnid_;
};
#endif

#ifndef NAMESERVER_PROCESS
class CIntTmReadyReq: public CInternalReq
{
public:
    CIntTmReadyReq( int nid );
    virtual ~CIntTmReadyReq();

    void performRequest();

private:
    void populateRequestString( void );

    int nid_;
};
#endif

class CReqQueue
{
 private:
    int            eyecatcher_;      // Debuggging aid -- leave as first
                                     // member variable of the class
 public:
    CReqQueue();
    virtual ~CReqQueue();

    void enqueueReq(CExternalReq::reqQueueMsg_t msgType,
                    int nid, int pid, int sockFd,
                    struct message_def *msg);
    void enqueueCloneReq( struct clone_def *cloneDef );
#ifndef NAMESERVER_PROCESS
    void enqueueDeviceReq( char *ldevName );
#endif
#ifndef NAMESERVER_PROCESS
    void enqueueExitReq( struct exit_def *exitDef );
#else
    void enqueueExitNsReq( struct exit_ns_def *exitDef );
#endif
#ifdef NAMESERVER_PROCESS
    void enqueueDeleteReq( struct delete_def *deleteDef );
#endif
#ifndef NAMESERVER_PROCESS
    void enqueueIoDataReq( ioData_t *ioData );
    void enqueueKillReq( struct kill_def *killDef );
    void enqueueNewProcReq( struct process_def *procDef );
#endif
#ifdef NAMESERVER_PROCESS
    void enqueueNewProcNsReq( struct process_def *procDef );
#endif
#ifndef NAMESERVER_PROCESS
    void enqueueNotifyReq( struct notify_def *notifyDef );
    void enqueueOpenReq( struct open_def *openDef );
#endif
    void enqueueProcInitReq( struct process_init_def *procInitDef );
    void enqueueSetReq( struct set_def *setDef );
#ifndef NAMESERVER_PROCESS
    void enqueueStdInReq( struct stdin_req_def *stdin_req );
#endif
    void enqueueUniqStrReq( struct uniqstr_def *uniqStrDef );
#ifndef NAMESERVER_PROCESS
    void enqueueChildDeathReq ( pid_t pid );
    void enqueueAttachedDeathReq ( pid_t pid );
#endif
    void enqueueNameServerAddReq( int req_nid
                                , int req_pid
                                , Verifier_t req_verifier
                                , char *node_name );
    void enqueueNameServerDeleteReq( int req_nid
                                   , int req_pid
                                   , Verifier_t req_verifier
                                   , char *node_name );
    void enqueueNodeAddReq( int req_nid
                          , int req_pid
                          , Verifier_t req_verifier
                          , char *node_name
                          , int firstCore
                          , int lastCore
                          , int processors
                          , int roles );
    void enqueueNodeDeleteReq( int req_nid
                             , int req_pid
                             , Verifier_t req_verifier
                             , int pnid );
    void enqueueDownReq( int pnid );
    void enqueueNodeNameReq( int req_nid
                           , int req_pid
                           , Verifier_t req_verifier
                           , char *current_name
                           , char *new_name);
    void enqueueSoftNodeDownReq( int pnid );
    void enqueueSoftNodeUpReq( int pnid );
    void enqueueShutdownReq( int level );
    void enqueueActivateSpareReq( CNode *spareNode, CNode *downNode, bool checkHealth=false );
    void enqueueUpReq( int pnid, char *node_name, int merge_lead );
    void enqueueReviveReq();
    void enqueueSnapshotReq(unsigned long long seqnum);
    bool addToReqReviveQueue(CInternalReq *request);
    void processReviveRequests(unsigned long long seqNum);
#ifndef NAMESERVER_PROCESS
    void enqueueCreatePrimitiveReq( int pnid );
#endif
    void enqueueQuiesceReq();
    void enqueuePostQuiesceReq();
#ifndef NAMESERVER_PROCESS
    void enqueueTmReadyReq( int nid );
#endif
    CRequest *getRequest();
    void finishRequest(CRequest *request);
    void nudgeWorker();

    void stats();

    static void timeDiff ( struct timespec t1, struct timespec t2,
                           struct timespec &tDiff );
    bool responsive(struct timespec &curTime);

    int getExecTimeMax() { return execTimeMax_; }
    
    enum { REQ_MAX_PERFORM = 1,  // Max seconds expected for request execution
           REQ_MAX_TOTAL = 3,    // Max seconds expected for request lifetime
           REQ_MAX_DEFER = 10,   // Max seconds request can be deferred
           REQ_MAX_RESPONSIVE = 10 }; // Max seconds before request is "stuck"

    static const char *svcReqType[];
    static const char *intReqType[];

private:
    CExternalReq * prepExternalReq(CExternalReq::reqQueueMsg_t msgType,
                                   int nid, int pid, int sockFd,
                                   struct message_def *msg);
    void enqueueReq(CInternalReq *req, bool reviveOper = false);

    bool busyExclusive_;   // true if an exclusive request in progress,
                           //   false otherwise.
    int busyWorkers_;      // Count of worker threads currently 
                           //   working on requests.
    int syncDependentRequests_;

    // statistics
    int maxQueueSize_;
    int maxBusyWorkers_;
    long numRequests_;

    struct timespec mostRecentStart_;

    // locks
    CLock workerStatusLock_;

    CLock reqQueueLock_;

    typedef list<CRequest *> reqList_t;
    reqList_t reqQueue_;
    reqList_t reqDeferred_;

    CLock reqReviveQueueLock_;

    typedef list<CInternalReq *> reqListInt_t;
    reqListInt_t reqReviveQueue_;

    static const bool reqConcurrent[];
    int execTimeMax_; // maximum time allowed for the current request 

};

#endif

/* CRequest eyecatcher_ assignments:

   CInternalReq:

      RQIA   CIntAttachedDeathReq
      RQIB   CPostQuiesceReq
      RQIC   CIntChildDeathReq
      RQID   CIntDeviceReq
      RQIE   CIntExitReq
      RQIF   CIntUniqStrReq
      RQIG   CIntSnapshotReq
      RQIH   CIntShutdownReq
      RQII   CIntProcInitReq
      RQIJ   CIntNodeAddReq
      RqIK   CIntIoDataReq
      RQIK   CIntKillReq
      RQIL   CIntCloneProcReq
      RQIM   CIntActivateSpareReq
      RQIN   CIntNewProcReq
      RQIO   CIntOpenReq
      RQIP   CIntDownReq
      RQIQ   CIntUpReq
      RQIR   CIntReviveReq
      RQIS   CIntSetReq
      RqIS   CIntStdInReq
      RQIT   CIntNodeDeleteReq
      RQIU   CQuiesceReq
      RQIV   CIntTmReadyReq
      RQIW   CIntCreatePrimitiveReq
      RQIX   CIntSoftNodeDownReq
      RQIY   CIntSoftNodeUpReq
      RQIZ   CIntNodeNameReq
      RqIA   CIntNameServerAddReq
      RqIB   CIntNameServerDeleteReq

   CExternalReq:
      RQEA   CExtAttachStartupReq
      RqEA   CExtDelProcessNsReq
      RQEB   CExtDumpReq
      RQEC   CExtEventReq
      RQED   CExtExitReq
      RQEE   CExtGetReq
      RQEF   CExtKillReq
      RQEG   CExtMonStatsReq
      RQEH   CExtMountReq
      RQEI   CExtNewProcReq
      RqEB   CExtNewProcessNsReq
      RQEJ   CExtNodeDownReq
      RqEJ   CExtNodeDownNsReq
      RQEK   CExtNodeInfoReq
      RQEK   CExtPNodeInfoReq
      RQEL   CExtNodeUpReq
      RQEM   CExtNotifyReq
      RqEC   CExtNameServerAddReq
      RqED   CExtNameServerDeleteReq
      RqEE   CExtNameServerStartReq
      RqEF   CExtNameServerStopReq
      RqEG   CExtNameServerNsStartReq
      RqEH   CExtNameServerNsStopReq
      RQEN   CExtOpenReq
      RQEO   CExtProcInfoReq
      RQEP   CExtProcInfoContReq
      RQEQ   CExtSetReq
      RQER   CExtShutdownReq
      RqER   CExtShutdownNsReq
      RQES   CExtStartupReq
      RQET   CExtTmLeaderReq
      RQEV   CExtTmSyncReq
      RQEW   CExtZoneInfoReq
      RQEX   CExtNodeAddReq
      RQEY   CExtNodeDeleteReq
      RQEZ   CExtNodeNameReq
      RQE_   CExtNullReq

 */
