//----------------------------------------------------------------------------- // Copyright (c) 1994,1995 Southeastern Universities Research Association, // Continuous Electron Beam Accelerator Facility // // This software was developed under a United States Government license // described in the NOTICE file included as part of this distribution. // //----------------------------------------------------------------------------- // // Description: // cdevRequestObject class (abstract class) // // Author: Jie Chen & Chip Watson // // Revision History: // cdevRequestObject.h,v // Revision 1.12 1998/02/13 14:00:44 chen // add ref and deref // // Revision 1.11 1997/03/03 17:52:26 chen // add buffering mechanism to caService // // Revision 1.9 1996/11/21 17:03:17 akers // Ongoing Developement of CDEV 1.5 // // Revision 1.8 1996/03/22 16:33:26 chen // fix inline decleration // // Revision 1.7 1995/12/08 15:39:06 chen // add inline functions + deferred execution mode // // Revision 1.6 1995/10/17 15:28:00 chen // change getState and getAccess to virtual // // Revision 1.5 1995/10/03 19:34:01 chen // change public interface for system // // Revision 1.4 1995/09/19 16:10:35 chen // minor change on bit monitoring mechanism // // Revision 1.3 1995/09/18 18:21:58 chen // add long/short monitoring method // // Revision 1.2 1995/07/05 18:40:40 chen // remove system dependence on attachPtr etc // // Revision 1.1.1.1 1995/06/16 17:14:06 epics // initial import of cdev // // #ifndef _CDEV_REQUESTOBJECT_H #define _CDEV_REQUESTOBJECT_H #include #include #include #include #include #include #include #include #include class cdevExecGroup; //======================================================================= // some useful bit mask manipulation routines //======================================================================= #define NUMBITS_PER_BYTE 8 #ifdef _CDEV_NO_INLINE //======================================================================= // clear a long mask, set every bit to 0 //======================================================================= extern void cdevMaskZero (long& p); //======================================================================= // turn on a bit at position n inside the mask p //======================================================================= extern void cdevMaskSet (long n, long& p); //======================================================================= // turn off a bit at position n inside the mask p //======================================================================= extern void cdevMaskClr (long n, long& p); //======================================================================= // check whether a bit n is set or not //======================================================================= extern int cdevMaskIsSet (long n, long p); #endif class CDEV_CLASS_SPEC cdevRequestObject: public cdevIOcontext { public: //====================================================================== // Public Interface for Clients //====================================================================== static cdevRequestObject& attachRef (char *deviceName, char *msg); static cdevRequestObject* attachPtr (char *deviceName, char *msg); // PURPOSE: Create or Attach Pointer or reference to a requestObject // inside the default system // REQUIRE: deviceName != 0, msg != 0. // PROMISE: return a cdevRequestObject which may be an errorRequestObject // depending on the device and message pair static void detach (cdevRequestObject& objRef); static void detach (cdevRequestObject* objPtr); // PURPOSE: Detach from a cdevRequestObject // REQUIRE: objPtr != 0 // PROMISE: If objPtr is the last one attached to a cdevRequestObject, // the cdevRequestObject will be destroyed char *message (void) const; // PURPOSE: return message of this requestObject // REQUIRE: nothing // PROMISE: a message cdevDevice& device (void) const; // PURPOSE: return a refence a device holding this request object // REQUIRE: nothing // PROMISE: reference of a device cdevSystem& system (void) const; // PURPOSE: return a reference of a system associated with this object // REQUIRE: nothing // PROMISE: reference of a system cdevService& service (void) const; // PURPOSE: return a reference of a service associated with this object // REQUIRE: nothing // PROMISE: reference of a service virtual int getState (void); // PURPOSE: return status information, derived classes implement this // REQUIRE: nothing // PROMISE: virtual int getAccess (void); // PURPOSE: return access control information, derived classes implement this // REQUIRE: nothing // PROMISE: virtual int send (cdevData& out, cdevData& result) = 0; virtual int send (cdevData *out, cdevData& result) = 0; virtual int send (cdevData& out, cdevData* result) = 0; virtual int send (cdevData *out, cdevData* result) = 0; // PURPOSE: pure virtual functions for synchronous IO operations // REQUIRE: derived classes implement those // PROMISE: return CDEV_SUCCESS: success. See cdevErrCode.h for detail virtual int sendNoBlock (cdevData& out, cdevData& result) = 0; virtual int sendNoBlock (cdevData *out, cdevData& result) = 0; virtual int sendNoBlock (cdevData& out, cdevData* result) = 0; virtual int sendNoBlock (cdevData* out, cdevData* result) = 0; // PURPOSE: pure virtual functions for asynchronous IO operations // REQUIRE: // PROMISE: return CDEV_SUCCESS: success. See cdevErrCode.h for detail virtual int sendCallback (cdevData& out, cdevCallback& callback) = 0; virtual int sendCallback (cdevData *out, cdevCallback& callback) = 0; // PURPOSE: pure virtual functions for asynchronous IO operations with // user provided callback functions // REQUIRE: // PROMISE: return CDEV_SUCCESS: success. See cdevErrCode.h for detail virtual int setContext (cdevData& cxt); // PURPOSE: set context from a cdevData. Check longMask // tag to set the bit monitoring mask // derived class may provide different setContext function // eg. channel access requestObject will use this function // to provide right request data type. // REQUIRE: nothing // PROMISE: return 0 // for subclasss of cdevDevice use only void ref (void); // PURPOSE: Increase reference count of this requestobject by one // REQUIRE: none // PROMISE: refcount will go up by 1 void deref (void); // PURPOSE: decrease reference count of this requestobject by one // REQUIRE: none // PROMISE: refcount will go down by 1 virtual const char *className (void) const {return "cdevRequestObject";} protected: //constructors and destructors cdevRequestObject (char *device, char *msg, cdevSystem& system = cdevSystem::defaultSystem() ); cdevRequestObject (cdevDevice &device, char *msg, cdevSystem& system = cdevSystem::defaultSystem() ); virtual ~cdevRequestObject (void); // protected version of send for service layer virtual int execNoBlock (cdevData* out, cdevData* result, void* arg); virtual int execCallback (cdevData* out, cdevCallback& callback, void* arg); // protected to prevent use of multiple systems for now static cdevRequestObject& attachRef (char *deviceName, char *msg, cdevSystem& system); // PURPOSE: Create reference to a requestObject within a given system // REQUIRE: deviceName != 0, msg != 0. // PROMISE: return a cdevRequestObject which may be an errorRequestObject // depending on the device and message pair static cdevRequestObject* attachPtr (char *deviceName, char *msg, cdevSystem& system); // PURPOSE: Create pointer to a requestObject within a given system // REQUIRE: deviceName != 0, msg != 0. // PROMISE: return a cdevRequestObject or NULL if not a valid combination // following routine used only by cdevDevice, and is the real factory static cdevRequestObject* attachPtr (cdevDevice& dev, char *msg, cdevSystem& system); // PURPOSE: Create pointer to a NEW requestObject within a given system // REQUIRE: dev != 0, msg != 0. // PROMISE: return a cdevRequestObject or NULL if not a valid combination virtual int bitValuesChanged (long value, long mask); // PURPOSE: Check any bit values of 'value' changed or not according // to the mask 'mask'. Any derived classes of cdevRequestObject // may use this routine to monitor any set of bits in a long // integer value. // REQUIRE: none // PROMISE: if any bit values changed, return 1, else return 0 // assign device to the object void device (cdevDevice *dev); // assign service to the object void service (cdevService *service); // internal functions for service developer who wants to support // deferred execution mode inside groups // callback will be duplicated if indeed one needs to do defferred ops int deferExecution (cdevData* out, cdevData* result); int deferExecution (cdevData* out, cdevCallback* callback); int executionMode (void); // internal functions for service developer who wants to support // buffering mechanism to improve performance // note: buffer must be derived class of cdevGroup // callback will be duplicated void bufferExecution (cdevData* out, cdevData* result, cdevGroup* buffer, void* arg); void bufferExecution (cdevData* out, cdevCallback* result, cdevGroup* buffer, void* arg); // device pointer cdevDevice *device_; // system reference cdevSystem& system_; // device name char *deviceName_; // message name char *message_; // service pointer cdevService *service_; // flag to tell whether to unregister from a device on delete int unregOn_; // bit monitoring mask long longMask_; private: // copy and assignment cdevRequestObject& operator = (const cdevRequestObject& object); cdevRequestObject (const cdevRequestObject& object); // reference counting int refCount_; // friend class declaration friend class cdevDevice; friend class cdevSystem; friend class cdevExecGroup; }; #undef INLINE #ifndef _CDEV_NO_INLINE #define INLINE inline #include "cdevRequestObject.i" #else #define INLINE #endif #endif