command.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef EQNET_COMMAND_H
00019 #define EQNET_COMMAND_H
00020
00021 #include <eq/net/node.h>
00022
00023 #include <eq/base/base.h>
00024 #include <eq/base/refPtr.h>
00025
00026 namespace eq
00027 {
00028 namespace net
00029 {
00030 struct Packet;
00031
00038 class Command
00039 {
00040 public:
00041 Packet* getPacket() { return _packet; }
00042 const Packet* getPacket() const { return _packet; }
00043
00044 template< class P > P* getPacket()
00045 { EQASSERT( _packet ); return static_cast<P*>( _packet ); }
00046 template< class P > const P* getPacket() const
00047 { EQASSERT( _packet ); return static_cast<P*>( _packet ); }
00048
00049 NodePtr getNode() const { return _node; }
00050 NodePtr getLocalNode() const { return _localNode; }
00051
00052 bool operator ! () const { return ( _packet==0 ); }
00053
00054 Packet* operator->() { EQASSERT(_packet); return _packet; }
00055 const Packet* operator->() const { EQASSERT(_packet); return _packet; }
00056
00059 bool isFree() const { return ( _refCount==0 ); }
00060 void retain() { ++_refCount; }
00061 void release()
00062 {
00063 EQASSERT( _refCount != 0 );
00064 #ifdef NDEBUG
00065 --_refCount;
00066 #else
00067 if( --_refCount == 0 )
00068 {
00069
00070
00071
00072 _node = 0;
00073 _localNode = 0;
00074 }
00075 #endif
00076 }
00078
00079 bool isValid() const { return ( _packet!=0 ); }
00080 uint64_t getAllocationSize() const { return _packetAllocSize; }
00081
00082 private:
00083 Command();
00084 ~Command();
00085 void alloc( NodePtr node, NodePtr localNode, const uint64_t size );
00086 friend class CommandCache;
00087
00088 Command& operator = ( Command& rhs );
00089 Command( const Command& from );
00090
00091 void _free();
00092
00093 NodePtr _node;
00094 NodePtr _localNode;
00095 Packet* _packet;
00096 base::a_int32_t _refCount;
00097 uint64_t _packetAllocSize;
00098 };
00099
00100 EQ_EXPORT std::ostream& operator << ( std::ostream& os, const Command& );
00101 }
00102 }
00103 #endif // EQNET_COMMAND_H