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
00041 class Command
00042 {
00043 public:
00044 Packet* getPacket() { return _packet; }
00045 const Packet* getPacket() const { return _packet; }
00046
00047 template< class P > P* getPacket()
00048 { EQASSERT( _packet ); return reinterpret_cast<P*>( _packet ); }
00049 template< class P > const P* getPacket() const
00050 { EQASSERT( _packet ); return reinterpret_cast<P*>( _packet ); }
00051
00052 NodePtr getNode() const { return _node; }
00053 NodePtr getLocalNode() const { return _localNode; }
00054
00055 bool operator ! () const { return ( _packet==0 ); }
00056
00057 Packet* operator->() { EQASSERT(_packet); return _packet; }
00058 const Packet* operator->() const { EQASSERT(_packet); return _packet; }
00059
00062 bool isFree() const { return ( _refCount==0 ); }
00063 void retain() { ++_refCount; }
00064 void release()
00065 {
00066 EQASSERT( _refCount != 0 );
00067 #ifdef NDEBUG
00068 --_refCount;
00069 #else
00070 if( --_refCount==0 )
00071 {
00072
00073
00074
00075 _node = 0;
00076 _localNode = 0;
00077 }
00078 #endif
00079 }
00081
00082 bool isValid() const { return ( _packet!=0 ); }
00083 uint64_t getAllocationSize() const { return _packetAllocSize; }
00084
00085 private:
00086 Command();
00087 ~Command();
00088 void alloc( NodePtr node, NodePtr localNode, const uint64_t size );
00089 friend class CommandCache;
00090
00091 Command& operator = ( Command& rhs );
00092 Command( const Command& from );
00093
00094 void _free();
00095
00096 NodePtr _node;
00097 NodePtr _localNode;
00098 Packet* _packet;
00099 base::mtLong _refCount;
00100 uint64_t _packetAllocSize;
00101 };
00102
00103 EQ_EXPORT std::ostream& operator << ( std::ostream& os, const Command& );
00104 }
00105 }
00106 #endif // EQNET_COMMAND_H