RemoteSCM.cpp
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:7k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* RemoteSCM.cpp -- VxDCOM Remote SCM class */
  2. /* Copyright (c) 1999 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01l,17dec01,nel  Add include symbol for diab.
  7. 01k,10dec01,dbs  diab build
  8. 01j,26jul01,dbs  use IOrpcClientChannel interface
  9. 01i,13jul01,dbs  fix use of NEW macro to operator new
  10. 01h,19aug99,aim  added TraceCall header
  11. 01g,22jul99,dbs  add re-use of remote-SCM connection
  12. 01f,16jul99,aim  fix UMR in ctor
  13. 01e,12jul99,dbs  re-instate ping code
  14. 01d,12jul99,dbs  simply update existing RemoteOxid object rather than
  15.                  creating a new one every time
  16. 01c,09jul99,dbs  implement ping functionality in SCM now
  17. 01b,09jul99,dbs  update RemoteOxid if port changes
  18. 01a,09jul99,dbs  created
  19. */
  20. #include "RemoteSCM.h"
  21. #include "RpcIfClient.h"
  22. #include "TraceCall.h"
  23. /* Include symbol for diab */
  24. extern "C" int include_vxdcom_RemoteSCM (void)
  25.     {
  26.     return 0;
  27.     }
  28. //////////////////////////////////////////////////////////////////////////
  29. //
  30. RemoteSCM::RemoteSCM ()
  31.   : m_mutex (),
  32.     m_dwRefCount (0),
  33.     m_remoteOxidTable (),
  34.     m_strb (),
  35.     m_pChannel (0),
  36.     m_setid (0),
  37.     m_pingSeqNum (1),
  38.     m_oidsToAdd (),
  39.     m_oidsToDel (),
  40.     m_tickCount (0)
  41.     {
  42.     TRACE_CALL;
  43.     }
  44. //////////////////////////////////////////////////////////////////////////
  45. //
  46. RemoteSCM::RemoteSCM (const RpcStringBinding& sb)
  47.   : m_mutex (),
  48.     m_dwRefCount (0),
  49.     m_remoteOxidTable (),
  50.     m_strb (sb),
  51.     m_pChannel (0),
  52.     m_setid (0),
  53.     m_pingSeqNum (1),
  54.     m_oidsToAdd (),
  55.     m_oidsToDel (),
  56.     m_tickCount (0)
  57.     {
  58.     TRACE_CALL;
  59.     }
  60. //////////////////////////////////////////////////////////////////////////
  61. //
  62. RemoteSCM::~RemoteSCM ()
  63.     {
  64.     TRACE_CALL;
  65.     
  66.     // Check if we have any OIDs to delete from the remote SCM's list
  67.     // of OIDs in our set...
  68.     if (m_oidsToDel.size () && m_pChannel)
  69. {
  70. unsigned short backoffFactor;
  71. #ifdef __DCC__
  72.         OID* oidsToDel = new OID [m_oidsToDel.size ()];
  73.         OID* oidsToAdd = new OID [m_oidsToAdd.size ()];
  74.         copy (m_oidsToAdd.begin (), m_oidsToAdd.end (), oidsToAdd);
  75.         copy (m_oidsToDel.begin (), m_oidsToDel.end (), oidsToDel);
  76. #else
  77.         OID* oidsToDel = m_oidsToDel.begin ();
  78.         OID* oidsToAdd = m_oidsToAdd.begin ();
  79. #endif
  80.         if (1)
  81.             {
  82.             VxCritSec cs (m_mutex);
  83.             IOXIDResolver_ComplexPing_vxproxy (m_pChannel,
  84.                                                &m_setid,
  85.                                                m_pingSeqNum,
  86.                                                0,
  87.                                                m_oidsToDel.size (),
  88.                                                oidsToAdd,
  89.                                                oidsToDel,
  90.                                                &backoffFactor);
  91.             }
  92. #ifdef __DCC__
  93.         delete oidsToAdd;
  94.         delete oidsToDel;
  95. #endif
  96. }
  97.     }
  98. //////////////////////////////////////////////////////////////////////////
  99. //
  100. void RemoteSCM::oxidBindingUpdate
  101.     (
  102.     OXID oxid,
  103.     REFIPID ipidRemUnk,
  104.     const RpcStringBinding& sbRemoteOxid
  105.     )
  106.     {
  107.     TRACE_CALL;
  108.     // Always add a new entry, since we don't do this very often (only
  109.     // after activations and oxid-resolutions), and if the server has
  110.     // re-started it may have changed port-number...
  111.     SPRemoteOxid& ro = m_remoteOxidTable [oxid];
  112.     // Create one if there isn't already one, otherwise just update
  113.     // the recorded address and IPID info...
  114.     if (! ro)
  115. ro = new VxRemoteOxid (oxid, ipidRemUnk, sbRemoteOxid);
  116.     else
  117. ro->update (ipidRemUnk, sbRemoteOxid);
  118.     }
  119. //////////////////////////////////////////////////////////////////////////
  120. //
  121. // oxidBindingLookup -- this function looks up an existing RemoteOxid
  122. // entry in the table, and return true if one was found, false if
  123. // not...
  124. //
  125. bool RemoteSCM::oxidBindingLookup (OXID oxid, SPRemoteOxid& ro) const
  126.     {
  127.     TRACE_CALL;
  128.     // Is this OXID in the map?
  129.     OXIDMAP::const_iterator i = m_remoteOxidTable.find (oxid);
  130.     if (i == m_remoteOxidTable.end ())
  131. return false;
  132.     ro = (*i).second;
  133.     return true;
  134.     }
  135. //////////////////////////////////////////////////////////////////////////
  136. ULONG RemoteSCM::AddRef ()
  137.     {
  138.     return comSafeInc (&m_dwRefCount);
  139.     }
  140. //////////////////////////////////////////////////////////////////////////
  141. //
  142. ULONG RemoteSCM::Release ()
  143.     {
  144.     DWORD n = comSafeDec (&m_dwRefCount);
  145.     if (n == 0)
  146. delete this;
  147.     return n;
  148.     }
  149. //////////////////////////////////////////////////////////////////////////
  150. //
  151. IOrpcClientChannel* RemoteSCM::connectionGet ()
  152.     {
  153.     // Create connection to remote SCM address
  154.     if (! m_pChannel)
  155. m_pChannel = new RpcIfClient (m_strb);
  156.     return m_pChannel;
  157.     }
  158. //////////////////////////////////////////////////////////////////////////
  159. //
  160. // RemoteSCM::pingTick -- another 'nSecs' has passed, so we need to
  161. // determine whether its time to send a ping or not...
  162. //
  163. void RemoteSCM::pingTick (size_t nSecs)
  164.     {
  165.     m_tickCount -= nSecs;
  166.     if (m_tickCount <= 0)
  167. {
  168. // Restart ping timer...
  169. m_tickCount = 120;
  170. // Need a binding to the remote OXID-resolver?
  171.         IOrpcClientChannelPtr pChan = connectionGet ();
  172.         if (! pChan)
  173.     return;
  174. // Decide whether to send a complex ping (if we have OIDs to
  175. // add or remove from the set, or we have never pinged yet) or
  176. // a simple ping (if there are no changes to the set)...
  177. if (m_oidsToAdd.size () ||
  178.     m_oidsToDel.size () ||
  179.     (m_setid == 0))
  180.     {
  181.     // Need a complex ping...
  182.     unsigned short backoffFactor;
  183.     HRESULT hr = S_OK;
  184. #ifdef __DCC__
  185.             OID* oidsToDel = new OID [m_oidsToDel.size ()];
  186.             OID* oidsToAdd = new OID [m_oidsToAdd.size ()];
  187.             copy (m_oidsToAdd.begin (), m_oidsToAdd.end (), oidsToAdd);
  188.             copy (m_oidsToDel.begin (), m_oidsToDel.end (), oidsToDel);
  189. #else
  190.             OID* oidsToDel = m_oidsToDel.begin ();
  191.             OID* oidsToAdd = m_oidsToAdd.begin ();
  192. #endif
  193.             if (1)
  194.                 {
  195.                 VxCritSec cs (m_mutex);
  196.                 hr=IOXIDResolver_ComplexPing_vxproxy (pChan,
  197.                                                       &m_setid,
  198.                                                       m_pingSeqNum,
  199.                                                       m_oidsToAdd.size (),
  200.                                                       m_oidsToDel.size (),
  201.                                                       oidsToAdd,
  202.                                                       oidsToDel,
  203.                                                       &backoffFactor);
  204.                 }
  205. #ifdef __DCC__
  206.             delete oidsToAdd;
  207.             delete oidsToDel;
  208. #endif
  209.     if (SUCCEEDED (hr))
  210. {
  211. m_oidsToAdd.erase (m_oidsToAdd.begin (),
  212.    m_oidsToAdd.end ());
  213. m_oidsToDel.erase (m_oidsToDel.begin (),
  214.    m_oidsToDel.end ());
  215. ++m_pingSeqNum;
  216. }
  217.     }
  218. else
  219.     {
  220.     // Just a simple ping...
  221.     IOXIDResolver_SimplePing_vxproxy (pChan,
  222.       &m_setid);
  223.     }
  224. }
  225.     }