PageRenderTime 109ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 2ms

/OverSim-20101103/doc/doxy/PubSubMMOG_8cc_source.html

https://bitbucket.org/indigopony/omnetproject
HTML | 2061 lines | 2060 code | 0 blank | 1 comment | 0 complexity | 37d74eda56cfedf3878a62fd4ea6a0ad MD5 | raw file
Possible License(s): BSD-3-Clause, AGPL-1.0, GPL-2.0, Apache-2.0, JSON
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
  5. <title>OverSim: PubSubMMOG.cc Source File</title>
  6. <link href="tabs.css" rel="stylesheet" type="text/css"/>
  7. <link href="doxygen.css" rel="stylesheet" type="text/css"/>
  8. </head>
  9. <body>
  10. <!-- Generated by Doxygen 1.7.1 -->
  11. <div class="navigation" id="top">
  12. <div class="tabs">
  13. <ul class="tablist">
  14. <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
  15. <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
  16. <li><a href="namespaces.html"><span>Namespaces</span></a></li>
  17. <li><a href="annotated.html"><span>Classes</span></a></li>
  18. <li class="current"><a href="files.html"><span>Files</span></a></li>
  19. <li><a href="dirs.html"><span>Directories</span></a></li>
  20. </ul>
  21. </div>
  22. <div class="tabs2">
  23. <ul class="tablist">
  24. <li><a href="files.html"><span>File&nbsp;List</span></a></li>
  25. <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
  26. </ul>
  27. </div>
  28. <div class="navpath">
  29. <ul>
  30. <li><a class="el" href="dir_668dee661430860db5868c2621a9c372.html">src</a> </li>
  31. <li><a class="el" href="dir_6302e9405fe106175d386473fd676d2e.html">overlay</a> </li>
  32. <li><a class="el" href="dir_1ea0fb66e628dfd4ff0dfe2ccf5e5335.html">pubsubmmog</a> </li>
  33. </ul>
  34. </div>
  35. </div>
  36. <div class="header">
  37. <div class="headertitle">
  38. <h1>PubSubMMOG.cc</h1> </div>
  39. </div>
  40. <div class="contents">
  41. <a href="PubSubMMOG_8cc.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">//</span>
  42. <a name="l00002"></a>00002 <span class="comment">// Copyright (C) 2006 Institut fuer Telematik, Universitaet Karlsruhe (TH)</span>
  43. <a name="l00003"></a>00003 <span class="comment">//</span>
  44. <a name="l00004"></a>00004 <span class="comment">// This program is free software; you can redistribute it and/or</span>
  45. <a name="l00005"></a>00005 <span class="comment">// modify it under the terms of the GNU General Public License</span>
  46. <a name="l00006"></a>00006 <span class="comment">// as published by the Free Software Foundation; either version 2</span>
  47. <a name="l00007"></a>00007 <span class="comment">// of the License, or (at your option) any later version.</span>
  48. <a name="l00008"></a>00008 <span class="comment">//</span>
  49. <a name="l00009"></a>00009 <span class="comment">// This program is distributed in the hope that it will be useful,</span>
  50. <a name="l00010"></a>00010 <span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
  51. <a name="l00011"></a>00011 <span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
  52. <a name="l00012"></a>00012 <span class="comment">// GNU General Public License for more details.</span>
  53. <a name="l00013"></a>00013 <span class="comment">//</span>
  54. <a name="l00014"></a>00014 <span class="comment">// You should have received a copy of the GNU General Public License</span>
  55. <a name="l00015"></a>00015 <span class="comment">// along with this program; if not, write to the Free Software</span>
  56. <a name="l00016"></a>00016 <span class="comment">// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.</span>
  57. <a name="l00017"></a>00017 <span class="comment">//</span>
  58. <a name="l00018"></a>00018
  59. <a name="l00024"></a>00024 <span class="preprocessor">#include &lt;NotifierConsts.h&gt;</span>
  60. <a name="l00025"></a>00025
  61. <a name="l00026"></a>00026 <span class="preprocessor">#include &quot;<a class="code" href="PubSubMMOG_8h.html">PubSubMMOG.h</a>&quot;</span>
  62. <a name="l00027"></a>00027
  63. <a name="l00028"></a>00028 <span class="preprocessor">#include &quot;<a class="code" href="GlobalNodeListAccess_8h.html">GlobalNodeListAccess.h</a>&quot;</span>
  64. <a name="l00029"></a>00029 <span class="preprocessor">#include &lt;<a class="code" href="GlobalStatistics_8h.html">GlobalStatistics.h</a>&gt;</span>
  65. <a name="l00030"></a>00030 <span class="preprocessor">#include &lt;<a class="code" href="BootstrapList_8h.html">BootstrapList.h</a>&gt;</span>
  66. <a name="l00031"></a>00031
  67. <a name="l00032"></a>00032 <a class="code" href="ALMTest_8cc.html#a3b5014f410c7989e8bad4b467ecc94cd">Define_Module</a>(<a class="code" href="classPubSubMMOG.html">PubSubMMOG</a>);
  68. <a name="l00033"></a>00033
  69. <a name="l00034"></a>00034 <span class="keyword">using namespace </span>std;
  70. <a name="l00035"></a>00035
  71. <a name="l00036"></a><a class="code" href="classPubSubMMOG.html#a42a189f235425d0cc5706857f3122283">00036</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a42a189f235425d0cc5706857f3122283" title="Initializes derived-class-attributes.">PubSubMMOG::initializeOverlay</a>(<span class="keywordtype">int</span> stage)
  72. <a name="l00037"></a>00037 {
  73. <a name="l00038"></a>00038 <span class="comment">// because of IPAddressResolver, we need to wait until interfaces are registered,</span>
  74. <a name="l00039"></a>00039 <span class="comment">// address auto-assignment takes place etc.</span>
  75. <a name="l00040"></a>00040 <span class="keywordflow">if</span>(stage != <a class="code" href="InitStages_8h.html#a42fde1aa1e14a1c45d29061d6e87e532a58e83c497c7c8495e9c592ff3148b6b9" title="first stage for overlay modules (Tier 0 / KBR)">MIN_STAGE_OVERLAY</a>) <span class="keywordflow">return</span>;
  76. <a name="l00041"></a>00041
  77. <a name="l00042"></a>00042 <a class="code" href="classBaseOverlay.html#ab4be6d88417117fbf33a445d56af2655">state</a> = INIT;
  78. <a name="l00043"></a>00043 <a class="code" href="classPubSubMMOG.html#a3e573d9ce39091daea435016a587b239">setBootstrapedIcon</a>();
  79. <a name="l00044"></a>00044 <span class="comment">// TODO: use BootstrapList instead (but this currently preferes</span>
  80. <a name="l00045"></a>00045 <span class="comment">// nodes from the same partition)</span>
  81. <a name="l00046"></a>00046 <a class="code" href="classPubSubMMOG.html#a1e1ba5fd3c791f3aa2172e6b055f68bb">lobbyServer</a> = <a class="code" href="classBaseOverlay.html#a933e505ea77cae4ab0c8edcb77ade2c7" title="pointer to GlobalNodeList in this node">globalNodeList</a>-&gt;<a class="code" href="classGlobalNodeList.html#a1f0290942c0a6d89ad7e39d75ff6355b" title="Returns a random NodeHandle.">getBootstrapNode</a>();
  82. <a name="l00047"></a>00047
  83. <a name="l00048"></a>00048 <a class="code" href="classPubSubMMOG.html#a04199b677abdfd25b29f9a5f79c19426">joinTimer</a> = <span class="keyword">new</span> cMessage(<span class="stringliteral">&quot;join timer&quot;</span>);
  84. <a name="l00049"></a>00049 simtime_t joinTime = ceil(simTime() + (simtime_t) par(<span class="stringliteral">&quot;joinDelay&quot;</span>));
  85. <a name="l00050"></a>00050 scheduleAt( joinTime, <a class="code" href="classPubSubMMOG.html#a04199b677abdfd25b29f9a5f79c19426">joinTimer</a> );
  86. <a name="l00051"></a>00051
  87. <a name="l00052"></a>00052 <a class="code" href="classPubSubMMOG.html#a228fe6f61d1fe510d1336296c4bf254c">movementRate</a> = par(<span class="stringliteral">&quot;movementRate&quot;</span>);
  88. <a name="l00053"></a>00053 <a class="code" href="classPubSubMMOG.html#a5c7d73c47298f65748e65abc506b9611">eventDeliveryTimer</a> = <span class="keyword">new</span> <a class="code" href="classPubSubTimer.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubTimer</a>(<span class="stringliteral">&quot;event delivery timer&quot;</span>);
  89. <a name="l00054"></a>00054 <a class="code" href="classPubSubMMOG.html#a5c7d73c47298f65748e65abc506b9611">eventDeliveryTimer</a>-&gt;<a class="code" href="classPubSubTimer.html#a09825991200a1fa76d4cfc9549ac51f5">setType</a>( <a class="code" href="PubSubMessage__m_8h.html#ac87923fdb9d8348a9eb766921ec0e04cab87b77accd020036a875063be27c753c">PUBSUB_EVENTDELIVERY</a> );
  90. <a name="l00055"></a>00055 scheduleAt( joinTime + 1.0/(2*<a class="code" href="classPubSubMMOG.html#a228fe6f61d1fe510d1336296c4bf254c">movementRate</a>), <a class="code" href="classPubSubMMOG.html#a5c7d73c47298f65748e65abc506b9611">eventDeliveryTimer</a> );
  91. <a name="l00056"></a>00056
  92. <a name="l00057"></a>00057 <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a> = par(<span class="stringliteral">&quot;numSubspaces&quot;</span>);
  93. <a name="l00058"></a>00058 <a class="code" href="classPubSubMMOG.html#a45ee110f2b164e1902266585eaa1fb2c">subspaceSize</a> = (int) ( (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>) par(<span class="stringliteral">&quot;areaDimension&quot;</span>) / <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>);
  94. <a name="l00059"></a>00059 <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classNodeHandle.html#af3992f1fda9ea42dc10bf4739e47700a" title="saves given key to NodeHandle::key">setKey</a>( <a class="code" href="classOverlayKey.html#a1983e1b47e32783f8ccd5e59fe725290" title="Returns a random key.">OverlayKey::random</a>() );
  95. <a name="l00060"></a>00060
  96. <a name="l00061"></a>00061 <a class="code" href="classPubSubMMOG.html#a7d310afbff3e729b6a33f8e6614de07e">maxChildren</a> = par(<span class="stringliteral">&quot;maxChildren&quot;</span>);
  97. <a name="l00062"></a>00062 <a class="code" href="classPubSubSubspaceResponsible.html#a5dfd7f5d997726d5c8f158a371cee621">PubSubSubspaceResponsible::maxChildren</a> = <a class="code" href="classPubSubMMOG.html#a7d310afbff3e729b6a33f8e6614de07e">maxChildren</a>;
  98. <a name="l00063"></a>00063
  99. <a name="l00064"></a>00064 <a class="code" href="classPubSubMMOG.html#ae02428124f2ac8a32da65ce4bcc7a927">AOIWidth</a> = par(<span class="stringliteral">&quot;AOIWidth&quot;</span>);
  100. <a name="l00065"></a>00065 <a class="code" href="classPubSubMMOG.html#a219753e4fc3eae95cd21f70bc40017e7">maxMoveDelay</a> = par(<span class="stringliteral">&quot;maxMoveDelay&quot;</span>);
  101. <a name="l00066"></a>00066
  102. <a name="l00067"></a>00067 <a class="code" href="classPubSubMMOG.html#a98fd6baf72474a184c902133581273fa">parentTimeout</a> = par(<span class="stringliteral">&quot;parentTimeout&quot;</span>);
  103. <a name="l00068"></a>00068 <a class="code" href="classPubSubMMOG.html#aebf88e5c0a0f294c706c3281b1aae373">heartbeatTimer</a> = <span class="keyword">new</span> <a class="code" href="classPubSubTimer.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubTimer</a>(<span class="stringliteral">&quot;HeartbeatTimer&quot;</span>);
  104. <a name="l00069"></a>00069 <a class="code" href="classPubSubMMOG.html#aebf88e5c0a0f294c706c3281b1aae373">heartbeatTimer</a>-&gt;<a class="code" href="classPubSubTimer.html#a09825991200a1fa76d4cfc9549ac51f5">setType</a>( <a class="code" href="PubSubMessage__m_8h.html#ac87923fdb9d8348a9eb766921ec0e04caec28dc4bd962108ceb27575f46b81ebd">PUBSUB_HEARTBEAT</a> );
  105. <a name="l00070"></a>00070 <a class="code" href="classPubSubMMOG.html#a7544c76d3fceee2a56dee1bdf63c4db1">startTimer</a>( <a class="code" href="classPubSubMMOG.html#aebf88e5c0a0f294c706c3281b1aae373">heartbeatTimer</a> );
  106. <a name="l00071"></a>00071 <a class="code" href="classPubSubMMOG.html#a2540cd40427d53404d3adbca173cfd6c">childPingTimer</a> = <span class="keyword">new</span> <a class="code" href="classPubSubTimer.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubTimer</a>(<span class="stringliteral">&quot;ChildPingTimer&quot;</span>);
  107. <a name="l00072"></a>00072 <a class="code" href="classPubSubMMOG.html#a2540cd40427d53404d3adbca173cfd6c">childPingTimer</a>-&gt;<a class="code" href="classPubSubTimer.html#a09825991200a1fa76d4cfc9549ac51f5">setType</a>( <a class="code" href="PubSubMessage__m_8h.html#ac87923fdb9d8348a9eb766921ec0e04caa64f2984ebaaa94fb52bc3ff99d24fa1">PUBSUB_CHILDPING</a> );
  108. <a name="l00073"></a>00073 <a class="code" href="classPubSubMMOG.html#a7544c76d3fceee2a56dee1bdf63c4db1">startTimer</a>( <a class="code" href="classPubSubMMOG.html#a2540cd40427d53404d3adbca173cfd6c">childPingTimer</a> );
  109. <a name="l00074"></a>00074
  110. <a name="l00075"></a>00075 <a class="code" href="classPubSubMMOG.html#aced8c7945b0f77560359167cc5f398f6">allowOldMoveMessages</a> = par(<span class="stringliteral">&quot;allowOldMoveMessages&quot;</span>);
  111. <a name="l00076"></a>00076
  112. <a name="l00077"></a>00077 <a class="code" href="classPubSubMMOG.html#aa809123a9ef7f64ea622400ed60a2d4c">numEventsWrongTimeslot</a> = <a class="code" href="classPubSubMMOG.html#a0adb17b77190fd14c0979fe39a5889cc">numEventsCorrectTimeslot</a> = 0;
  113. <a name="l00078"></a>00078 <a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a> = 0;
  114. <a name="l00079"></a>00079 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a> = 0;
  115. <a name="l00080"></a>00080 <a class="code" href="classPubSubMMOG.html#a11ca86e89977d8bb4d1512a5e64ce8d3">numMoveMessages</a> = 0;
  116. <a name="l00081"></a>00081 <a class="code" href="classPubSubMMOG.html#a122b6f4eacfc82a453cdabace026a0d5">moveMessagesSize</a> = 0;
  117. <a name="l00082"></a>00082 <a class="code" href="classPubSubMMOG.html#ae81f55efe5b21342597e408ff3474eee">numMoveListMessages</a> = 0;
  118. <a name="l00083"></a>00083 <a class="code" href="classPubSubMMOG.html#a5a665dd74681081d669ea57efd5d83b0">moveListMessagesSize</a> = 0;
  119. <a name="l00084"></a>00084 <a class="code" href="classPubSubMMOG.html#a4561eb4e380c7aea874ea622b9145603">respMoveListMessagesSize</a> = 0;
  120. <a name="l00085"></a>00085 <a class="code" href="classPubSubMMOG.html#a1450e36b5a7103fe4581f271fac13340">lostMovementLists</a> = 0;
  121. <a name="l00086"></a>00086 <a class="code" href="classPubSubMMOG.html#a8415fe6a47b3b961fd54f9e3b5f8d3f0">receivedMovementLists</a> = 0;
  122. <a name="l00087"></a>00087 WATCH( <a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a> );
  123. <a name="l00088"></a>00088 WATCH( <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a> );
  124. <a name="l00089"></a>00089 WATCH( <a class="code" href="classPubSubMMOG.html#a11ca86e89977d8bb4d1512a5e64ce8d3">numMoveMessages</a> );
  125. <a name="l00090"></a>00090 WATCH( <a class="code" href="classPubSubMMOG.html#a122b6f4eacfc82a453cdabace026a0d5">moveMessagesSize</a> );
  126. <a name="l00091"></a>00091 WATCH( <a class="code" href="classPubSubMMOG.html#ae81f55efe5b21342597e408ff3474eee">numMoveListMessages</a> );
  127. <a name="l00092"></a>00092 WATCH( <a class="code" href="classPubSubMMOG.html#a5a665dd74681081d669ea57efd5d83b0">moveListMessagesSize</a> );
  128. <a name="l00093"></a>00093 WATCH( <a class="code" href="classPubSubMMOG.html#aa809123a9ef7f64ea622400ed60a2d4c">numEventsWrongTimeslot</a> );
  129. <a name="l00094"></a>00094 WATCH( <a class="code" href="classPubSubMMOG.html#a0adb17b77190fd14c0979fe39a5889cc">numEventsCorrectTimeslot</a> );
  130. <a name="l00095"></a>00095 WATCH( <a class="code" href="classPubSubMMOG.html#a1450e36b5a7103fe4581f271fac13340">lostMovementLists</a> );
  131. <a name="l00096"></a>00096 WATCH( <a class="code" href="classPubSubMMOG.html#a8415fe6a47b3b961fd54f9e3b5f8d3f0">receivedMovementLists</a> );
  132. <a name="l00097"></a>00097 WATCH_LIST( <a class="code" href="classPubSubMMOG.html#a0535f1d205515626aaa20d25f8da3cda">subscribedSubspaces</a> );
  133. <a name="l00098"></a>00098 WATCH_MAP( <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a> );
  134. <a name="l00099"></a>00099 WATCH_MAP( <a class="code" href="classPubSubMMOG.html#a9cb86fc744b2f9b087a66e0af879f1fc">backupSubspaces</a> );
  135. <a name="l00100"></a>00100 WATCH_MAP( <a class="code" href="classPubSubMMOG.html#ac2ff9ed8d82f2fd97f69343cd8ee78ac">intermediateSubspaces</a> );
  136. <a name="l00101"></a>00101 }
  137. <a name="l00102"></a>00102
  138. <a name="l00103"></a><a class="code" href="classPubSubMMOG.html#a4f2a87f7e95bbb17819f04261585236d">00103</a> <span class="keywordtype">bool</span> <a class="code" href="classPubSubMMOG.html#a4f2a87f7e95bbb17819f04261585236d">PubSubMMOG::handleRpcCall</a>(<a class="code" href="classBaseCallMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">BaseCallMessage</a>* msg)
  139. <a name="l00104"></a>00104 {
  140. <a name="l00105"></a>00105 <span class="comment">// delegate messages</span>
  141. <a name="l00106"></a>00106 <a class="code" href="RpcMacros_8h.html#aa75b135e279b574267e1a7dc4ab79da4" title="Marks the beginning of a Remote-Procedure-Call Switch block.">RPC_SWITCH_START</a>( msg )
  142. <a name="l00107"></a>00107 <a class="code" href="RpcMacros_8h.html#ad81d44e9bc59d2fb2cfcacc4d5ecda35" title="Declares a RPC method delegation.">RPC_DELEGATE</a>( PubSubSubscription, <a class="code" href="classPubSubMMOG.html#a3d1fd761fc46a4b56f1c7e852bf41207">handleSubscriptionCall</a> );
  143. <a name="l00108"></a>00108 <a class="code" href="RpcMacros_8h.html#ad81d44e9bc59d2fb2cfcacc4d5ecda35" title="Declares a RPC method delegation.">RPC_DELEGATE</a>( PubSubTakeOverSubspace, <a class="code" href="classPubSubMMOG.html#af504bf4e0b52404912395baefed9f5c5">handleTakeOver</a> );
  144. <a name="l00109"></a>00109 <a class="code" href="RpcMacros_8h.html#ad81d44e9bc59d2fb2cfcacc4d5ecda35" title="Declares a RPC method delegation.">RPC_DELEGATE</a>( PubSubBackup, <a class="code" href="classPubSubMMOG.html#ac7e55bce3aa2a48f4367977e081eb9e1">handleBackupCall</a> );
  145. <a name="l00110"></a>00110 <a class="code" href="RpcMacros_8h.html#ad81d44e9bc59d2fb2cfcacc4d5ecda35" title="Declares a RPC method delegation.">RPC_DELEGATE</a>( PubSubIntermediate, <a class="code" href="classPubSubMMOG.html#a77d17c923e8b43f0bf38222dd58d3969">handleIntermediateCall</a> );
  146. <a name="l00111"></a>00111 <a class="code" href="RpcMacros_8h.html#ad81d44e9bc59d2fb2cfcacc4d5ecda35" title="Declares a RPC method delegation.">RPC_DELEGATE</a>( PubSubAdoptChild, <a class="code" href="classPubSubMMOG.html#a301bb30f1b9239fa5ea744400be48a1b">handleAdoptChildCall</a> );
  147. <a name="l00112"></a>00112 <a class="code" href="RpcMacros_8h.html#ad81d44e9bc59d2fb2cfcacc4d5ecda35" title="Declares a RPC method delegation.">RPC_DELEGATE</a>( PubSubPing, <a class="code" href="classPubSubMMOG.html#a7179d8d2355f09e50e5172a8bc4e60b1">handlePingCall</a> );
  148. <a name="l00113"></a>00113 <a class="code" href="RpcMacros_8h.html#a29a8a3f21e67ecb25f58608a54df5191" title="Marks the end of a Remote-Procedure-Call Switch block.">RPC_SWITCH_END</a>( )
  149. <a name="l00114"></a>00114
  150. <a name="l00115"></a>00115 <span class="keywordflow">return</span> RPC_HANDLED;
  151. <a name="l00116"></a>00116
  152. <a name="l00117"></a>00117 }
  153. <a name="l00118"></a>00118
  154. <a name="l00119"></a><a class="code" href="classPubSubMMOG.html#a8cd2dcabf97fae56f6af40cda177fdf7">00119</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a8cd2dcabf97fae56f6af40cda177fdf7">PubSubMMOG::handleRpcResponse</a>(<a class="code" href="classBaseResponseMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">BaseResponseMessage</a> *msg,
  155. <a name="l00120"></a>00120 cPolymorphic* context, <span class="keywordtype">int</span> rpcId,
  156. <a name="l00121"></a>00121 simtime_t rtt)
  157. <a name="l00122"></a>00122 {
  158. <a name="l00123"></a>00123 <a class="code" href="RpcMacros_8h.html#aa75b135e279b574267e1a7dc4ab79da4" title="Marks the beginning of a Remote-Procedure-Call Switch block.">RPC_SWITCH_START</a>(msg);
  159. <a name="l00124"></a>00124 <a class="code" href="RpcMacros_8h.html#a0394d2dc4f9f1e15d7e99c9f43da10c7">RPC_ON_RESPONSE</a>( PubSubJoin ) {
  160. <a name="l00125"></a>00125 <a class="code" href="classPubSubMMOG.html#a90f7b9fa68b400b80892d642f4c439b4">handleJoinResponse</a>( _PubSubJoinResponse );
  161. <a name="l00126"></a>00126 EV &lt;&lt; <span class="stringliteral">&quot;[PubSubMMOG::handleRpcResponse() @ &quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classTransportAddress.html#a00e613d98d3412e2b92897c25aa0eb4c" title="returns ip address">getIp</a>()
  162. <a name="l00127"></a>00127 &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classNodeHandle.html#aef531103cdf07c8353267f4d30a80112" title="returns key of this NodeHandle">getKey</a>().<a class="code" href="classOverlayKey.html#aabeb4fd284a630a82e982ba34ece4fd9" title="Returns a string representation of this key.">toString</a>(16) &lt;&lt; <span class="stringliteral">&quot;)]\n&quot;</span>
  163. <a name="l00128"></a>00128 &lt;&lt; <span class="stringliteral">&quot; Received a PubSubJoin RPC Response: id=&quot;</span> &lt;&lt; rpcId &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>
  164. <a name="l00129"></a>00129 &lt;&lt; <span class="stringliteral">&quot; msg=&quot;</span> &lt;&lt; *_PubSubJoinResponse &lt;&lt; <span class="stringliteral">&quot; rtt=&quot;</span> &lt;&lt; rtt
  165. <a name="l00130"></a>00130 &lt;&lt; endl;
  166. <a name="l00131"></a>00131 <span class="keywordflow">break</span>;
  167. <a name="l00132"></a>00132 }
  168. <a name="l00133"></a>00133 <a class="code" href="RpcMacros_8h.html#a0394d2dc4f9f1e15d7e99c9f43da10c7">RPC_ON_RESPONSE</a>( PubSubSubscription ) {
  169. <a name="l00134"></a>00134 <a class="code" href="classPubSubMMOG.html#a7d6b63042aee9dfbe3d11d2062a43a05">handleSubscriptionResponse</a>( _PubSubSubscriptionResponse );
  170. <a name="l00135"></a>00135 EV &lt;&lt; <span class="stringliteral">&quot;[PubSubMMOG::handleRpcResponse() @ &quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classTransportAddress.html#a00e613d98d3412e2b92897c25aa0eb4c" title="returns ip address">getIp</a>()
  171. <a name="l00136"></a>00136 &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classNodeHandle.html#aef531103cdf07c8353267f4d30a80112" title="returns key of this NodeHandle">getKey</a>().<a class="code" href="classOverlayKey.html#aabeb4fd284a630a82e982ba34ece4fd9" title="Returns a string representation of this key.">toString</a>(16) &lt;&lt; <span class="stringliteral">&quot;)]\n&quot;</span>
  172. <a name="l00137"></a>00137 &lt;&lt; <span class="stringliteral">&quot; Received a PubSubSubscription RPC Response: id=&quot;</span> &lt;&lt; rpcId &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>
  173. <a name="l00138"></a>00138 &lt;&lt; <span class="stringliteral">&quot; msg=&quot;</span> &lt;&lt; *_PubSubSubscriptionResponse &lt;&lt; <span class="stringliteral">&quot; rtt=&quot;</span> &lt;&lt; rtt
  174. <a name="l00139"></a>00139 &lt;&lt; endl;
  175. <a name="l00140"></a>00140 <span class="keywordflow">break</span>;
  176. <a name="l00141"></a>00141 }
  177. <a name="l00142"></a>00142 <a class="code" href="RpcMacros_8h.html#a0394d2dc4f9f1e15d7e99c9f43da10c7">RPC_ON_RESPONSE</a>( PubSubResponsibleNode ) {
  178. <a name="l00143"></a>00143 <a class="code" href="classPubSubMMOG.html#a7e351287bef39afa54408e4fce0fdf26">handleResponsibleNodeResponse</a>( _PubSubResponsibleNodeResponse );
  179. <a name="l00144"></a>00144 EV &lt;&lt; <span class="stringliteral">&quot;[PubSubMMOG::handleRpcResponse() @ &quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classTransportAddress.html#a00e613d98d3412e2b92897c25aa0eb4c" title="returns ip address">getIp</a>()
  180. <a name="l00145"></a>00145 &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classNodeHandle.html#aef531103cdf07c8353267f4d30a80112" title="returns key of this NodeHandle">getKey</a>().<a class="code" href="classOverlayKey.html#aabeb4fd284a630a82e982ba34ece4fd9" title="Returns a string representation of this key.">toString</a>(16) &lt;&lt; <span class="stringliteral">&quot;)]\n&quot;</span>
  181. <a name="l00146"></a>00146 &lt;&lt; <span class="stringliteral">&quot; Received a PubSubResponsibleNode RPC Response: id=&quot;</span> &lt;&lt; rpcId &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>
  182. <a name="l00147"></a>00147 &lt;&lt; <span class="stringliteral">&quot; msg=&quot;</span> &lt;&lt; *_PubSubResponsibleNodeResponse &lt;&lt; <span class="stringliteral">&quot; rtt=&quot;</span> &lt;&lt; rtt
  183. <a name="l00148"></a>00148 &lt;&lt; endl;
  184. <a name="l00149"></a>00149 <span class="keywordflow">break</span>;
  185. <a name="l00150"></a>00150 }
  186. <a name="l00151"></a>00151 <a class="code" href="RpcMacros_8h.html#a0394d2dc4f9f1e15d7e99c9f43da10c7">RPC_ON_RESPONSE</a>( PubSubHelp ) {
  187. <a name="l00152"></a>00152 <a class="code" href="classPubSubMMOG.html#a7d28b4484518dcf34fbc2cb462bf620b">handleHelpResponse</a>( _PubSubHelpResponse );
  188. <a name="l00153"></a>00153 EV &lt;&lt; <span class="stringliteral">&quot;[PubSubMMOG::handleRpcResponse() @ &quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classTransportAddress.html#a00e613d98d3412e2b92897c25aa0eb4c" title="returns ip address">getIp</a>()
  189. <a name="l00154"></a>00154 &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classNodeHandle.html#aef531103cdf07c8353267f4d30a80112" title="returns key of this NodeHandle">getKey</a>().<a class="code" href="classOverlayKey.html#aabeb4fd284a630a82e982ba34ece4fd9" title="Returns a string representation of this key.">toString</a>(16) &lt;&lt; <span class="stringliteral">&quot;)]\n&quot;</span>
  190. <a name="l00155"></a>00155 &lt;&lt; <span class="stringliteral">&quot; Received a PubSubHelp RPC Response: id=&quot;</span> &lt;&lt; rpcId &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>
  191. <a name="l00156"></a>00156 &lt;&lt; <span class="stringliteral">&quot; msg=&quot;</span> &lt;&lt; *_PubSubHelpResponse &lt;&lt; <span class="stringliteral">&quot; rtt=&quot;</span> &lt;&lt; rtt
  192. <a name="l00157"></a>00157 &lt;&lt; endl;
  193. <a name="l00158"></a>00158 <span class="keywordflow">break</span>;
  194. <a name="l00159"></a>00159 }
  195. <a name="l00160"></a>00160 <a class="code" href="RpcMacros_8h.html#a0394d2dc4f9f1e15d7e99c9f43da10c7">RPC_ON_RESPONSE</a>( PubSubBackup ) {
  196. <a name="l00161"></a>00161 <a class="code" href="classPubSubMMOG.html#a401659ffbdca793a6f7d97e9737a70d0">handleBackupResponse</a>( _PubSubBackupResponse );
  197. <a name="l00162"></a>00162 EV &lt;&lt; <span class="stringliteral">&quot;[PubSubMMOG::handleRpcResponse() @ &quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classTransportAddress.html#a00e613d98d3412e2b92897c25aa0eb4c" title="returns ip address">getIp</a>()
  198. <a name="l00163"></a>00163 &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classNodeHandle.html#aef531103cdf07c8353267f4d30a80112" title="returns key of this NodeHandle">getKey</a>().<a class="code" href="classOverlayKey.html#aabeb4fd284a630a82e982ba34ece4fd9" title="Returns a string representation of this key.">toString</a>(16) &lt;&lt; <span class="stringliteral">&quot;)]\n&quot;</span>
  199. <a name="l00164"></a>00164 &lt;&lt; <span class="stringliteral">&quot; Received a PubSubBackup RPC Response: id=&quot;</span> &lt;&lt; rpcId &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>
  200. <a name="l00165"></a>00165 &lt;&lt; <span class="stringliteral">&quot; msg=&quot;</span> &lt;&lt; *_PubSubBackupResponse &lt;&lt; <span class="stringliteral">&quot; rtt=&quot;</span> &lt;&lt; rtt
  201. <a name="l00166"></a>00166 &lt;&lt; endl;
  202. <a name="l00167"></a>00167 <span class="keywordflow">break</span>;
  203. <a name="l00168"></a>00168 }
  204. <a name="l00169"></a>00169 <a class="code" href="RpcMacros_8h.html#a0394d2dc4f9f1e15d7e99c9f43da10c7">RPC_ON_RESPONSE</a>( PubSubIntermediate ) {
  205. <a name="l00170"></a>00170 <a class="code" href="classPubSubMMOG.html#ac41702ca41ffae439637504939856f4f">handleIntermediateResponse</a>( _PubSubIntermediateResponse );
  206. <a name="l00171"></a>00171 EV &lt;&lt; <span class="stringliteral">&quot;[PubSubMMOG::handleRpcResponse() @ &quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classTransportAddress.html#a00e613d98d3412e2b92897c25aa0eb4c" title="returns ip address">getIp</a>()
  207. <a name="l00172"></a>00172 &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classNodeHandle.html#aef531103cdf07c8353267f4d30a80112" title="returns key of this NodeHandle">getKey</a>().<a class="code" href="classOverlayKey.html#aabeb4fd284a630a82e982ba34ece4fd9" title="Returns a string representation of this key.">toString</a>(16) &lt;&lt; <span class="stringliteral">&quot;)]\n&quot;</span>
  208. <a name="l00173"></a>00173 &lt;&lt; <span class="stringliteral">&quot; Received a PubSubIntermediate RPC Response: id=&quot;</span> &lt;&lt; rpcId &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>
  209. <a name="l00174"></a>00174 &lt;&lt; <span class="stringliteral">&quot; msg=&quot;</span> &lt;&lt; *_PubSubIntermediateResponse &lt;&lt; <span class="stringliteral">&quot; rtt=&quot;</span> &lt;&lt; rtt
  210. <a name="l00175"></a>00175 &lt;&lt; endl;
  211. <a name="l00176"></a>00176 <span class="keywordflow">break</span>;
  212. <a name="l00177"></a>00177 }
  213. <a name="l00178"></a>00178 <a class="code" href="RpcMacros_8h.html#a0394d2dc4f9f1e15d7e99c9f43da10c7">RPC_ON_RESPONSE</a>( PubSubAdoptChild ) {
  214. <a name="l00179"></a>00179 <a class="code" href="classPubSubMMOG.html#a9f396c585cfb16b476047c35fbbe05fa">handleAdoptChildResponse</a>( _PubSubAdoptChildResponse );
  215. <a name="l00180"></a>00180 EV &lt;&lt; <span class="stringliteral">&quot;[PubSubMMOG::handleRpcResponse() @ &quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classTransportAddress.html#a00e613d98d3412e2b92897c25aa0eb4c" title="returns ip address">getIp</a>()
  216. <a name="l00181"></a>00181 &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classNodeHandle.html#aef531103cdf07c8353267f4d30a80112" title="returns key of this NodeHandle">getKey</a>().<a class="code" href="classOverlayKey.html#aabeb4fd284a630a82e982ba34ece4fd9" title="Returns a string representation of this key.">toString</a>(16) &lt;&lt; <span class="stringliteral">&quot;)]\n&quot;</span>
  217. <a name="l00182"></a>00182 &lt;&lt; <span class="stringliteral">&quot; Received a PubSubAdoptChild RPC Response: id=&quot;</span> &lt;&lt; rpcId &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>
  218. <a name="l00183"></a>00183 &lt;&lt; <span class="stringliteral">&quot; msg=&quot;</span> &lt;&lt; *_PubSubAdoptChildResponse &lt;&lt; <span class="stringliteral">&quot; rtt=&quot;</span> &lt;&lt; rtt
  219. <a name="l00184"></a>00184 &lt;&lt; endl;
  220. <a name="l00185"></a>00185 <span class="keywordflow">break</span>;
  221. <a name="l00186"></a>00186 }
  222. <a name="l00187"></a>00187 <a class="code" href="RpcMacros_8h.html#a0394d2dc4f9f1e15d7e99c9f43da10c7">RPC_ON_RESPONSE</a>( PubSubPing ) {
  223. <a name="l00188"></a>00188 <a class="code" href="classPubSubMMOG.html#a6ade874ae0f4871c157cbf3e4334724c">handlePingResponse</a>( _PubSubPingResponse );
  224. <a name="l00189"></a>00189 EV &lt;&lt; <span class="stringliteral">&quot;[PubSubMMOG::handleRpcResponse() @ &quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classTransportAddress.html#a00e613d98d3412e2b92897c25aa0eb4c" title="returns ip address">getIp</a>()
  225. <a name="l00190"></a>00190 &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classNodeHandle.html#aef531103cdf07c8353267f4d30a80112" title="returns key of this NodeHandle">getKey</a>().<a class="code" href="classOverlayKey.html#aabeb4fd284a630a82e982ba34ece4fd9" title="Returns a string representation of this key.">toString</a>(16) &lt;&lt; <span class="stringliteral">&quot;)]\n&quot;</span>
  226. <a name="l00191"></a>00191 &lt;&lt; <span class="stringliteral">&quot; Received a PubSubPing RPC Response: id=&quot;</span> &lt;&lt; rpcId &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>
  227. <a name="l00192"></a>00192 &lt;&lt; <span class="stringliteral">&quot; msg=&quot;</span> &lt;&lt; *_PubSubPingResponse &lt;&lt; <span class="stringliteral">&quot; rtt=&quot;</span> &lt;&lt; rtt
  228. <a name="l00193"></a>00193 &lt;&lt; endl;
  229. <a name="l00194"></a>00194 <span class="keywordflow">break</span>;
  230. <a name="l00195"></a>00195 }
  231. <a name="l00196"></a>00196 <a class="code" href="RpcMacros_8h.html#a29a8a3f21e67ecb25f58608a54df5191" title="Marks the end of a Remote-Procedure-Call Switch block.">RPC_SWITCH_END</a>( );
  232. <a name="l00197"></a>00197 }
  233. <a name="l00198"></a>00198
  234. <a name="l00199"></a><a class="code" href="classPubSubMMOG.html#a9838eb23acd2464c8500cdff66caf8a8">00199</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a9838eb23acd2464c8500cdff66caf8a8">PubSubMMOG::handleRpcTimeout</a> (<a class="code" href="classBaseCallMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">BaseCallMessage</a> *msg,
  235. <a name="l00200"></a>00200 <span class="keyword">const</span> <a class="code" href="classTransportAddress.html" title="This class implements a common transport address.">TransportAddress</a> &amp;dest,
  236. <a name="l00201"></a>00201 cPolymorphic* context, <span class="keywordtype">int</span> rpcId,
  237. <a name="l00202"></a>00202 <span class="keyword">const</span> <a class="code" href="classOverlayKey.html" title="A common overlay key class.">OverlayKey</a> &amp;destKey)
  238. <a name="l00203"></a>00203 {
  239. <a name="l00204"></a>00204 <a class="code" href="RpcMacros_8h.html#aa75b135e279b574267e1a7dc4ab79da4" title="Marks the beginning of a Remote-Procedure-Call Switch block.">RPC_SWITCH_START</a>(msg)
  240. <a name="l00205"></a>00205 <a class="code" href="RpcMacros_8h.html#ae07fad586ce7b9e82ad12848767a32e5">RPC_ON_CALL</a>( PubSubBackup ) {
  241. <a name="l00206"></a>00206 <a class="code" href="classPubSubMMOG.html#a217e815ddc5ba02f8afe33a73389184f">handleBackupCallTimeout</a>( _PubSubBackupCall, dest );
  242. <a name="l00207"></a>00207 EV &lt;&lt; <span class="stringliteral">&quot;[PubSubMMOG::handleRpcTimeout() @ &quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classTransportAddress.html#a00e613d98d3412e2b92897c25aa0eb4c" title="returns ip address">getIp</a>()
  243. <a name="l00208"></a>00208 &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classNodeHandle.html#aef531103cdf07c8353267f4d30a80112" title="returns key of this NodeHandle">getKey</a>().<a class="code" href="classOverlayKey.html#aabeb4fd284a630a82e982ba34ece4fd9" title="Returns a string representation of this key.">toString</a>(16) &lt;&lt; <span class="stringliteral">&quot;)]\n&quot;</span>
  244. <a name="l00209"></a>00209 &lt;&lt; <span class="stringliteral">&quot; Backup RPC Call timed out: id=&quot;</span> &lt;&lt; rpcId &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>
  245. <a name="l00210"></a>00210 &lt;&lt; <span class="stringliteral">&quot; msg=&quot;</span> &lt;&lt; *_PubSubBackupCall
  246. <a name="l00211"></a>00211 &lt;&lt; <span class="stringliteral">&quot; oldNode=&quot;</span> &lt;&lt; dest
  247. <a name="l00212"></a>00212 &lt;&lt; endl;
  248. <a name="l00213"></a>00213 <span class="keywordflow">break</span>;
  249. <a name="l00214"></a>00214 }
  250. <a name="l00215"></a>00215 <a class="code" href="RpcMacros_8h.html#ae07fad586ce7b9e82ad12848767a32e5">RPC_ON_CALL</a>( PubSubPing ) {
  251. <a name="l00216"></a>00216 <a class="code" href="classPubSubMMOG.html#a0ca3bd97cac131ba5c2ff02235cc6a2f">handlePingCallTimeout</a>( _PubSubPingCall, dest );
  252. <a name="l00217"></a>00217 EV &lt;&lt; <span class="stringliteral">&quot;[PubSubMMOG::handleRpcTimeout() @ &quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classTransportAddress.html#a00e613d98d3412e2b92897c25aa0eb4c" title="returns ip address">getIp</a>()
  253. <a name="l00218"></a>00218 &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classNodeHandle.html#aef531103cdf07c8353267f4d30a80112" title="returns key of this NodeHandle">getKey</a>().<a class="code" href="classOverlayKey.html#aabeb4fd284a630a82e982ba34ece4fd9" title="Returns a string representation of this key.">toString</a>(16) &lt;&lt; <span class="stringliteral">&quot;)]\n&quot;</span>
  254. <a name="l00219"></a>00219 &lt;&lt; <span class="stringliteral">&quot; Ping RPC Call timed out: id=&quot;</span> &lt;&lt; rpcId &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>
  255. <a name="l00220"></a>00220 &lt;&lt; <span class="stringliteral">&quot; msg=&quot;</span> &lt;&lt; *_PubSubPingCall
  256. <a name="l00221"></a>00221 &lt;&lt; <span class="stringliteral">&quot; oldNode=&quot;</span> &lt;&lt; dest
  257. <a name="l00222"></a>00222 &lt;&lt; endl;
  258. <a name="l00223"></a>00223 <span class="keywordflow">break</span>;
  259. <a name="l00224"></a>00224 }
  260. <a name="l00225"></a>00225 <a class="code" href="RpcMacros_8h.html#ae07fad586ce7b9e82ad12848767a32e5">RPC_ON_CALL</a>( PubSubSubscription ) {
  261. <a name="l00226"></a>00226 <a class="code" href="classPubSubMMOG.html#a1e97ea82ff0848af1f5437b1c8da7c99">handleSubscriptionCallTimeout</a>( _PubSubSubscriptionCall, dest );
  262. <a name="l00227"></a>00227 EV &lt;&lt; <span class="stringliteral">&quot;[PubSubMMOG::handleRpcTimeout() @ &quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classTransportAddress.html#a00e613d98d3412e2b92897c25aa0eb4c" title="returns ip address">getIp</a>()
  263. <a name="l00228"></a>00228 &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classNodeHandle.html#aef531103cdf07c8353267f4d30a80112" title="returns key of this NodeHandle">getKey</a>().<a class="code" href="classOverlayKey.html#aabeb4fd284a630a82e982ba34ece4fd9" title="Returns a string representation of this key.">toString</a>(16) &lt;&lt; <span class="stringliteral">&quot;)]\n&quot;</span>
  264. <a name="l00229"></a>00229 &lt;&lt; <span class="stringliteral">&quot; Subscription RPC Call timed out: id=&quot;</span> &lt;&lt; rpcId &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>
  265. <a name="l00230"></a>00230 &lt;&lt; <span class="stringliteral">&quot; msg=&quot;</span> &lt;&lt; *_PubSubSubscriptionCall
  266. <a name="l00231"></a>00231 &lt;&lt; <span class="stringliteral">&quot; oldNode=&quot;</span> &lt;&lt; dest
  267. <a name="l00232"></a>00232 &lt;&lt; endl;
  268. <a name="l00233"></a>00233 <span class="keywordflow">break</span>;
  269. <a name="l00234"></a>00234 }
  270. <a name="l00235"></a>00235 <a class="code" href="RpcMacros_8h.html#a29a8a3f21e67ecb25f58608a54df5191" title="Marks the end of a Remote-Procedure-Call Switch block.">RPC_SWITCH_END</a>( )
  271. <a name="l00236"></a>00236
  272. <a name="l00237"></a>00237 <span class="comment">// FIXME:</span>
  273. <a name="l00238"></a>00238 <span class="comment">// AdoptCall missing!</span>
  274. <a name="l00239"></a>00239 <span class="comment">// IntermediateCall missing!</span>
  275. <a name="l00240"></a>00240 <span class="comment">// (ResponsibleNodeCall missing)</span>
  276. <a name="l00241"></a>00241 <span class="comment">// (HelpCall missing)</span>
  277. <a name="l00242"></a>00242 }
  278. <a name="l00243"></a>00243
  279. <a name="l00244"></a><a class="code" href="classPubSubMMOG.html#a4af2596c5cc972a1c4dacfde82c989ee">00244</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a4af2596c5cc972a1c4dacfde82c989ee" title="Processes messages from underlay.">PubSubMMOG::handleUDPMessage</a>(<a class="code" href="classBaseOverlayMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">BaseOverlayMessage</a>* msg)
  280. <a name="l00245"></a>00245 {
  281. <a name="l00246"></a>00246 <span class="keywordflow">if</span>( <a class="code" href="classPubSubMoveListMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubMoveListMessage</a>* moveMsg = dynamic_cast&lt;PubSubMoveListMessage*&gt;(msg) ){
  282. <a name="l00247"></a>00247 <a class="code" href="classPubSubMMOG.html#a9d46909d81ca32d3ec2020a7184c3f50">handleMoveListMessage</a>( moveMsg );
  283. <a name="l00248"></a>00248 <span class="keyword">delete</span> moveMsg;
  284. <a name="l00249"></a>00249 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>( <a class="code" href="classPubSubMoveMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubMoveMessage</a>* moveMsg = dynamic_cast&lt;PubSubMoveMessage*&gt;(msg) ){
  285. <a name="l00250"></a>00250 <a class="code" href="classPubSubMMOG.html#aa5f5b3bb6f7a4a26ab45dfdb6248f21b">handleMoveMessage</a>( moveMsg );
  286. <a name="l00251"></a>00251 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>( <a class="code" href="classPubSubUnsubscriptionMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubUnsubscriptionMessage</a>* unsMsg = dynamic_cast&lt;PubSubUnsubscriptionMessage*&gt;(msg) ){
  287. <a name="l00252"></a>00252 <a class="code" href="classPubSubMMOG.html#a1e837eb023ac96a24c564e8c42da7c87">handleUnsubscriptionMessage</a>( unsMsg );
  288. <a name="l00253"></a>00253 <span class="keyword">delete</span> unsMsg;
  289. <a name="l00254"></a>00254 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>( <a class="code" href="classPubSubNodeLeftMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubNodeLeftMessage</a>* leftMsg = dynamic_cast&lt;PubSubNodeLeftMessage*&gt;(msg) ){
  290. <a name="l00255"></a>00255 <a class="code" href="classPubSubMMOG.html#a73afcba7483897f08cfb5d258e569683">handleNodeLeftMessage</a>( leftMsg );
  291. <a name="l00256"></a>00256 <span class="keyword">delete</span> leftMsg;
  292. <a name="l00257"></a>00257 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>( <a class="code" href="classPubSubReplacementMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubReplacementMessage</a>* replaceMsg = dynamic_cast&lt;PubSubReplacementMessage*&gt;(msg) ){
  293. <a name="l00258"></a>00258 <a class="code" href="classPubSubMMOG.html#abd3f25e6c1521cc5d6959fc1929a2ac6">handleReplacementMessage</a>( replaceMsg );
  294. <a name="l00259"></a>00259 <span class="keyword">delete</span> replaceMsg;
  295. <a name="l00260"></a>00260 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>( <a class="code" href="classPubSubBackupSubscriptionMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupSubscriptionMessage</a>* backupMsg = dynamic_cast&lt;PubSubBackupSubscriptionMessage*&gt;(msg) ){
  296. <a name="l00261"></a>00261 <a class="code" href="classPubSubMMOG.html#a354f1a0173cb3cc5a00bc7d16d17f73a">handleSubscriptionBackup</a>( backupMsg );
  297. <a name="l00262"></a>00262 <span class="keyword">delete</span> backupMsg;
  298. <a name="l00263"></a>00263 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>( <a class="code" href="classPubSubBackupUnsubscribeMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupUnsubscribeMessage</a>* backupMsg = dynamic_cast&lt;PubSubBackupUnsubscribeMessage*&gt;(msg) ){
  299. <a name="l00264"></a>00264 <a class="code" href="classPubSubMMOG.html#a74e961ef109ba657e32f82519721eeaf">handleUnsubscribeBackup</a>( backupMsg );
  300. <a name="l00265"></a>00265 <span class="keyword">delete</span> backupMsg;
  301. <a name="l00266"></a>00266 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>( <a class="code" href="classPubSubBackupIntermediateMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupIntermediateMessage</a>* backupMsg = dynamic_cast&lt;PubSubBackupIntermediateMessage*&gt;(msg) ){
  302. <a name="l00267"></a>00267 <a class="code" href="classPubSubMMOG.html#a77b144f6034216ef0184589cf5b4da8d">handleIntermediateBackup</a>( backupMsg );
  303. <a name="l00268"></a>00268 <span class="keyword">delete</span> backupMsg;
  304. <a name="l00269"></a>00269 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>( <a class="code" href="classPubSubReleaseIntermediateMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubReleaseIntermediateMessage</a>* releaseMsg = dynamic_cast&lt;PubSubReleaseIntermediateMessage*&gt;(msg) ){
  305. <a name="l00270"></a>00270 <a class="code" href="classPubSubMMOG.html#af1197b5fab38765c9e510cb6e755f62a">handleReleaseIntermediate</a>( releaseMsg );
  306. <a name="l00271"></a>00271 <span class="keyword">delete</span> releaseMsg;
  307. <a name="l00272"></a>00272 }
  308. <a name="l00273"></a>00273 }
  309. <a name="l00274"></a>00274
  310. <a name="l00275"></a><a class="code" href="classPubSubMMOG.html#a3df1116194918ab1768c1afbdef4fb00">00275</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a3df1116194918ab1768c1afbdef4fb00">PubSubMMOG::handleTimerEvent</a>(cMessage* msg)
  311. <a name="l00276"></a>00276 {
  312. <a name="l00277"></a>00277 <span class="keywordflow">if</span>( <a class="code" href="classPubSubTimer.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubTimer</a>* timer = dynamic_cast&lt;PubSubTimer*&gt;(msg) ) {
  313. <a name="l00278"></a>00278 <span class="keywordflow">switch</span>( timer-&gt;getType() ) {
  314. <a name="l00279"></a>00279 <span class="keywordflow">case</span> <a class="code" href="PubSubMessage__m_8h.html#ac87923fdb9d8348a9eb766921ec0e04caec28dc4bd962108ceb27575f46b81ebd">PUBSUB_HEARTBEAT</a>:
  315. <a name="l00280"></a>00280 <a class="code" href="classPubSubMMOG.html#a237b78a3abc9b6cbb95021e25306e2e2">sendHearbeatToChildren</a>();
  316. <a name="l00281"></a>00281 <a class="code" href="classPubSubMMOG.html#a7544c76d3fceee2a56dee1bdf63c4db1">startTimer</a>( timer );
  317. <a name="l00282"></a>00282 <span class="keywordflow">break</span>;
  318. <a name="l00283"></a>00283 <span class="keywordflow">case</span> <a class="code" href="PubSubMessage__m_8h.html#ac87923fdb9d8348a9eb766921ec0e04caa64f2984ebaaa94fb52bc3ff99d24fa1">PUBSUB_CHILDPING</a>:
  319. <a name="l00284"></a>00284 <a class="code" href="classPubSubMMOG.html#abd00be445c110f527365d00553713334">sendPingToChildren</a>();
  320. <a name="l00285"></a>00285 <a class="code" href="classPubSubMMOG.html#a7544c76d3fceee2a56dee1bdf63c4db1">startTimer</a>( timer );
  321. <a name="l00286"></a>00286 <span class="keywordflow">break</span>;
  322. <a name="l00287"></a>00287 <span class="keywordflow">case</span> <a class="code" href="PubSubMessage__m_8h.html#ac87923fdb9d8348a9eb766921ec0e04cad6da37474996a5016fe145fcc24a52c8">PUBSUB_PARENT_TIMEOUT</a>:
  323. <a name="l00288"></a>00288 <a class="code" href="classPubSubMMOG.html#a01a6bc8e4b0e38e57d2e3108088f67f3">handleParentTimeout</a>( timer );
  324. <a name="l00289"></a>00289 <span class="keywordflow">break</span>;
  325. <a name="l00290"></a>00290 <span class="keywordflow">case</span> <a class="code" href="PubSubMessage__m_8h.html#ac87923fdb9d8348a9eb766921ec0e04cab87b77accd020036a875063be27c753c">PUBSUB_EVENTDELIVERY</a>:
  326. <a name="l00291"></a>00291 <a class="code" href="classPubSubMMOG.html#a3c4d846c243253afb0f72592e44590ff">publishEvents</a>();
  327. <a name="l00292"></a>00292 <a class="code" href="classPubSubMMOG.html#a7544c76d3fceee2a56dee1bdf63c4db1">startTimer</a>( timer );
  328. <a name="l00293"></a>00293 <span class="keywordflow">break</span>;
  329. <a name="l00294"></a>00294 }
  330. <a name="l00295"></a>00295 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>( msg == <a class="code" href="classPubSubMMOG.html#a04199b677abdfd25b29f9a5f79c19426">joinTimer</a> ) {
  331. <a name="l00296"></a>00296 <span class="comment">// send a fake ready message to app to get initial position</span>
  332. <a name="l00297"></a>00297 <span class="comment">// Note: This is not consistent to the paper, where the lobby server</span>
  333. <a name="l00298"></a>00298 <span class="comment">// positions player. But it is needed for consistency with other MMOG protocols</span>
  334. <a name="l00299"></a>00299 <a class="code" href="classCompReadyMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">CompReadyMessage</a>* msg = <span class="keyword">new</span> <a class="code" href="classCompReadyMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">CompReadyMessage</a>(<span class="stringliteral">&quot;fake READY&quot;</span>);
  335. <a name="l00300"></a>00300 msg-&gt;<a class="code" href="classCompReadyMessage.html#ac5158504d6b97a32974f14c9b1a7a662">setReady</a>(<span class="keyword">true</span>);
  336. <a name="l00301"></a>00301 msg-&gt;<a class="code" href="classCompReadyMessage.html#ad9a52c5f788e0c11a75bbb5df3855ac0">setComp</a>(<a class="code" href="classBaseOverlay.html#a92e0d3f96a5716245465e05da60ef487">getThisCompType</a>());
  337. <a name="l00302"></a>00302 send( msg, <span class="stringliteral">&quot;appOut&quot;</span>);
  338. <a name="l00303"></a>00303 <span class="keyword">delete</span> <a class="code" href="classPubSubMMOG.html#a04199b677abdfd25b29f9a5f79c19426">joinTimer</a>;
  339. <a name="l00304"></a>00304 <a class="code" href="classPubSubMMOG.html#a04199b677abdfd25b29f9a5f79c19426">joinTimer</a> = NULL;
  340. <a name="l00305"></a>00305 <span class="comment">// send initial AOI size to the application</span>
  341. <a name="l00306"></a>00306 <span class="comment">// Note: This is not consistent to the paper.</span>
  342. <a name="l00307"></a>00307 <span class="comment">// But it is needed for this nodes movement generation within the application layer.</span>
  343. <a name="l00308"></a>00308 <a class="code" href="classGameAPIResizeAOIMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">GameAPIResizeAOIMessage</a>* gameMsg = <span class="keyword">new</span> <a class="code" href="classGameAPIResizeAOIMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">GameAPIResizeAOIMessage</a>(<span class="stringliteral">&quot;RESIZE_AOI&quot;</span>);
  344. <a name="l00309"></a>00309 gameMsg-&gt;<a class="code" href="classGameAPIMessage.html#a3c12a88e720037a70248b0db6a46fc99">setCommand</a>(<a class="code" href="CommonMessages__m_8h.html#ac76e82bc37e4b2b364247c7cff8f7b6ba04223e5523bbf330b2553e5ba3e320d1">RESIZE_AOI</a>);
  345. <a name="l00310"></a>00310 gameMsg-&gt;<a class="code" href="classGameAPIResizeAOIMessage.html#a8fc4ba8f739fae9c8f24eae1482271c3">setAOIsize</a>(<a class="code" href="classPubSubMMOG.html#ae02428124f2ac8a32da65ce4bcc7a927">AOIWidth</a>);
  346. <a name="l00311"></a>00311 send( gameMsg, <span class="stringliteral">&quot;appOut&quot;</span>);
  347. <a name="l00312"></a>00312 }
  348. <a name="l00313"></a>00313 }
  349. <a name="l00314"></a>00314
  350. <a name="l00315"></a><a class="code" href="classPubSubMMOG.html#aa755315cd277b3c3cad5522cb7acb9dc">00315</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#aa755315cd277b3c3cad5522cb7acb9dc" title="Processes &amp;quot;timer&amp;quot; self-messages.">PubSubMMOG::handleAppMessage</a>(cMessage* msg)
  351. <a name="l00316"></a>00316 {
  352. <a name="l00317"></a>00317 <span class="keywordflow">if</span>( <a class="code" href="classGameAPIPositionMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">GameAPIPositionMessage</a> *posMsg = dynamic_cast&lt;GameAPIPositionMessage*&gt;(msg) ) {
  353. <a name="l00318"></a>00318 <span class="keywordflow">if</span>( <a class="code" href="classBaseOverlay.html#ab4be6d88417117fbf33a445d56af2655">state</a> == <a class="code" href="classBaseOverlay.html#a0ad4b12b0c9949661f66db7fbbf7d40fab3a263fb274a58d63b15cd61ba910335">READY</a> ) {
  354. <a name="l00319"></a>00319 <a class="code" href="classPubSubMMOG.html#a271c0f8b14c7c023c26a1a3f19e156a4">handleMove</a>( posMsg );
  355. <a name="l00320"></a>00320 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( <a class="code" href="classBaseOverlay.html#ab4be6d88417117fbf33a445d56af2655">state</a> == <a class="code" href="classBaseOverlay.html#a0ad4b12b0c9949661f66db7fbbf7d40fabe22ce6e9471e472a566ba6cc27fbb5a">JOINING</a> ) {
  356. <a name="l00321"></a>00321 <span class="comment">// We are not connected to our responsible node, inform app</span>
  357. <a name="l00322"></a>00322 <a class="code" href="classCompReadyMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">CompReadyMessage</a>* msg = <span class="keyword">new</span> <a class="code" href="classCompReadyMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">CompReadyMessage</a>(<span class="stringliteral">&quot;Overlay not READY!&quot;</span>);
  358. <a name="l00323"></a>00323 msg-&gt;<a class="code" href="classCompReadyMessage.html#ac5158504d6b97a32974f14c9b1a7a662">setReady</a>(<span class="keyword">false</span>);
  359. <a name="l00324"></a>00324 msg-&gt;<a class="code" href="classCompReadyMessage.html#ad9a52c5f788e0c11a75bbb5df3855ac0">setComp</a>(<a class="code" href="classBaseOverlay.html#a92e0d3f96a5716245465e05da60ef487">getThisCompType</a>());
  360. <a name="l00325"></a>00325 send( msg, <span class="stringliteral">&quot;appOut&quot;</span>);
  361. <a name="l00326"></a>00326 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( <a class="code" href="classBaseOverlay.html#ab4be6d88417117fbf33a445d56af2655">state</a> == <a class="code" href="classBaseOverlay.html#a0ad4b12b0c9949661f66db7fbbf7d40fa4c1b397f6c4682baf7db280e7f15520a">INIT</a> ) {
  362. <a name="l00327"></a>00327 <span class="comment">// This is only called for the first MOVE message</span>
  363. <a name="l00328"></a>00328 <span class="comment">// Trigger login</span>
  364. <a name="l00329"></a>00329 <a class="code" href="classPubSubJoinCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubJoinCall</a>* joinMsg = <span class="keyword">new</span> <a class="code" href="classPubSubJoinCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubJoinCall</a>(<span class="stringliteral">&quot;Login&quot;</span>);
  365. <a name="l00330"></a>00330 joinMsg-&gt;<a class="code" href="classPubSubJoinCall.html#aa1d1f2b5fcf350365345935911a762b9">setPosition</a>( posMsg-&gt;getPosition() );
  366. <a name="l00331"></a>00331 <span class="comment">// FIXME: Ressource handling not yet supported!</span>
  367. <a name="l00332"></a>00332 joinMsg-&gt;<a class="code" href="classPubSubJoinCall.html#a671222a538f28ecafafef8991bf45dde">setRessources</a>( 4 );
  368. <a name="l00333"></a>00333 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( <a class="code" href="classPubSubMMOG.html#a1e1ba5fd3c791f3aa2172e6b055f68bb">lobbyServer</a>, joinMsg );
  369. <a name="l00334"></a>00334
  370. <a name="l00335"></a>00335 <a class="code" href="classBaseOverlay.html#ab4be6d88417117fbf33a445d56af2655">state</a> = JOINING;
  371. <a name="l00336"></a>00336 <a class="code" href="classPubSubMMOG.html#a3e573d9ce39091daea435016a587b239">setBootstrapedIcon</a>();
  372. <a name="l00337"></a>00337
  373. <a name="l00338"></a>00338 <span class="comment">// tell app to wait until login is confirmed...</span>
  374. <a name="l00339"></a>00339 <a class="code" href="classCompReadyMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">CompReadyMessage</a>* readyMsg = <span class="keyword">new</span> <a class="code" href="classCompReadyMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">CompReadyMessage</a>(<span class="stringliteral">&quot;Overlay not READY!&quot;</span>);
  375. <a name="l00340"></a>00340 readyMsg-&gt;<a class="code" href="classCompReadyMessage.html#ac5158504d6b97a32974f14c9b1a7a662">setReady</a>(<span class="keyword">false</span>);
  376. <a name="l00341"></a>00341 readyMsg-&gt;<a class="code" href="classCompReadyMessage.html#ad9a52c5f788e0c11a75bbb5df3855ac0">setComp</a>(<a class="code" href="classBaseOverlay.html#a92e0d3f96a5716245465e05da60ef487">getThisCompType</a>());
  377. <a name="l00342"></a>00342 send( readyMsg, <span class="stringliteral">&quot;appOut&quot;</span>);
  378. <a name="l00343"></a>00343
  379. <a name="l00344"></a>00344 <a class="code" href="classPubSubMMOG.html#a6adc937050de85cfcffa4561b6daee84">currentRegionX</a> = (<span class="keywordtype">unsigned</span> int) (posMsg-&gt;getPosition().x/<a class="code" href="classPubSubMMOG.html#a45ee110f2b164e1902266585eaa1fb2c">subspaceSize</a>);
  380. <a name="l00345"></a>00345 <a class="code" href="classPubSubMMOG.html#aa43137704c5ad5a9fecbff8a01ce38bc">currentRegionY</a> = (<span class="keywordtype">unsigned</span> int) (posMsg-&gt;getPosition().y/<a class="code" href="classPubSubMMOG.html#a45ee110f2b164e1902266585eaa1fb2c">subspaceSize</a>);
  381. <a name="l00346"></a>00346 }
  382. <a name="l00347"></a>00347 <span class="keyword">delete</span> msg;
  383. <a name="l00348"></a>00348 }
  384. <a name="l00349"></a>00349 }
  385. <a name="l00350"></a>00350
  386. <a name="l00351"></a><a class="code" href="classPubSubMMOG.html#a7d6b63042aee9dfbe3d11d2062a43a05">00351</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a7d6b63042aee9dfbe3d11d2062a43a05">PubSubMMOG::handleSubscriptionResponse</a>( <a class="code" href="classPubSubSubscriptionResponse.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubSubscriptionResponse</a>* subResp )
  387. <a name="l00352"></a>00352 {
  388. <a name="l00353"></a>00353 <span class="keywordflow">if</span>( subResp-&gt;<a class="code" href="classPubSubSubscriptionResponse.html#a8b39219b33424e4eeac34caa2b835156">getFailed</a>() ) {
  389. <a name="l00354"></a>00354 <span class="comment">// TODO: get new resp node...</span>
  390. <a name="l00355"></a>00355 } <span class="keywordflow">else</span> {
  391. <a name="l00356"></a>00356 <span class="keywordflow">if</span>( <a class="code" href="classBaseOverlay.html#ab4be6d88417117fbf33a445d56af2655">state</a> != <a class="code" href="classBaseOverlay.html#a0ad4b12b0c9949661f66db7fbbf7d40fab3a263fb274a58d63b15cd61ba910335">READY</a> ){
  392. <a name="l00357"></a>00357 <a class="code" href="classBaseOverlay.html#ab4be6d88417117fbf33a445d56af2655">state</a> = READY;
  393. <a name="l00358"></a>00358 <a class="code" href="classPubSubMMOG.html#a3e573d9ce39091daea435016a587b239">setBootstrapedIcon</a>();
  394. <a name="l00359"></a>00359 <a class="code" href="classCompReadyMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">CompReadyMessage</a>* readyMsg = <span class="keyword">new</span> <a class="code" href="classCompReadyMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">CompReadyMessage</a>(<span class="stringliteral">&quot;Overlay READY!&quot;</span>);
  395. <a name="l00360"></a>00360 readyMsg-&gt;<a class="code" href="classCompReadyMessage.html#ac5158504d6b97a32974f14c9b1a7a662">setReady</a>(<span class="keyword">true</span>);
  396. <a name="l00361"></a>00361 readyMsg-&gt;<a class="code" href="classCompReadyMessage.html#ad9a52c5f788e0c11a75bbb5df3855ac0">setComp</a>(<a class="code" href="classBaseOverlay.html#a92e0d3f96a5716245465e05da60ef487">getThisCompType</a>());
  397. <a name="l00362"></a>00362 sendDelayed( readyMsg, ceil(simTime()) - simTime(), <span class="stringliteral">&quot;appOut&quot;</span> );
  398. <a name="l00363"></a>00363 }
  399. <a name="l00364"></a>00364 }
  400. <a name="l00365"></a>00365 }
  401. <a name="l00366"></a>00366
  402. <a name="l00367"></a><a class="code" href="classPubSubMMOG.html#a90f7b9fa68b400b80892d642f4c439b4">00367</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a90f7b9fa68b400b80892d642f4c439b4">PubSubMMOG::handleJoinResponse</a>( <a class="code" href="classPubSubJoinResponse.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubJoinResponse</a>* joinResp )
  403. <a name="l00368"></a>00368 {
  404. <a name="l00369"></a>00369 <a class="code" href="classBaseOverlay.html#ab4be6d88417117fbf33a445d56af2655">state</a> = JOINING;
  405. <a name="l00370"></a>00370 <a class="code" href="classPubSubMMOG.html#a3e573d9ce39091daea435016a587b239">setBootstrapedIcon</a>();
  406. <a name="l00371"></a>00371 <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a> region( <a class="code" href="classPubSubMMOG.html#a6adc937050de85cfcffa4561b6daee84">currentRegionX</a>, <a class="code" href="classPubSubMMOG.html#aa43137704c5ad5a9fecbff8a01ce38bc">currentRegionY</a>, <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>);
  407. <a name="l00372"></a>00372
  408. <a name="l00373"></a>00373 <a class="code" href="classNodeHandle.html" title="This class implements a node handle.">NodeHandle</a> respNode = joinResp-&gt;<a class="code" href="classPubSubJoinResponse.html#af6b6ef0423fb75458fdde7f977ad8623">getResponsibleNode</a>();
  409. <a name="l00374"></a>00374 <a class="code" href="classPubSubSubspace.html">PubSubSubspace</a> sub(region);
  410. <a name="l00375"></a>00375 sub.<a class="code" href="classPubSubSubspace.html#addf352c69955906dd9bda7e0a0c09dbb">setResponsibleNode</a>( respNode );
  411. <a name="l00376"></a>00376 <a class="code" href="classPubSubMMOG.html#a0535f1d205515626aaa20d25f8da3cda">subscribedSubspaces</a>.push_back( sub );
  412. <a name="l00377"></a>00377 <span class="keywordflow">if</span>( respNode.<a class="code" href="classNodeHandle.html#ab5136375a4548ced7c2014a73c8743c9" title="indicates if this NodeHandle is specified">isUnspecified</a>() ) {
  413. <a name="l00378"></a>00378 <a class="code" href="classPubSubResponsibleNodeCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubResponsibleNodeCall</a>* respCall = <span class="keyword">new</span> <a class="code" href="classPubSubResponsibleNodeCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubResponsibleNodeCall</a>(<span class="stringliteral">&quot;Request Responsible NodeHandle&quot;</span>);
  414. <a name="l00379"></a>00379 respCall-&gt;<a class="code" href="classPubSubResponsibleNodeCall.html#a061903ad243ddb58c094ee5a3c5a206b">setSubspacePos</a>( <a class="code" href="classVector2D.html">Vector2D</a>(<a class="code" href="classPubSubMMOG.html#a6adc937050de85cfcffa4561b6daee84">currentRegionX</a>, <a class="code" href="classPubSubMMOG.html#aa43137704c5ad5a9fecbff8a01ce38bc">currentRegionY</a>) );
  415. <a name="l00380"></a>00380 respCall-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a5d4e7d4a5b91386ccba0e0a03330ab9d">PUBSUB_RESPONSIBLENODECALL_L</a>( respCall ) );
  416. <a name="l00381"></a>00381 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  417. <a name="l00382"></a>00382 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  418. <a name="l00383"></a>00383 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= respCall-&gt;getByteLength()
  419. <a name="l00384"></a>00384 );
  420. <a name="l00385"></a>00385 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( <a class="code" href="classPubSubMMOG.html#a1e1ba5fd3c791f3aa2172e6b055f68bb">lobbyServer</a>, respCall, NULL, 5, 5 ); <span class="comment">// FIXME: Make it a parameter...</span>
  421. <a name="l00386"></a>00386 } <span class="keywordflow">else</span> {
  422. <a name="l00387"></a>00387 <a class="code" href="classPubSubSubscriptionCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubSubscriptionCall</a>* subCall = <span class="keyword">new</span> <a class="code" href="classPubSubSubscriptionCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubSubscriptionCall</a>(<span class="stringliteral">&quot;JoinSubspace&quot;</span>);
  423. <a name="l00388"></a>00388 subCall-&gt;<a class="code" href="classPubSubSubscriptionCall.html#a355f33ad98b1c4c34b0a41196470f5c7">setSubspaceId</a>( region.<a class="code" href="classPubSubSubspaceId.html#afb4d71a54d5337d65bb89c27e4d4938c">getId</a>() );
  424. <a name="l00389"></a>00389 subCall-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a2b5451b24d68787636358002b3292042">PUBSUB_SUBSCRIPTIONCALL_L</a>( subCall ));
  425. <a name="l00390"></a>00390 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  426. <a name="l00391"></a>00391 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  427. <a name="l00392"></a>00392 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= subCall-&gt;getByteLength()
  428. <a name="l00393"></a>00393 );
  429. <a name="l00394"></a>00394 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( respNode, subCall );
  430. <a name="l00395"></a>00395 }
  431. <a name="l00396"></a>00396 }
  432. <a name="l00397"></a>00397
  433. <a name="l00398"></a><a class="code" href="classPubSubMMOG.html#a7e351287bef39afa54408e4fce0fdf26">00398</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a7e351287bef39afa54408e4fce0fdf26">PubSubMMOG::handleResponsibleNodeResponse</a>( <a class="code" href="classPubSubResponsibleNodeResponse.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubResponsibleNodeResponse</a>* subResp )
  434. <a name="l00399"></a>00399 {
  435. <a name="l00400"></a>00400 <span class="keywordtype">int</span> subspaceId = subResp-&gt;<a class="code" href="classPubSubResponsibleNodeResponse.html#a90f846a8230ff1c298116eae9320fc5f">getSubspaceId</a>();
  436. <a name="l00401"></a>00401 <a class="code" href="classNodeHandle.html" title="This class implements a node handle.">NodeHandle</a> respNode = subResp-&gt;<a class="code" href="classPubSubResponsibleNodeResponse.html#a9c9dcf7c0e9e43a34b80baba9761481d">getResponsibleNode</a>();
  437. <a name="l00402"></a>00402
  438. <a name="l00403"></a>00403 std::list&lt;PubSubSubspace&gt;::iterator it = <a class="code" href="classPubSubMMOG.html#a0535f1d205515626aaa20d25f8da3cda">subscribedSubspaces</a>.begin();
  439. <a name="l00404"></a>00404 <span class="keywordflow">while</span>( it != <a class="code" href="classPubSubMMOG.html#a0535f1d205515626aaa20d25f8da3cda">subscribedSubspaces</a>.end() ) {
  440. <a name="l00405"></a>00405 <span class="keywordflow">if</span>( it-&gt;getId().getId() == subspaceId) <span class="keywordflow">break</span>;
  441. <a name="l00406"></a>00406 ++it;
  442. <a name="l00407"></a>00407 }
  443. <a name="l00408"></a>00408 <span class="keywordflow">if</span>( it != <a class="code" href="classPubSubMMOG.html#a0535f1d205515626aaa20d25f8da3cda">subscribedSubspaces</a>.end() ) {
  444. <a name="l00409"></a>00409 it-&gt;setResponsibleNode( respNode );
  445. <a name="l00410"></a>00410
  446. <a name="l00411"></a>00411 <a class="code" href="classPubSubSubscriptionCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubSubscriptionCall</a>* subCall = <span class="keyword">new</span> <a class="code" href="classPubSubSubscriptionCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubSubscriptionCall</a>(<span class="stringliteral">&quot;JoinSubspace&quot;</span>);
  447. <a name="l00412"></a>00412 subCall-&gt;<a class="code" href="classPubSubSubscriptionCall.html#a355f33ad98b1c4c34b0a41196470f5c7">setSubspaceId</a>( subspaceId );
  448. <a name="l00413"></a>00413 subCall-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a2b5451b24d68787636358002b3292042">PUBSUB_SUBSCRIPTIONCALL_L</a>( subCall ));
  449. <a name="l00414"></a>00414 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  450. <a name="l00415"></a>00415 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  451. <a name="l00416"></a>00416 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= subCall-&gt;getByteLength()
  452. <a name="l00417"></a>00417 );
  453. <a name="l00418"></a>00418 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( respNode, subCall );
  454. <a name="l00419"></a>00419 }
  455. <a name="l00420"></a>00420 }
  456. <a name="l00421"></a>00421
  457. <a name="l00422"></a><a class="code" href="classPubSubMMOG.html#a1e837eb023ac96a24c564e8c42da7c87">00422</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a1e837eb023ac96a24c564e8c42da7c87">PubSubMMOG::handleUnsubscriptionMessage</a>( <a class="code" href="classPubSubUnsubscriptionMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubUnsubscriptionMessage</a>* unsMsg )
  458. <a name="l00423"></a>00423 {
  459. <a name="l00424"></a>00424 std::map&lt;PubSubSubspaceId, PubSubSubspaceResponsible&gt;::iterator it;
  460. <a name="l00425"></a>00425 it = <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.find( <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a>(unsMsg-&gt;<a class="code" href="classPubSubUnsubscriptionMessage.html#aefd5581bbccb1322572d4623a9b7098c">getSubspaceId</a>(), <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>) );
  461. <a name="l00426"></a>00426
  462. <a name="l00427"></a>00427 <span class="keywordflow">if</span>( it != <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.end() ) {
  463. <a name="l00428"></a>00428 <a class="code" href="classPubSubMMOG.html#a104570a1f3f3f4951bf67e9b8e09b0e8">unsubscribeChild</a>( unsMsg-&gt;<a class="code" href="classPubSubUnsubscriptionMessage.html#a4c20f9918ebc12a6567fb6600abbca19">getSrc</a>(), it-&gt;second );
  464. <a name="l00429"></a>00429 }
  465. <a name="l00430"></a>00430 }
  466. <a name="l00431"></a>00431
  467. <a name="l00432"></a><a class="code" href="classPubSubMMOG.html#a73afcba7483897f08cfb5d258e569683">00432</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a73afcba7483897f08cfb5d258e569683">PubSubMMOG::handleNodeLeftMessage</a>( <a class="code" href="classPubSubNodeLeftMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubNodeLeftMessage</a>* leftMsg )
  468. <a name="l00433"></a>00433 {
  469. <a name="l00434"></a>00434 std::map&lt;PubSubSubspaceId, PubSubSubspaceIntermediate&gt;::iterator it;
  470. <a name="l00435"></a>00435 it = <a class="code" href="classPubSubMMOG.html#ac2ff9ed8d82f2fd97f69343cd8ee78ac">intermediateSubspaces</a>.find( <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a>(leftMsg-&gt;<a class="code" href="classPubSubNodeLeftMessage.html#a5bdc2448771e8e102f2a1742669e3ff4">getSubspaceId</a>(), <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>) );
  471. <a name="l00436"></a>00436
  472. <a name="l00437"></a>00437 <span class="keywordflow">if</span>( it == <a class="code" href="classPubSubMMOG.html#ac2ff9ed8d82f2fd97f69343cd8ee78ac">intermediateSubspaces</a>.end() ) <span class="keywordflow">return</span>;
  473. <a name="l00438"></a>00438
  474. <a name="l00439"></a>00439 it-&gt;second.removeChild( leftMsg-&gt;<a class="code" href="classPubSubNodeLeftMessage.html#a3ade8236d7ce506a1805f3e1f7aa87d8">getNode</a>() );
  475. <a name="l00440"></a>00440 }
  476. <a name="l00441"></a>00441
  477. <a name="l00442"></a><a class="code" href="classPubSubMMOG.html#a3d1fd761fc46a4b56f1c7e852bf41207">00442</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a3d1fd761fc46a4b56f1c7e852bf41207">PubSubMMOG::handleSubscriptionCall</a>( <a class="code" href="classPubSubSubscriptionCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubSubscriptionCall</a>* subCall )
  478. <a name="l00443"></a>00443 {
  479. <a name="l00444"></a>00444 std::map&lt;PubSubSubspaceId, PubSubSubspaceResponsible&gt;::iterator it;
  480. <a name="l00445"></a>00445 it = <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.find( <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a>(subCall-&gt;<a class="code" href="classPubSubSubscriptionCall.html#a6cba83861e6c98de7a2721a596d2ff14">getSubspaceId</a>(), <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>) );
  481. <a name="l00446"></a>00446
  482. <a name="l00447"></a>00447 <a class="code" href="classPubSubBackupSubscriptionMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupSubscriptionMessage</a>* backupMsg = 0;
  483. <a name="l00448"></a>00448 <a class="code" href="classPubSubSubscriptionResponse.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubSubscriptionResponse</a>* resp;
  484. <a name="l00449"></a>00449 <span class="keywordflow">if</span>( it == <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.end() ) {
  485. <a name="l00450"></a>00450 resp = <span class="keyword">new</span> <a class="code" href="classPubSubSubscriptionResponse.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubSubscriptionResponse</a>(<span class="stringliteral">&quot;Subscription failed&quot;</span>);
  486. <a name="l00451"></a>00451 resp-&gt;<a class="code" href="classPubSubSubscriptionResponse.html#abad61d57d13b094bce4e5979ad5c58ff">setFailed</a>( <span class="keyword">true</span> );
  487. <a name="l00452"></a>00452 } <span class="keywordflow">else</span> {
  488. <a name="l00453"></a>00453 resp = <span class="keyword">new</span> <a class="code" href="classPubSubSubscriptionResponse.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubSubscriptionResponse</a>(<span class="stringliteral">&quot;Subscription successful&quot;</span>);
  489. <a name="l00454"></a>00454 backupMsg = <span class="keyword">new</span> <a class="code" href="classPubSubBackupSubscriptionMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupSubscriptionMessage</a>(<span class="stringliteral">&quot;Backup: new subscription&quot;</span>);
  490. <a name="l00455"></a>00455 backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#a3b6847353d9871bcc13c01ac682c7739">setSubspaceId</a>( subCall-&gt;<a class="code" href="classPubSubSubscriptionCall.html#a6cba83861e6c98de7a2721a596d2ff14">getSubspaceId</a>() );
  491. <a name="l00456"></a>00456 backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#ab3a10059be8de4c048576c72a1c83fc7">setChild</a>( subCall-&gt;<a class="code" href="classBaseRpcMessage.html#ada3e122125cfb5acc7350277ca69c45a">getSrcNode</a>() );
  492. <a name="l00457"></a>00457
  493. <a name="l00458"></a>00458 <span class="keywordflow">if</span>( it-&gt;second.addChild( subCall-&gt;<a class="code" href="classBaseRpcMessage.html#ada3e122125cfb5acc7350277ca69c45a">getSrcNode</a>() )) {
  494. <a name="l00459"></a>00459 <span class="comment">// We have still room for the child</span>
  495. <a name="l00460"></a>00460 backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#af4c25a5bb0a0f1efeb34cf2c13a9bc38">setParent</a>( <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a> );
  496. <a name="l00461"></a>00461 } <span class="keywordflow">else</span> {
  497. <a name="l00462"></a>00462 <span class="comment">// Child has to go to an intermediate node...</span>
  498. <a name="l00463"></a>00463 <span class="keywordflow">if</span>( <a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html">PubSubSubspaceResponsible::IntermediateNode</a>* iNode = it-&gt;second.getNextFreeIntermediate() ){
  499. <a name="l00464"></a>00464 <span class="comment">// find intermediate node with free slots</span>
  500. <a name="l00465"></a>00465 <a class="code" href="classPubSubAdoptChildCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubAdoptChildCall</a>* adoptCall = <span class="keyword">new</span> <a class="code" href="classPubSubAdoptChildCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubAdoptChildCall</a>(<span class="stringliteral">&quot;Adopt child&quot;</span>);
  501. <a name="l00466"></a>00466 adoptCall-&gt;<a class="code" href="classPubSubAdoptChildCall.html#a117550b7b25e69c5b16b35a6a7d6d019">setChild</a>( subCall-&gt;<a class="code" href="classBaseRpcMessage.html#ada3e122125cfb5acc7350277ca69c45a">getSrcNode</a>() );
  502. <a name="l00467"></a>00467 adoptCall-&gt;<a class="code" href="classPubSubAdoptChildCall.html#a2c7d51a5d0c8ef5b2f7a07d9a4559aa1">setSubspaceId</a>( subCall-&gt;<a class="code" href="classPubSubSubscriptionCall.html#a6cba83861e6c98de7a2721a596d2ff14">getSubspaceId</a>() );
  503. <a name="l00468"></a>00468 adoptCall-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a40172b8994bee9881c879d1f69994013">PUBSUB_ADOPTCHILDCALL_L</a>( adoptCall ));
  504. <a name="l00469"></a>00469 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( iNode-&gt;node, adoptCall );
  505. <a name="l00470"></a>00470 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  506. <a name="l00471"></a>00471 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  507. <a name="l00472"></a>00472 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= adoptCall-&gt;getByteLength()
  508. <a name="l00473"></a>00473 );
  509. <a name="l00474"></a>00474 iNode-&gt;waitingChildren++;
  510. <a name="l00475"></a>00475 } <span class="keywordflow">else</span> {
  511. <a name="l00476"></a>00476 <span class="comment">// no free slots available, create new intermediate node</span>
  512. <a name="l00477"></a>00477 <span class="comment">// FIXME: when getting two subscriptions at once, we&#39;re requesting too many intermediates</span>
  513. <a name="l00478"></a>00478 <a class="code" href="classPubSubHelpCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubHelpCall</a>* helpCall = <span class="keyword">new</span> <a class="code" href="classPubSubHelpCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubHelpCall</a>(<span class="stringliteral">&quot;I need an intermediate node&quot;</span>);
  514. <a name="l00479"></a>00479 helpCall-&gt;<a class="code" href="classPubSubHelpCall.html#a8f442b6f719d15e347aa4187fb3d2b47">setHelpType</a>( <a class="code" href="PubSubMessage__m_8h.html#a0a7abf0acc5a382f3b386ab1a09cd07aa99501a84d5d53b3a4c78362dc7c7a551">PUBSUB_INTERMEDIATE</a> );
  515. <a name="l00480"></a>00480 helpCall-&gt;<a class="code" href="classPubSubHelpCall.html#a526546e7f6cc281b640ffabca6fd4f29">setSubspaceId</a>( subCall-&gt;<a class="code" href="classPubSubSubscriptionCall.html#a6cba83861e6c98de7a2721a596d2ff14">getSubspaceId</a>() );
  516. <a name="l00481"></a>00481 helpCall-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#aac95c8ba038a0a9dd3671a29330493a9">PUBSUB_HELPCALL_L</a>( helpCall ));
  517. <a name="l00482"></a>00482 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( <a class="code" href="classPubSubMMOG.html#a1e1ba5fd3c791f3aa2172e6b055f68bb">lobbyServer</a>, helpCall );
  518. <a name="l00483"></a>00483 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  519. <a name="l00484"></a>00484 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  520. <a name="l00485"></a>00485 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= helpCall-&gt;getByteLength()
  521. <a name="l00486"></a>00486 );
  522. <a name="l00487"></a>00487 }
  523. <a name="l00488"></a>00488 }
  524. <a name="l00489"></a>00489 }
  525. <a name="l00490"></a>00490 resp-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a2d60280823412936f4ce8dc98ae3fb41">PUBSUB_SUBSCRIPTIONRESPONSE_L</a>( resp ));
  526. <a name="l00491"></a>00491 <a class="code" href="classBaseRpc.html#adc06091d348c98a5efbf54fe0afe8747" title="Send Remote-Procedure response message and deletes call message.">sendRpcResponse</a>( subCall, resp );
  527. <a name="l00492"></a>00492 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  528. <a name="l00493"></a>00493 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  529. <a name="l00494"></a>00494 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= resp-&gt;getByteLength()
  530. <a name="l00495"></a>00495 );
  531. <a name="l00496"></a>00496
  532. <a name="l00497"></a>00497 <span class="keywordflow">if</span>( it == <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.end() ) <span class="keywordflow">return</span>;
  533. <a name="l00498"></a>00498
  534. <a name="l00499"></a>00499 <span class="comment">// FIXME: just for testing</span>
  535. <a name="l00500"></a>00500 <a class="code" href="classPubSubSubspaceResponsible.html">PubSubSubspaceResponsible</a>&amp; subspace = it-&gt;second;
  536. <a name="l00501"></a>00501 <span class="keywordtype">int</span> iii = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a41dc142fbdac4eebcadd7b62ee0a822e">getTotalChildrenCount</a>();
  537. <a name="l00502"></a>00502 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ab2792e92420b16f1e971e9ff83ebce70">fixTotalChildrenCount</a>();
  538. <a name="l00503"></a>00503 <span class="keywordflow">if</span>( iii != subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a41dc142fbdac4eebcadd7b62ee0a822e">getTotalChildrenCount</a>() ){
  539. <a name="l00504"></a>00504 opp_error(<span class="stringliteral">&quot;Huh?&quot;</span>);
  540. <a name="l00505"></a>00505 }
  541. <a name="l00506"></a>00506
  542. <a name="l00507"></a>00507 <span class="keywordflow">if</span>( !it-&gt;second.getBackupNode().isUnspecified() ){
  543. <a name="l00508"></a>00508 backupMsg-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a485654404a477aa60cb34dd0ae722258">PUBSUB_BACKUPSUBSCRIPTION_L</a>( backupMsg ));
  544. <a name="l00509"></a>00509 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  545. <a name="l00510"></a>00510 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  546. <a name="l00511"></a>00511 pubSubSignalingMessagesSize+= backupMsg-&gt;getByteLength()
  547. <a name="l00512"></a>00512 );
  548. <a name="l00513"></a>00513 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( it-&gt;second.getBackupNode(), backupMsg );
  549. <a name="l00514"></a>00514 } <span class="keywordflow">else</span> {
  550. <a name="l00515"></a>00515 <span class="keyword">delete</span> backupMsg;
  551. <a name="l00516"></a>00516 }
  552. <a name="l00517"></a>00517 }
  553. <a name="l00518"></a>00518
  554. <a name="l00519"></a><a class="code" href="classPubSubMMOG.html#af504bf4e0b52404912395baefed9f5c5">00519</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#af504bf4e0b52404912395baefed9f5c5">PubSubMMOG::handleTakeOver</a>( <a class="code" href="classPubSubTakeOverSubspaceCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubTakeOverSubspaceCall</a>* toCall )
  555. <a name="l00520"></a>00520 {
  556. <a name="l00521"></a>00521 <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a> region((<span class="keywordtype">int</span>) toCall-&gt;<a class="code" href="classPubSubTakeOverSubspaceCall.html#afed679f34e29e2f4265a16e6e59e38ec">getSubspacePos</a>().<a class="code" href="classVector2D.html#ac5c4e553815737aa24bec8281270178f">x</a>, (int) toCall-&gt;<a class="code" href="classPubSubTakeOverSubspaceCall.html#afed679f34e29e2f4265a16e6e59e38ec">getSubspacePos</a>().<a class="code" href="classVector2D.html#ac38d0179cfe74c30fee290a703ab209a">y</a>, <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>);
  557. <a name="l00522"></a>00522
  558. <a name="l00523"></a>00523 <a class="code" href="classPubSubMMOG.html#a0fe097eb8ff809023d0a119b2dc17d61">takeOverNewSubspace</a>( region );
  559. <a name="l00524"></a>00524
  560. <a name="l00525"></a>00525 <a class="code" href="classPubSubTakeOverSubspaceResponse.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubTakeOverSubspaceResponse</a>* toResp = <span class="keyword">new</span> <a class="code" href="classPubSubTakeOverSubspaceResponse.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubTakeOverSubspaceResponse</a>(<span class="stringliteral">&quot;Accept subspace responsibility&quot;</span>);
  561. <a name="l00526"></a>00526 toResp-&gt;<a class="code" href="classPubSubTakeOverSubspaceResponse.html#ae49972429f20a87863627c7ec3e13ac4">setSubspacePos</a>( toCall-&gt;<a class="code" href="classPubSubTakeOverSubspaceCall.html#afed679f34e29e2f4265a16e6e59e38ec">getSubspacePos</a>() );
  562. <a name="l00527"></a>00527 toResp-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a4b113dcf08095771bd96237e30495a29">PUBSUB_TAKEOVERSUBSPACERESPONSE_L</a>( toResp ));
  563. <a name="l00528"></a>00528 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  564. <a name="l00529"></a>00529 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  565. <a name="l00530"></a>00530 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= toResp-&gt;getByteLength()
  566. <a name="l00531"></a>00531 );
  567. <a name="l00532"></a>00532 <a class="code" href="classBaseRpc.html#adc06091d348c98a5efbf54fe0afe8747" title="Send Remote-Procedure response message and deletes call message.">sendRpcResponse</a>( toCall, toResp );
  568. <a name="l00533"></a>00533 }
  569. <a name="l00534"></a>00534
  570. <a name="l00535"></a><a class="code" href="classPubSubMMOG.html#ac789c61936dbd0e4787822022f0ecfba">00535</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#ac789c61936dbd0e4787822022f0ecfba" title="callback-method for events at the NotificationBoard">PubSubMMOG::receiveChangeNotification</a>(<span class="keywordtype">int</span> category, <span class="keyword">const</span> cPolymorphic *details)
  571. <a name="l00536"></a>00536 {
  572. <a name="l00537"></a>00537 <span class="keywordflow">if</span>(category == NF_OVERLAY_NODE_GRACEFUL_LEAVE &amp;&amp; <a class="code" href="classBaseOverlay.html#ab4be6d88417117fbf33a445d56af2655">state</a> == <a class="code" href="classBaseOverlay.html#a0ad4b12b0c9949661f66db7fbbf7d40fab3a263fb274a58d63b15cd61ba910335">READY</a>) {
  573. <a name="l00538"></a>00538 }
  574. <a name="l00539"></a>00539 }
  575. <a name="l00540"></a>00540
  576. <a name="l00541"></a><a class="code" href="classPubSubMMOG.html#a271c0f8b14c7c023c26a1a3f19e156a4">00541</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a271c0f8b14c7c023c26a1a3f19e156a4">PubSubMMOG::handleMove</a>( <a class="code" href="classGameAPIPositionMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">GameAPIPositionMessage</a>* posMsg )
  577. <a name="l00542"></a>00542 {
  578. <a name="l00543"></a>00543 <a class="code" href="classPubSubMMOG.html#a6adc937050de85cfcffa4561b6daee84">currentRegionX</a> = (<span class="keywordtype">unsigned</span> int) (posMsg-&gt;<a class="code" href="classGameAPIPositionMessage.html#a62cb5e229193a2e0118e240de2494d53">getPosition</a>().<a class="code" href="classVector2D.html#ac5c4e553815737aa24bec8281270178f">x</a>/<a class="code" href="classPubSubMMOG.html#a45ee110f2b164e1902266585eaa1fb2c">subspaceSize</a>);
  579. <a name="l00544"></a>00544 <a class="code" href="classPubSubMMOG.html#aa43137704c5ad5a9fecbff8a01ce38bc">currentRegionY</a> = (<span class="keywordtype">unsigned</span> int) (posMsg-&gt;<a class="code" href="classGameAPIPositionMessage.html#a62cb5e229193a2e0118e240de2494d53">getPosition</a>().<a class="code" href="classVector2D.html#ac38d0179cfe74c30fee290a703ab209a">y</a>/<a class="code" href="classPubSubMMOG.html#a45ee110f2b164e1902266585eaa1fb2c">subspaceSize</a>);
  580. <a name="l00545"></a>00545
  581. <a name="l00546"></a>00546 <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a> region( <a class="code" href="classPubSubMMOG.html#a6adc937050de85cfcffa4561b6daee84">currentRegionX</a>, <a class="code" href="classPubSubMMOG.html#aa43137704c5ad5a9fecbff8a01ce38bc">currentRegionY</a>, <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>);
  582. <a name="l00547"></a>00547
  583. <a name="l00548"></a>00548 set&lt;PubSubSubspaceId&gt; expectedRegions;
  584. <a name="l00549"></a>00549 <span class="keywordtype">int</span> minX = (int) ((posMsg-&gt;<a class="code" href="classGameAPIPositionMessage.html#a62cb5e229193a2e0118e240de2494d53">getPosition</a>().<a class="code" href="classVector2D.html#ac5c4e553815737aa24bec8281270178f">x</a> - <a class="code" href="classPubSubMMOG.html#ae02428124f2ac8a32da65ce4bcc7a927">AOIWidth</a>)/<a class="code" href="classPubSubMMOG.html#a45ee110f2b164e1902266585eaa1fb2c">subspaceSize</a>);
  585. <a name="l00550"></a>00550 <span class="keywordflow">if</span>( minX &lt; 0 ) minX = 0;
  586. <a name="l00551"></a>00551 <span class="keywordtype">int</span> maxX = (int) ((posMsg-&gt;<a class="code" href="classGameAPIPositionMessage.html#a62cb5e229193a2e0118e240de2494d53">getPosition</a>().<a class="code" href="classVector2D.html#ac5c4e553815737aa24bec8281270178f">x</a> + <a class="code" href="classPubSubMMOG.html#ae02428124f2ac8a32da65ce4bcc7a927">AOIWidth</a>)/<a class="code" href="classPubSubMMOG.html#a45ee110f2b164e1902266585eaa1fb2c">subspaceSize</a>);
  587. <a name="l00552"></a>00552 <span class="keywordflow">if</span>( maxX &gt;= <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a> ) maxX = <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a> -1;
  588. <a name="l00553"></a>00553 <span class="keywordtype">int</span> minY = (int) ((posMsg-&gt;<a class="code" href="classGameAPIPositionMessage.html#a62cb5e229193a2e0118e240de2494d53">getPosition</a>().<a class="code" href="classVector2D.html#ac38d0179cfe74c30fee290a703ab209a">y</a> - <a class="code" href="classPubSubMMOG.html#ae02428124f2ac8a32da65ce4bcc7a927">AOIWidth</a>)/<a class="code" href="classPubSubMMOG.html#a45ee110f2b164e1902266585eaa1fb2c">subspaceSize</a>);
  589. <a name="l00554"></a>00554 <span class="keywordflow">if</span>( minY &lt; 0 ) minY = 0;
  590. <a name="l00555"></a>00555 <span class="keywordtype">int</span> maxY = (int) ((posMsg-&gt;<a class="code" href="classGameAPIPositionMessage.html#a62cb5e229193a2e0118e240de2494d53">getPosition</a>().<a class="code" href="classVector2D.html#ac38d0179cfe74c30fee290a703ab209a">y</a> + <a class="code" href="classPubSubMMOG.html#ae02428124f2ac8a32da65ce4bcc7a927">AOIWidth</a>)/<a class="code" href="classPubSubMMOG.html#a45ee110f2b164e1902266585eaa1fb2c">subspaceSize</a>);
  591. <a name="l00556"></a>00556 <span class="keywordflow">if</span>( maxY &gt;= <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a> ) maxY = <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a> -1;
  592. <a name="l00557"></a>00557
  593. <a name="l00558"></a>00558 <span class="comment">// FIXME: make parameter: unsubscription size</span>
  594. <a name="l00559"></a>00559 <span class="keywordtype">int</span> minUnsubX = (int) ((posMsg-&gt;<a class="code" href="classGameAPIPositionMessage.html#a62cb5e229193a2e0118e240de2494d53">getPosition</a>().<a class="code" href="classVector2D.html#ac5c4e553815737aa24bec8281270178f">x</a> - 1.5*<a class="code" href="classPubSubMMOG.html#ae02428124f2ac8a32da65ce4bcc7a927">AOIWidth</a>)/<a class="code" href="classPubSubMMOG.html#a45ee110f2b164e1902266585eaa1fb2c">subspaceSize</a>);
  595. <a name="l00560"></a>00560 <span class="keywordflow">if</span>( minUnsubX &lt; 0 ) minUnsubX = 0;
  596. <a name="l00561"></a>00561 <span class="keywordtype">int</span> maxUnsubX = (int) ((posMsg-&gt;<a class="code" href="classGameAPIPositionMessage.html#a62cb5e229193a2e0118e240de2494d53">getPosition</a>().<a class="code" href="classVector2D.html#ac5c4e553815737aa24bec8281270178f">x</a> + 1.5*<a class="code" href="classPubSubMMOG.html#ae02428124f2ac8a32da65ce4bcc7a927">AOIWidth</a>)/<a class="code" href="classPubSubMMOG.html#a45ee110f2b164e1902266585eaa1fb2c">subspaceSize</a>);
  597. <a name="l00562"></a>00562 <span class="keywordflow">if</span>( maxUnsubX &gt;= <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a> ) maxUnsubX = <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a> -1;
  598. <a name="l00563"></a>00563 <span class="keywordtype">int</span> minUnsubY = (int) ((posMsg-&gt;<a class="code" href="classGameAPIPositionMessage.html#a62cb5e229193a2e0118e240de2494d53">getPosition</a>().<a class="code" href="classVector2D.html#ac38d0179cfe74c30fee290a703ab209a">y</a> - 1.5*<a class="code" href="classPubSubMMOG.html#ae02428124f2ac8a32da65ce4bcc7a927">AOIWidth</a>)/<a class="code" href="classPubSubMMOG.html#a45ee110f2b164e1902266585eaa1fb2c">subspaceSize</a>);
  599. <a name="l00564"></a>00564 <span class="keywordflow">if</span>( minUnsubY &lt; 0 ) minUnsubY = 0;
  600. <a name="l00565"></a>00565 <span class="keywordtype">int</span> maxUnsubY = (int) ((posMsg-&gt;<a class="code" href="classGameAPIPositionMessage.html#a62cb5e229193a2e0118e240de2494d53">getPosition</a>().<a class="code" href="classVector2D.html#ac38d0179cfe74c30fee290a703ab209a">y</a> + 1.5+<a class="code" href="classPubSubMMOG.html#ae02428124f2ac8a32da65ce4bcc7a927">AOIWidth</a>)/<a class="code" href="classPubSubMMOG.html#a45ee110f2b164e1902266585eaa1fb2c">subspaceSize</a>);
  601. <a name="l00566"></a>00566 <span class="keywordflow">if</span>( maxUnsubY &gt;= <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a> ) maxUnsubY = <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a> -1;
  602. <a name="l00567"></a>00567
  603. <a name="l00568"></a>00568 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> x = minX; x &lt;= maxX; ++x ){
  604. <a name="l00569"></a>00569 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> y = minY; y &lt;= maxY; ++y ){
  605. <a name="l00570"></a>00570 expectedRegions.insert( <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a>( x, y, <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a> ));
  606. <a name="l00571"></a>00571 }
  607. <a name="l00572"></a>00572 }
  608. <a name="l00573"></a>00573
  609. <a name="l00574"></a>00574 list&lt;PubSubSubspace&gt;::iterator subIt = <a class="code" href="classPubSubMMOG.html#a0535f1d205515626aaa20d25f8da3cda">subscribedSubspaces</a>.begin();
  610. <a name="l00575"></a>00575 <a class="code" href="classPubSubSubspace.html">PubSubSubspace</a>* subspace = NULL;
  611. <a name="l00576"></a>00576 <span class="keywordflow">while</span>( subIt != <a class="code" href="classPubSubMMOG.html#a0535f1d205515626aaa20d25f8da3cda">subscribedSubspaces</a>.end() ){
  612. <a name="l00577"></a>00577 <span class="keywordflow">if</span>( subIt-&gt;getId() == region ){
  613. <a name="l00578"></a>00578 subspace = &amp;*subIt;
  614. <a name="l00579"></a>00579 }
  615. <a name="l00580"></a>00580 expectedRegions.erase( subIt-&gt;getId() );
  616. <a name="l00581"></a>00581
  617. <a name="l00582"></a>00582 <span class="comment">// unsubscribe region if to far away</span>
  618. <a name="l00583"></a>00583 <span class="keywordflow">if</span>( subIt-&gt;getId().getX() &lt; minX || subIt-&gt;getId().getX() &gt; maxX ||
  619. <a name="l00584"></a>00584 subIt-&gt;getId().getY() &lt; minY || subIt-&gt;getId().getY() &gt; maxY ){
  620. <a name="l00585"></a>00585 <span class="keywordflow">if</span>( !subIt-&gt;getResponsibleNode().isUnspecified() ){
  621. <a name="l00586"></a>00586 <a class="code" href="classPubSubUnsubscriptionMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubUnsubscriptionMessage</a>* unsubMsg = <span class="keyword">new</span> <a class="code" href="classPubSubUnsubscriptionMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubUnsubscriptionMessage</a>(<span class="stringliteral">&quot;Unsubscribe from subspace&quot;</span>);
  622. <a name="l00587"></a>00587 unsubMsg-&gt;<a class="code" href="classPubSubUnsubscriptionMessage.html#a656cf3c6c48c16578ae1d65b73877484">setSubspaceId</a>( subIt-&gt;getId().getId() );
  623. <a name="l00588"></a>00588 unsubMsg-&gt;<a class="code" href="classPubSubUnsubscriptionMessage.html#ac537ed0026c0ee573cec021ad1c36168">setSrc</a>( <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a> );
  624. <a name="l00589"></a>00589 unsubMsg-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a88c175706edd5bdd237ad0768aeb6ef8">PUBSUB_UNSUBSCRIPTION_L</a>( unsubMsg ));
  625. <a name="l00590"></a>00590 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  626. <a name="l00591"></a>00591 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  627. <a name="l00592"></a>00592 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= unsubMsg-&gt;getByteLength()
  628. <a name="l00593"></a>00593 );
  629. <a name="l00594"></a>00594 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( subIt-&gt;getResponsibleNode(), unsubMsg );
  630. <a name="l00595"></a>00595 }
  631. <a name="l00596"></a>00596 <span class="comment">// Erase subspace from subscribedList and increase iterator</span>
  632. <a name="l00597"></a>00597 <a class="code" href="classPubSubMMOG.html#a0535f1d205515626aaa20d25f8da3cda">subscribedSubspaces</a>.erase( subIt++ );
  633. <a name="l00598"></a>00598 } <span class="keywordflow">else</span> {
  634. <a name="l00599"></a>00599 ++subIt;
  635. <a name="l00600"></a>00600 }
  636. <a name="l00601"></a>00601 }
  637. <a name="l00602"></a>00602
  638. <a name="l00603"></a>00603 <span class="comment">// if any &quot;near&quot; region is not yet subscribed, subscribe</span>
  639. <a name="l00604"></a>00604 <span class="keywordflow">for</span>( set&lt;PubSubSubspaceId&gt;::iterator regionIt = expectedRegions.begin(); regionIt != expectedRegions.end(); ++regionIt ){
  640. <a name="l00605"></a>00605 <a class="code" href="classPubSubSubspace.html">PubSubSubspace</a> sub( *regionIt );
  641. <a name="l00606"></a>00606 <a class="code" href="classPubSubMMOG.html#a0535f1d205515626aaa20d25f8da3cda">subscribedSubspaces</a>.push_back( sub );
  642. <a name="l00607"></a>00607 <a class="code" href="classPubSubResponsibleNodeCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubResponsibleNodeCall</a>* respCall = <span class="keyword">new</span> <a class="code" href="classPubSubResponsibleNodeCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubResponsibleNodeCall</a>(<span class="stringliteral">&quot;Request Responsible NodeHandle&quot;</span>);
  643. <a name="l00608"></a>00608 respCall-&gt;<a class="code" href="classPubSubResponsibleNodeCall.html#a061903ad243ddb58c094ee5a3c5a206b">setSubspacePos</a>( <a class="code" href="classVector2D.html">Vector2D</a>(regionIt-&gt;getX(), regionIt-&gt;getY()) );
  644. <a name="l00609"></a>00609 respCall-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a5d4e7d4a5b91386ccba0e0a03330ab9d">PUBSUB_RESPONSIBLENODECALL_L</a>( respCall ));
  645. <a name="l00610"></a>00610 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  646. <a name="l00611"></a>00611 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  647. <a name="l00612"></a>00612 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= respCall-&gt;getByteLength()
  648. <a name="l00613"></a>00613 );
  649. <a name="l00614"></a>00614 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( <a class="code" href="classPubSubMMOG.html#a1e1ba5fd3c791f3aa2172e6b055f68bb">lobbyServer</a>, respCall, NULL, 5, 5 ); <span class="comment">// FIXME: Make it a parameter...</span>
  650. <a name="l00615"></a>00615 }
  651. <a name="l00616"></a>00616
  652. <a name="l00617"></a>00617 <span class="keywordflow">if</span>( subspace &amp;&amp; !subspace-&gt;<a class="code" href="classPubSubSubspace.html#a996b0242f4c47164d5ee2141755d8fb1">getResponsibleNode</a>().<a class="code" href="classNodeHandle.html#ab5136375a4548ced7c2014a73c8743c9" title="indicates if this NodeHandle is specified">isUnspecified</a>() ){
  653. <a name="l00618"></a>00618 <a class="code" href="classPubSubMoveMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubMoveMessage</a>* moveMsg = <span class="keyword">new</span> <a class="code" href="classPubSubMoveMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubMoveMessage</a>(<span class="stringliteral">&quot;Player move&quot;</span>);
  654. <a name="l00619"></a>00619 moveMsg-&gt;<a class="code" href="classPubSubMoveMessage.html#a3681b2b0d2e91725b8b2ed5f5a41e0eb">setSubspaceId</a>( region.<a class="code" href="classPubSubSubspaceId.html#afb4d71a54d5337d65bb89c27e4d4938c">getId</a>() );
  655. <a name="l00620"></a>00620 moveMsg-&gt;<a class="code" href="classPubSubMoveMessage.html#a81e96c238b0ae5e817f068e40d18c1b4">setPlayer</a>( <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a> );
  656. <a name="l00621"></a>00621 moveMsg-&gt;<a class="code" href="classPubSubMoveMessage.html#a519aeb2020aac887bd7b2955fbde056a">setPosition</a>( posMsg-&gt;<a class="code" href="classGameAPIPositionMessage.html#a62cb5e229193a2e0118e240de2494d53">getPosition</a>() );
  657. <a name="l00622"></a>00622 moveMsg-&gt;<a class="code" href="classPubSubMoveMessage.html#ae6b89218819defd7251470d3c5a7ab57">setTimestamp</a>( simTime() );
  658. <a name="l00623"></a>00623 moveMsg-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a07feb8f3c2aaad5db67ec6860dec5c5d">PUBSUB_MOVE_L</a>( moveMsg ));
  659. <a name="l00624"></a>00624 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  660. <a name="l00625"></a>00625 ++<a class="code" href="classPubSubMMOG.html#a11ca86e89977d8bb4d1512a5e64ce8d3">numMoveMessages</a>;
  661. <a name="l00626"></a>00626 <a class="code" href="classPubSubMMOG.html#a122b6f4eacfc82a453cdabace026a0d5">moveMessagesSize</a>+= moveMsg-&gt;getByteLength()
  662. <a name="l00627"></a>00627 );
  663. <a name="l00628"></a>00628 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( subspace-&gt;<a class="code" href="classPubSubSubspace.html#a996b0242f4c47164d5ee2141755d8fb1">getResponsibleNode</a>(), moveMsg );
  664. <a name="l00629"></a>00629 } <span class="keywordflow">else</span> {
  665. <a name="l00630"></a>00630 <span class="comment">// trying to move to not-yet subscribed region</span>
  666. <a name="l00631"></a>00631 <span class="comment">// FIXME: change state to JOINING?</span>
  667. <a name="l00632"></a>00632 }
  668. <a name="l00633"></a>00633 }
  669. <a name="l00634"></a>00634
  670. <a name="l00635"></a><a class="code" href="classPubSubMMOG.html#aa5f5b3bb6f7a4a26ab45dfdb6248f21b">00635</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#aa5f5b3bb6f7a4a26ab45dfdb6248f21b">PubSubMMOG::handleMoveMessage</a>( <a class="code" href="classPubSubMoveMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubMoveMessage</a>* moveMsg )
  671. <a name="l00636"></a>00636 {
  672. <a name="l00637"></a>00637 std::map&lt;PubSubSubspaceId, PubSubSubspaceResponsible&gt;::iterator it;
  673. <a name="l00638"></a>00638 it = <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.find( <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a>(moveMsg-&gt;<a class="code" href="classPubSubMoveMessage.html#ac5824dff148c7bface7054d5c257e14d">getSubspaceId</a>(), <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>) );
  674. <a name="l00639"></a>00639 <span class="keywordflow">if</span>( it == <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.end() ){
  675. <a name="l00640"></a>00640 EV &lt;&lt; <span class="stringliteral">&quot;[PubSubMMOG::handleMoveMessage() @ &quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classTransportAddress.html#a00e613d98d3412e2b92897c25aa0eb4c" title="returns ip address">getIp</a>()
  676. <a name="l00641"></a>00641 &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classNodeHandle.html#aef531103cdf07c8353267f4d30a80112" title="returns key of this NodeHandle">getKey</a>().<a class="code" href="classOverlayKey.html#aabeb4fd284a630a82e982ba34ece4fd9" title="Returns a string representation of this key.">toString</a>(16) &lt;&lt; <span class="stringliteral">&quot;)]\n&quot;</span>
  677. <a name="l00642"></a>00642 &lt;&lt; <span class="stringliteral">&quot; received moveMessage for unknown subspace&quot;</span> &lt;&lt; moveMsg-&gt;<a class="code" href="classPubSubMoveMessage.html#ac5824dff148c7bface7054d5c257e14d">getSubspaceId</a>() &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>
  678. <a name="l00643"></a>00643 &lt;&lt; endl;
  679. <a name="l00644"></a>00644 <span class="keywordflow">return</span>;
  680. <a name="l00645"></a>00645 }
  681. <a name="l00646"></a>00646
  682. <a name="l00647"></a>00647 <span class="comment">// If message arrived in the correct timeslot, store move message until deadline</span>
  683. <a name="l00648"></a>00648 <span class="comment">// Note: This assumes, we get no messages with future timestamps. At least in</span>
  684. <a name="l00649"></a>00649 <span class="comment">// the simulation, this assumption will hold.</span>
  685. <a name="l00650"></a>00650 <span class="comment">// The allowOldMoveMessages parameter allows overriding the timeslot barriers and forward all</span>
  686. <a name="l00651"></a>00651 <span class="comment">// messages.</span>
  687. <a name="l00652"></a>00652 <span class="keywordflow">if</span>( <a class="code" href="classPubSubMMOG.html#aced8c7945b0f77560359167cc5f398f6">allowOldMoveMessages</a> || moveMsg-&gt;<a class="code" href="classPubSubMoveMessage.html#a6cbaea29f897c198f6de3afa14226055">getTimestamp</a>() &gt;= <a class="code" href="classPubSubMMOG.html#a5c7d73c47298f65748e65abc506b9611">eventDeliveryTimer</a>-&gt;getArrivalTime() - 1.0/(2*<a class="code" href="classPubSubMMOG.html#a228fe6f61d1fe510d1336296c4bf254c">movementRate</a>) ){
  688. <a name="l00653"></a>00653 it-&gt;second.waitingMoveMessages.push_back( moveMsg );
  689. <a name="l00654"></a>00654 ++<a class="code" href="classPubSubMMOG.html#a0adb17b77190fd14c0979fe39a5889cc">numEventsCorrectTimeslot</a>;
  690. <a name="l00655"></a>00655 } <span class="keywordflow">else</span> {
  691. <a name="l00656"></a>00656 EV &lt;&lt; <span class="stringliteral">&quot;[PubSubMMOG::handleMoveMessage() @ &quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classTransportAddress.html#a00e613d98d3412e2b92897c25aa0eb4c" title="returns ip address">getIp</a>()
  692. <a name="l00657"></a>00657 &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classNodeHandle.html#aef531103cdf07c8353267f4d30a80112" title="returns key of this NodeHandle">getKey</a>().<a class="code" href="classOverlayKey.html#aabeb4fd284a630a82e982ba34ece4fd9" title="Returns a string representation of this key.">toString</a>(16) &lt;&lt; <span class="stringliteral">&quot;)]\n&quot;</span>
  693. <a name="l00658"></a>00658 &lt;&lt; <span class="stringliteral">&quot; received moveMesage with Timestamp: &quot;</span> &lt;&lt; moveMsg-&gt;<a class="code" href="classPubSubMoveMessage.html#a6cbaea29f897c198f6de3afa14226055">getTimestamp</a>() &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>
  694. <a name="l00659"></a>00659 &lt;&lt; <span class="stringliteral">&quot; deadline was: &quot;</span> &lt;&lt; <a class="code" href="classPubSubMMOG.html#a5c7d73c47298f65748e65abc506b9611">eventDeliveryTimer</a>-&gt;getArrivalTime() - 1.0/(2*<a class="code" href="classPubSubMMOG.html#a228fe6f61d1fe510d1336296c4bf254c">movementRate</a>) &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>
  695. <a name="l00660"></a>00660 &lt;&lt; endl;
  696. <a name="l00661"></a>00661 ++<a class="code" href="classPubSubMMOG.html#aa809123a9ef7f64ea622400ed60a2d4c">numEventsWrongTimeslot</a>;
  697. <a name="l00662"></a>00662 cancelAndDelete( moveMsg );
  698. <a name="l00663"></a>00663 }
  699. <a name="l00664"></a>00664 }
  700. <a name="l00665"></a>00665
  701. <a name="l00666"></a><a class="code" href="classPubSubMMOG.html#a9d46909d81ca32d3ec2020a7184c3f50">00666</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a9d46909d81ca32d3ec2020a7184c3f50">PubSubMMOG::handleMoveListMessage</a>( <a class="code" href="classPubSubMoveListMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubMoveListMessage</a>* moveMsg )
  702. <a name="l00667"></a>00667 {
  703. <a name="l00668"></a>00668 simtime_t timestamp = moveMsg-&gt;<a class="code" href="classPubSubMoveListMessage.html#a3d67a3591e45877525dbd887bd3406d0">getTimestamp</a>();
  704. <a name="l00669"></a>00669
  705. <a name="l00670"></a>00670 <span class="comment">// If I&#39;m intermediate node for this subspace, forward message to children</span>
  706. <a name="l00671"></a>00671 std::map&lt;PubSubSubspaceId, PubSubSubspaceIntermediate&gt;::iterator it;
  707. <a name="l00672"></a>00672 it = <a class="code" href="classPubSubMMOG.html#ac2ff9ed8d82f2fd97f69343cd8ee78ac">intermediateSubspaces</a>.find( <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a>(moveMsg-&gt;<a class="code" href="classPubSubMoveListMessage.html#ac3f12e1ebacfa47cfcdfb5d032be6a55">getSubspaceId</a>(), <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>) );
  708. <a name="l00673"></a>00673 <span class="keywordflow">if</span>( it != <a class="code" href="classPubSubMMOG.html#ac2ff9ed8d82f2fd97f69343cd8ee78ac">intermediateSubspaces</a>.end() ){
  709. <a name="l00674"></a>00674 <span class="comment">// Forward only if the message has not already been forwarded</span>
  710. <a name="l00675"></a>00675 <span class="keywordflow">if</span>( it-&gt;second.getLastTimestamp() &lt; moveMsg-&gt;<a class="code" href="classPubSubMoveListMessage.html#a3d67a3591e45877525dbd887bd3406d0">getTimestamp</a>() ){
  711. <a name="l00676"></a>00676 set&lt;NodeHandle&gt;::iterator childIt;
  712. <a name="l00677"></a>00677 <span class="keywordflow">for</span>( childIt = it-&gt;second.children.begin(); childIt != it-&gt;second.children.end(); ++childIt ){
  713. <a name="l00678"></a>00678 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( *childIt, (<a class="code" href="classBaseOverlayMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">BaseOverlayMessage</a>*) moveMsg-&gt;<a class="code" href="classPubSubMoveListMessage.html#a5d61d0f12b29063f944e6fd5775d3da7">dup</a>() );
  714. <a name="l00679"></a>00679 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  715. <a name="l00680"></a>00680 ++<a class="code" href="classPubSubMMOG.html#ae81f55efe5b21342597e408ff3474eee">numMoveListMessages</a>;
  716. <a name="l00681"></a>00681 <a class="code" href="classPubSubMMOG.html#a5a665dd74681081d669ea57efd5d83b0">moveListMessagesSize</a>+= moveMsg-&gt;getByteLength()
  717. <a name="l00682"></a>00682 );
  718. <a name="l00683"></a>00683 }
  719. <a name="l00684"></a>00684 it-&gt;second.setTimestamp( timestamp );
  720. <a name="l00685"></a>00685 }
  721. <a name="l00686"></a>00686 }
  722. <a name="l00687"></a>00687
  723. <a name="l00688"></a>00688 <span class="comment">// If I&#39;m subscribed to the subspace, transfer a GameAPIMoveList to app</span>
  724. <a name="l00689"></a>00689 std::list&lt;PubSubSubspace&gt;::iterator subIt;
  725. <a name="l00690"></a>00690 <span class="keywordflow">for</span>( subIt = <a class="code" href="classPubSubMMOG.html#a0535f1d205515626aaa20d25f8da3cda">subscribedSubspaces</a>.begin(); subIt != <a class="code" href="classPubSubMMOG.html#a0535f1d205515626aaa20d25f8da3cda">subscribedSubspaces</a>.end(); ++subIt ){
  726. <a name="l00691"></a>00691 <span class="keywordflow">if</span>( subIt-&gt;getId().getId() == moveMsg-&gt;<a class="code" href="classPubSubMoveListMessage.html#ac3f12e1ebacfa47cfcdfb5d032be6a55">getSubspaceId</a>() ){
  727. <a name="l00692"></a>00692 <span class="keywordflow">if</span>( subIt-&gt;getLastTimestamp() &lt; moveMsg-&gt;<a class="code" href="classPubSubMoveListMessage.html#a3d67a3591e45877525dbd887bd3406d0">getTimestamp</a>() ){
  728. <a name="l00693"></a>00693 <a class="code" href="classGameAPIListMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">GameAPIListMessage</a>* moveList = <span class="keyword">new</span> <a class="code" href="classGameAPIListMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">GameAPIListMessage</a>(<span class="stringliteral">&quot;player position update&quot;</span>);
  729. <a name="l00694"></a>00694 moveList-&gt;<a class="code" href="classGameAPIMessage.html#a3c12a88e720037a70248b0db6a46fc99">setCommand</a>( <a class="code" href="CommonMessages__m_8h.html#ac76e82bc37e4b2b364247c7cff8f7b6ba360dbdf5c7f61a4d26263e2a010057d7">NEIGHBOR_UPDATE</a> );
  730. <a name="l00695"></a>00695 moveList-&gt;<a class="code" href="classGameAPIListMessage.html#a6bac1604abbdf9c0ec959343b7b64834">setAddNeighborArraySize</a>( moveMsg-&gt;<a class="code" href="classPubSubMoveListMessage.html#aa41dbdd97c91926ec1b86116a9750802">getPlayerArraySize</a>() );
  731. <a name="l00696"></a>00696 moveList-&gt;<a class="code" href="classGameAPIListMessage.html#a81292ede7c0903f5982efcc7625024f1">setNeighborPositionArraySize</a>( moveMsg-&gt;<a class="code" href="classPubSubMoveListMessage.html#a2f87ee7e50d5d28b31f86dd2cc219d63">getPositionArraySize</a>() );
  732. <a name="l00697"></a>00697 <span class="keywordflow">for</span>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; moveMsg-&gt;<a class="code" href="classPubSubMoveListMessage.html#aa41dbdd97c91926ec1b86116a9750802">getPlayerArraySize</a>(); ++i ){
  733. <a name="l00698"></a>00698 moveList-&gt;<a class="code" href="classGameAPIListMessage.html#ad0a32a6a2f89f49e1824578e0b7a640a">setAddNeighbor</a>( i, moveMsg-&gt;<a class="code" href="classPubSubMoveListMessage.html#a6c8be50200570e0c4c45dd809c3b5dbe">getPlayer</a>(i) );
  734. <a name="l00699"></a>00699 moveList-&gt;<a class="code" href="classGameAPIListMessage.html#a32b3e775c8f0f5b850bf3047f7ddc30f">setNeighborPosition</a>( i, moveMsg-&gt;<a class="code" href="classPubSubMoveListMessage.html#a59cce8e96288c2874df9d3fe72096fa8">getPosition</a>(i) );
  735. <a name="l00700"></a>00700 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  736. <a name="l00701"></a>00701 <a class="code" href="classBaseRpc.html#a9552ba3a2b09c83b3c561e65dab9f23d" title="pointer to GlobalStatistics module in this node">globalStatistics</a>-&gt;<a class="code" href="classGlobalStatistics.html#a6a697a0b67f344e4bc214159761f943a" title="Add a new value to the cStdDev container specified by the name parameter.">addStdDev</a>(<span class="stringliteral">&quot;PubSubMMOG: MoveDelay&quot;</span>,
  737. <a name="l00702"></a>00702 SIMTIME_DBL(simTime() - timestamp + moveMsg-&gt;<a class="code" href="classPubSubMoveListMessage.html#a75c129b174b7e91b314cb13c475f3021">getPositionAge</a>(i)) );
  738. <a name="l00703"></a>00703 );
  739. <a name="l00704"></a>00704 }
  740. <a name="l00705"></a>00705 send( moveList, <span class="stringliteral">&quot;appOut&quot;</span> );
  741. <a name="l00706"></a>00706 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  742. <a name="l00707"></a>00707 <span class="keywordflow">if</span>( timestamp &lt; simTime() - <a class="code" href="classPubSubMMOG.html#a219753e4fc3eae95cd21f70bc40017e7">maxMoveDelay</a> ){
  743. <a name="l00708"></a>00708 ++<a class="code" href="classPubSubMMOG.html#a1450e36b5a7103fe4581f271fac13340">lostMovementLists</a>;
  744. <a name="l00709"></a>00709 } <span class="keywordflow">else</span> {
  745. <a name="l00710"></a>00710 ++<a class="code" href="classPubSubMMOG.html#a8415fe6a47b3b961fd54f9e3b5f8d3f0">receivedMovementLists</a>;
  746. <a name="l00711"></a>00711 }
  747. <a name="l00712"></a>00712 <span class="keywordflow">if</span>( subIt-&gt;getLastTimestamp() != 0) <a class="code" href="classPubSubMMOG.html#a1450e36b5a7103fe4581f271fac13340">lostMovementLists</a> += (<span class="keywordtype">int</span>)(SIMTIME_DBL(timestamp - subIt-&gt;getLastTimestamp())*<a class="code" href="classPubSubMMOG.html#a228fe6f61d1fe510d1336296c4bf254c">movementRate</a> -1);
  748. <a name="l00713"></a>00713
  749. <a name="l00714"></a>00714 );
  750. <a name="l00715"></a>00715 subIt-&gt;setTimestamp( timestamp );
  751. <a name="l00716"></a>00716 }
  752. <a name="l00717"></a>00717 <span class="keywordflow">return</span>;
  753. <a name="l00718"></a>00718 }
  754. <a name="l00719"></a>00719 }
  755. <a name="l00720"></a>00720 }
  756. <a name="l00721"></a>00721
  757. <a name="l00722"></a><a class="code" href="classPubSubMMOG.html#a7d28b4484518dcf34fbc2cb462bf620b">00722</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a7d28b4484518dcf34fbc2cb462bf620b">PubSubMMOG::handleHelpResponse</a>( <a class="code" href="classPubSubHelpResponse.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubHelpResponse</a>* helpResp )
  758. <a name="l00723"></a>00723 {
  759. <a name="l00724"></a>00724 <span class="comment">// lobby server answered our call for help</span>
  760. <a name="l00725"></a>00725 <span class="comment">// (i.e. he sends us a candidate for backup/intermediate nodes</span>
  761. <a name="l00726"></a>00726 <span class="keywordflow">if</span>( helpResp-&gt;<a class="code" href="classPubSubHelpResponse.html#a22f7d6407dbc34eed5cab79a3a0d27bb">getHelpType</a>() == PUBSUB_BACKUP ){
  762. <a name="l00727"></a>00727 <a class="code" href="classPubSubBackupCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupCall</a>* backupCall = <span class="keyword">new</span> <a class="code" href="classPubSubBackupCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupCall</a>(<span class="stringliteral">&quot;Become my backup node!&quot;</span>);
  763. <a name="l00728"></a>00728 backupCall-&gt;<a class="code" href="classPubSubBackupCall.html#a6ab72a64e226c723778471d63351709b">setSubspaceId</a>( helpResp-&gt;<a class="code" href="classPubSubHelpResponse.html#a3dfeaa012bc872e1ebdfe89e57af4e38">getSubspaceId</a>() );
  764. <a name="l00729"></a>00729
  765. <a name="l00730"></a>00730 <span class="comment">// Find the subspace in the subspace map</span>
  766. <a name="l00731"></a>00731 std::map&lt;PubSubSubspaceId, PubSubSubspaceResponsible&gt;::iterator it;
  767. <a name="l00732"></a>00732 it = <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.find( <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a>(helpResp-&gt;<a class="code" href="classPubSubHelpResponse.html#a3dfeaa012bc872e1ebdfe89e57af4e38">getSubspaceId</a>(), <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>) );
  768. <a name="l00733"></a>00733 <span class="keywordflow">if</span>( it == <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.end() ){
  769. <a name="l00734"></a>00734 EV &lt;&lt; <span class="stringliteral">&quot;[PubSubMMOG::handleHelpResponse() @ &quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classTransportAddress.html#a00e613d98d3412e2b92897c25aa0eb4c" title="returns ip address">getIp</a>()
  770. <a name="l00735"></a>00735 &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classNodeHandle.html#aef531103cdf07c8353267f4d30a80112" title="returns key of this NodeHandle">getKey</a>().<a class="code" href="classOverlayKey.html#aabeb4fd284a630a82e982ba34ece4fd9" title="Returns a string representation of this key.">toString</a>(16) &lt;&lt; <span class="stringliteral">&quot;)]\n&quot;</span>
  771. <a name="l00736"></a>00736 &lt;&lt; <span class="stringliteral">&quot; received helpResponse for unknown subspace&quot;</span> &lt;&lt; helpResp-&gt;<a class="code" href="classPubSubHelpResponse.html#a3dfeaa012bc872e1ebdfe89e57af4e38">getSubspaceId</a>() &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>
  772. <a name="l00737"></a>00737 &lt;&lt; endl;
  773. <a name="l00738"></a>00738 <span class="keywordflow">return</span>;
  774. <a name="l00739"></a>00739 }
  775. <a name="l00740"></a>00740 <a class="code" href="classPubSubSubspaceResponsible.html">PubSubSubspaceResponsible</a>&amp; subspace = it-&gt;second;
  776. <a name="l00741"></a>00741
  777. <a name="l00742"></a>00742 <span class="comment">// Assume the new backup will not refuse his task</span>
  778. <a name="l00743"></a>00743 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a462a25a436aa25d8cc38310119a5d671">setBackupNode</a>( helpResp-&gt;<a class="code" href="classPubSubHelpResponse.html#a380c4de936be194d72ff943761e2f6dc">getNode</a>() );
  779. <a name="l00744"></a>00744
  780. <a name="l00745"></a>00745 <span class="comment">// FIXME: just for testing</span>
  781. <a name="l00746"></a>00746 <span class="keywordtype">int</span> iii = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a41dc142fbdac4eebcadd7b62ee0a822e">getTotalChildrenCount</a>();
  782. <a name="l00747"></a>00747 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ab2792e92420b16f1e971e9ff83ebce70">fixTotalChildrenCount</a>();
  783. <a name="l00748"></a>00748 <span class="keywordflow">if</span>( iii != subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a41dc142fbdac4eebcadd7b62ee0a822e">getTotalChildrenCount</a>() ){
  784. <a name="l00749"></a>00749 opp_error(<span class="stringliteral">&quot;Huh?&quot;</span>);
  785. <a name="l00750"></a>00750 }
  786. <a name="l00751"></a>00751
  787. <a name="l00752"></a>00752 <span class="comment">// backup the load balancing tree</span>
  788. <a name="l00753"></a>00753 backupCall-&gt;<a class="code" href="classPubSubBackupCall.html#a6a950c9a840ca3ab3bddfa5d61f87fa7">setChildrenArraySize</a>( subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a41dc142fbdac4eebcadd7b62ee0a822e">getTotalChildrenCount</a>() );
  789. <a name="l00754"></a>00754 backupCall-&gt;<a class="code" href="classPubSubBackupCall.html#ac5761ad291a99fda13ebb23d5adc8f62">setChildrenPosArraySize</a>( subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a41dc142fbdac4eebcadd7b62ee0a822e">getTotalChildrenCount</a>() );
  790. <a name="l00755"></a>00755 backupCall-&gt;<a class="code" href="classPubSubBackupCall.html#a35e138c413c33667d8c1be7a8f8e84fa">setIntermediatesArraySize</a>( subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.size() );
  791. <a name="l00756"></a>00756
  792. <a name="l00757"></a>00757 set&lt;NodeHandle&gt;::iterator childIt;
  793. <a name="l00758"></a>00758 map&lt;NodeHandle, bool&gt;::iterator childMapIt;
  794. <a name="l00759"></a>00759 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0;
  795. <a name="l00760"></a>00760 <span class="keywordflow">for</span>( childMapIt = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0dad92f50458f0daf1f719c842661a7b">cachedChildren</a>.begin(); childMapIt != subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0dad92f50458f0daf1f719c842661a7b">cachedChildren</a>.end(); ++childMapIt ){
  796. <a name="l00761"></a>00761 backupCall-&gt;<a class="code" href="classPubSubBackupCall.html#a52748a54593511a55a0485028d3eab6a">setChildren</a>(i, childMapIt-&gt;first);
  797. <a name="l00762"></a>00762 backupCall-&gt;<a class="code" href="classPubSubBackupCall.html#a361dbd938656d13424a03efb9c6e24b6">setChildrenPos</a>(i, -2);
  798. <a name="l00763"></a>00763 ++i;
  799. <a name="l00764"></a>00764 }
  800. <a name="l00765"></a>00765 <span class="keywordflow">for</span>( childIt = subspace.<a class="code" href="classPubSubSubspaceIntermediate.html#aef3a0468a7eb4cbd84f774e2de574b16">children</a>.begin(); childIt != subspace.<a class="code" href="classPubSubSubspaceIntermediate.html#aef3a0468a7eb4cbd84f774e2de574b16">children</a>.end(); ++childIt ){
  801. <a name="l00766"></a>00766 backupCall-&gt;<a class="code" href="classPubSubBackupCall.html#a52748a54593511a55a0485028d3eab6a">setChildren</a>(i, *childIt);
  802. <a name="l00767"></a>00767 backupCall-&gt;<a class="code" href="classPubSubBackupCall.html#a361dbd938656d13424a03efb9c6e24b6">setChildrenPos</a>(i, -1);
  803. <a name="l00768"></a>00768 ++i;
  804. <a name="l00769"></a>00769 }
  805. <a name="l00770"></a>00770 <span class="keywordflow">for</span>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ii = 0; ii &lt; subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.size(); ++ii ){
  806. <a name="l00771"></a>00771 <a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html">PubSubSubspaceResponsible::IntermediateNode</a>&amp; iNode = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>[ii];
  807. <a name="l00772"></a>00772 backupCall-&gt;<a class="code" href="classPubSubBackupCall.html#a208443ba3ffe4f6b2d865467ff445221">setIntermediates</a>(ii, iNode.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a597257efca218f9499aa4e113d99e139">node</a>);
  808. <a name="l00773"></a>00773 <span class="keywordflow">for</span>( childIt = iNode.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a2ddae3a07ad454ef312681659588b92a">children</a>.begin(); childIt != iNode.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a2ddae3a07ad454ef312681659588b92a">children</a>.end(); ++childIt ){
  809. <a name="l00774"></a>00774 backupCall-&gt;<a class="code" href="classPubSubBackupCall.html#a52748a54593511a55a0485028d3eab6a">setChildren</a>(i, *childIt);
  810. <a name="l00775"></a>00775 backupCall-&gt;<a class="code" href="classPubSubBackupCall.html#a361dbd938656d13424a03efb9c6e24b6">setChildrenPos</a>(i, ii);
  811. <a name="l00776"></a>00776 ++i;
  812. <a name="l00777"></a>00777 }
  813. <a name="l00778"></a>00778 }
  814. <a name="l00779"></a>00779
  815. <a name="l00780"></a>00780 backupCall-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a571c4080ef67f0cfe61d2e1a8f80243d">PUBSUB_BACKUPCALL_L</a>( backupCall ));
  816. <a name="l00781"></a>00781 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  817. <a name="l00782"></a>00782 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  818. <a name="l00783"></a>00783 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= backupCall-&gt;getByteLength()
  819. <a name="l00784"></a>00784 );
  820. <a name="l00785"></a>00785 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( helpResp-&gt;<a class="code" href="classPubSubHelpResponse.html#a380c4de936be194d72ff943761e2f6dc">getNode</a>(), backupCall );
  821. <a name="l00786"></a>00786
  822. <a name="l00787"></a>00787 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>( helpResp-&gt;<a class="code" href="classPubSubHelpResponse.html#a22f7d6407dbc34eed5cab79a3a0d27bb">getHelpType</a>() == PUBSUB_INTERMEDIATE ){
  823. <a name="l00788"></a>00788 <a class="code" href="classPubSubIntermediateCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubIntermediateCall</a>* intermediateCall = <span class="keyword">new</span> <a class="code" href="classPubSubIntermediateCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubIntermediateCall</a>(<span class="stringliteral">&quot;Become my intermediate node!&quot;</span>);
  824. <a name="l00789"></a>00789 intermediateCall-&gt;<a class="code" href="classPubSubIntermediateCall.html#a3bc74e30d831eee9481f62ce671f1b70">setSubspaceId</a>( helpResp-&gt;<a class="code" href="classPubSubHelpResponse.html#a3dfeaa012bc872e1ebdfe89e57af4e38">getSubspaceId</a>() );
  825. <a name="l00790"></a>00790 intermediateCall-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a961df784f796bd894a954761e5585e72">PUBSUB_INTERMEDIATECALL_L</a>( intermediateCall ));
  826. <a name="l00791"></a>00791 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  827. <a name="l00792"></a>00792 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  828. <a name="l00793"></a>00793 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= intermediateCall-&gt;getByteLength()
  829. <a name="l00794"></a>00794 );
  830. <a name="l00795"></a>00795 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( helpResp-&gt;<a class="code" href="classPubSubHelpResponse.html#a380c4de936be194d72ff943761e2f6dc">getNode</a>(), intermediateCall );
  831. <a name="l00796"></a>00796 }
  832. <a name="l00797"></a>00797 }
  833. <a name="l00798"></a>00798
  834. <a name="l00799"></a><a class="code" href="classPubSubMMOG.html#ac7e55bce3aa2a48f4367977e081eb9e1">00799</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#ac7e55bce3aa2a48f4367977e081eb9e1">PubSubMMOG::handleBackupCall</a>( <a class="code" href="classPubSubBackupCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupCall</a>* backupCall )
  835. <a name="l00800"></a>00800 {
  836. <a name="l00801"></a>00801 <span class="keywordtype">int</span> intId = backupCall-&gt;<a class="code" href="classPubSubBackupCall.html#a78774c6987e65617ae00b8f896f2963b">getSubspaceId</a>();
  837. <a name="l00802"></a>00802 <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a> subspaceId(intId, <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>);
  838. <a name="l00803"></a>00803
  839. <a name="l00804"></a>00804 <span class="comment">// Start Heartbeat Timer</span>
  840. <a name="l00805"></a>00805 <a class="code" href="classPubSubTimer.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubTimer</a>* <a class="code" href="classPubSubMMOG.html#a98fd6baf72474a184c902133581273fa">parentTimeout</a> = <span class="keyword">new</span> <a class="code" href="classPubSubTimer.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubTimer</a>(<span class="stringliteral">&quot;ParentTimeout&quot;</span>);
  841. <a name="l00806"></a>00806 parentTimeout-&gt;<a class="code" href="classPubSubTimer.html#a09825991200a1fa76d4cfc9549ac51f5">setType</a>( <a class="code" href="PubSubMessage__m_8h.html#ac87923fdb9d8348a9eb766921ec0e04cad6da37474996a5016fe145fcc24a52c8">PUBSUB_PARENT_TIMEOUT</a> );
  842. <a name="l00807"></a>00807 parentTimeout-&gt;<a class="code" href="classPubSubTimer.html#a9b0ce83bc691ae0d4d35844c6aac569b">setSubspaceId</a>( intId );
  843. <a name="l00808"></a>00808 <a class="code" href="classPubSubMMOG.html#a7544c76d3fceee2a56dee1bdf63c4db1">startTimer</a>( parentTimeout );
  844. <a name="l00809"></a>00809
  845. <a name="l00810"></a>00810 <span class="comment">// insert subspace into responsible list</span>
  846. <a name="l00811"></a>00811 <a class="code" href="classPubSubSubspaceResponsible.html">PubSubSubspaceResponsible</a> subspace( subspaceId );
  847. <a name="l00812"></a>00812 subspace.<a class="code" href="classPubSubSubspace.html#addf352c69955906dd9bda7e0a0c09dbb">setResponsibleNode</a>( backupCall-&gt;<a class="code" href="classBaseRpcMessage.html#ada3e122125cfb5acc7350277ca69c45a">getSrcNode</a>() );
  848. <a name="l00813"></a>00813 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a807b58c353071f116890aa5fbe6c47b2">setHeartbeatTimer</a>( parentTimeout );
  849. <a name="l00814"></a>00814
  850. <a name="l00815"></a>00815 <span class="comment">// recounstruct load balancing tree</span>
  851. <a name="l00816"></a>00816 <span class="keywordflow">for</span>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; backupCall-&gt;<a class="code" href="classPubSubBackupCall.html#a2212ccff087366a67e9a2d1fa78f561c">getIntermediatesArraySize</a>(); ++i ){
  852. <a name="l00817"></a>00817 <a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html">PubSubSubspaceResponsible::IntermediateNode</a> iNode;
  853. <a name="l00818"></a>00818 iNode.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a597257efca218f9499aa4e113d99e139">node</a> = backupCall-&gt;<a class="code" href="classPubSubBackupCall.html#a613d13441964c55384fd9aff6c260c65">getIntermediates</a>(i);
  854. <a name="l00819"></a>00819 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.push_back( iNode );
  855. <a name="l00820"></a>00820 }
  856. <a name="l00821"></a>00821 <span class="keywordflow">for</span>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; backupCall-&gt;<a class="code" href="classPubSubBackupCall.html#a25900d74688009c610a11996861cd2cc">getChildrenArraySize</a>(); ++i ){
  857. <a name="l00822"></a>00822 <span class="keywordtype">int</span> pos = backupCall-&gt;<a class="code" href="classPubSubBackupCall.html#ae6261425fc1f1b5eb1febe963b14e386">getChildrenPos</a>( i );
  858. <a name="l00823"></a>00823 <span class="keywordflow">if</span>( pos == -2 ){
  859. <a name="l00824"></a>00824 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0dad92f50458f0daf1f719c842661a7b">cachedChildren</a>.insert( make_pair( backupCall-&gt;<a class="code" href="classPubSubBackupCall.html#a3038e30f56f73cb460d72bbee8b2f13d">getChildren</a>(i), false ));
  860. <a name="l00825"></a>00825 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>( pos == -1 ){
  861. <a name="l00826"></a>00826 subspace.<a class="code" href="classPubSubSubspaceIntermediate.html#aef3a0468a7eb4cbd84f774e2de574b16">children</a>.insert( backupCall-&gt;<a class="code" href="classPubSubBackupCall.html#a3038e30f56f73cb460d72bbee8b2f13d">getChildren</a>(i) );
  862. <a name="l00827"></a>00827 } <span class="keywordflow">else</span> {
  863. <a name="l00828"></a>00828 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>[pos].children.insert( backupCall-&gt;<a class="code" href="classPubSubBackupCall.html#a3038e30f56f73cb460d72bbee8b2f13d">getChildren</a>(i) );
  864. <a name="l00829"></a>00829 }
  865. <a name="l00830"></a>00830 }
  866. <a name="l00831"></a>00831
  867. <a name="l00832"></a>00832 <a class="code" href="classPubSubMMOG.html#a9cb86fc744b2f9b087a66e0af879f1fc">backupSubspaces</a>.insert( make_pair(subspaceId, subspace) );
  868. <a name="l00833"></a>00833
  869. <a name="l00834"></a>00834 <a class="code" href="classPubSubBackupResponse.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupResponse</a>* backupResp = <span class="keyword">new</span> <a class="code" href="classPubSubBackupResponse.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupResponse</a>(<span class="stringliteral">&quot;I&#39;ll be your backup&quot;</span>);
  870. <a name="l00835"></a>00835 backupResp-&gt;<a class="code" href="classPubSubBackupResponse.html#a8635388afb5931d313140c3f9d3d9b8d">setSubspaceId</a>( intId );
  871. <a name="l00836"></a>00836 backupResp-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a3a767754300bd5331a8bfabb54477377">PUBSUB_BACKUPRESPONSE_L</a>( backupResp ));
  872. <a name="l00837"></a>00837 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  873. <a name="l00838"></a>00838 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  874. <a name="l00839"></a>00839 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= backupResp-&gt;getByteLength()
  875. <a name="l00840"></a>00840 );
  876. <a name="l00841"></a>00841 <a class="code" href="classBaseRpc.html#adc06091d348c98a5efbf54fe0afe8747" title="Send Remote-Procedure response message and deletes call message.">sendRpcResponse</a>( backupCall, backupResp );
  877. <a name="l00842"></a>00842 }
  878. <a name="l00843"></a>00843
  879. <a name="l00844"></a><a class="code" href="classPubSubMMOG.html#a401659ffbdca793a6f7d97e9737a70d0">00844</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a401659ffbdca793a6f7d97e9737a70d0">PubSubMMOG::handleBackupResponse</a>( <a class="code" href="classPubSubBackupResponse.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupResponse</a>* backupResp )
  880. <a name="l00845"></a>00845 {
  881. <a name="l00846"></a>00846 <span class="comment">// Nothing to be done</span>
  882. <a name="l00847"></a>00847 <span class="comment">// HandleHelpResponse() already did everything important</span>
  883. <a name="l00848"></a>00848 }
  884. <a name="l00849"></a>00849
  885. <a name="l00850"></a><a class="code" href="classPubSubMMOG.html#a77d17c923e8b43f0bf38222dd58d3969">00850</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a77d17c923e8b43f0bf38222dd58d3969">PubSubMMOG::handleIntermediateCall</a>( <a class="code" href="classPubSubIntermediateCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubIntermediateCall</a>* intermediateCall )
  886. <a name="l00851"></a>00851 {
  887. <a name="l00852"></a>00852 <span class="comment">// insert subspace into intermediate list</span>
  888. <a name="l00853"></a>00853 <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a> subspaceId(intermediateCall-&gt;<a class="code" href="classPubSubIntermediateCall.html#aae48f9b0cfa46ea154a2ff0ed6edfb73">getSubspaceId</a>(), <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>);
  889. <a name="l00854"></a>00854 <a class="code" href="classPubSubSubspaceIntermediate.html">PubSubSubspaceIntermediate</a> subspace( subspaceId );
  890. <a name="l00855"></a>00855 subspace.setResponsibleNode( intermediateCall-&gt;<a class="code" href="classBaseRpcMessage.html#ada3e122125cfb5acc7350277ca69c45a">getSrcNode</a>() );
  891. <a name="l00856"></a>00856 subspace.setTimestamp(0);
  892. <a name="l00857"></a>00857 <a class="code" href="classPubSubMMOG.html#ac2ff9ed8d82f2fd97f69343cd8ee78ac">intermediateSubspaces</a>.insert( make_pair(subspaceId, subspace) );
  893. <a name="l00858"></a>00858
  894. <a name="l00859"></a>00859 <a class="code" href="classPubSubIntermediateResponse.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubIntermediateResponse</a>* iResp = <span class="keyword">new</span> <a class="code" href="classPubSubIntermediateResponse.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubIntermediateResponse</a>(<span class="stringliteral">&quot;I&#39;ll be your intermediate node&quot;</span>);
  895. <a name="l00860"></a>00860 iResp-&gt;<a class="code" href="classPubSubIntermediateResponse.html#a1eead87d5182177810012b77b6a62c01">setSubspaceId</a>( intermediateCall-&gt;<a class="code" href="classPubSubIntermediateCall.html#aae48f9b0cfa46ea154a2ff0ed6edfb73">getSubspaceId</a>() );
  896. <a name="l00861"></a>00861 iResp-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a520b21326aecd010016e460c12c4a572">PUBSUB_INTERMEDIATERESPONSE_L</a>( iResp ));
  897. <a name="l00862"></a>00862 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  898. <a name="l00863"></a>00863 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  899. <a name="l00864"></a>00864 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= iResp-&gt;getByteLength()
  900. <a name="l00865"></a>00865 );
  901. <a name="l00866"></a>00866 <a class="code" href="classBaseRpc.html#adc06091d348c98a5efbf54fe0afe8747" title="Send Remote-Procedure response message and deletes call message.">sendRpcResponse</a>( intermediateCall, iResp );
  902. <a name="l00867"></a>00867 }
  903. <a name="l00868"></a>00868
  904. <a name="l00869"></a><a class="code" href="classPubSubMMOG.html#ac41702ca41ffae439637504939856f4f">00869</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#ac41702ca41ffae439637504939856f4f">PubSubMMOG::handleIntermediateResponse</a>( <a class="code" href="classPubSubIntermediateResponse.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubIntermediateResponse</a>* intermediateResp )
  905. <a name="l00870"></a>00870 {
  906. <a name="l00871"></a>00871 <span class="comment">// we found a new intermediate node for a subspace</span>
  907. <a name="l00872"></a>00872 std::map&lt;PubSubSubspaceId, PubSubSubspaceResponsible&gt;::iterator it;
  908. <a name="l00873"></a>00873 it = <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.find( <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a>(intermediateResp-&gt;<a class="code" href="classPubSubIntermediateResponse.html#a10274ee87eb24712c45b63ac3456d835">getSubspaceId</a>(), <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>) );
  909. <a name="l00874"></a>00874 <span class="keywordflow">if</span>( it == <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.end() ) {
  910. <a name="l00875"></a>00875 EV &lt;&lt; <span class="stringliteral">&quot;[PubSubMMOG::handleIntermediateResponse() @ &quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classTransportAddress.html#a00e613d98d3412e2b92897c25aa0eb4c" title="returns ip address">getIp</a>()
  911. <a name="l00876"></a>00876 &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classNodeHandle.html#aef531103cdf07c8353267f4d30a80112" title="returns key of this NodeHandle">getKey</a>().<a class="code" href="classOverlayKey.html#aabeb4fd284a630a82e982ba34ece4fd9" title="Returns a string representation of this key.">toString</a>(16) &lt;&lt; <span class="stringliteral">&quot;)]\n&quot;</span>
  912. <a name="l00877"></a>00877 &lt;&lt; <span class="stringliteral">&quot; Received Intermediate Response for unknown Subspace!\n&quot;</span>
  913. <a name="l00878"></a>00878 &lt;&lt; endl;
  914. <a name="l00879"></a>00879 <span class="keywordflow">return</span>;
  915. <a name="l00880"></a>00880 }
  916. <a name="l00881"></a>00881 <a class="code" href="classPubSubSubspaceResponsible.html">PubSubSubspaceResponsible</a>&amp; subspace = it-&gt;second;
  917. <a name="l00882"></a>00882 <a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html">PubSubSubspaceResponsible::IntermediateNode</a> iNode;
  918. <a name="l00883"></a>00883 iNode.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a597257efca218f9499aa4e113d99e139">node</a> = intermediateResp-&gt;<a class="code" href="classBaseRpcMessage.html#ada3e122125cfb5acc7350277ca69c45a">getSrcNode</a>();
  919. <a name="l00884"></a>00884
  920. <a name="l00885"></a>00885 <span class="comment">// if there is any broken intermediate node in list, replace it</span>
  921. <a name="l00886"></a>00886 <span class="keywordtype">bool</span> newIntermediate = <span class="keyword">true</span>;
  922. <a name="l00887"></a>00887 deque&lt;PubSubSubspaceResponsible::IntermediateNode&gt;::iterator iit;
  923. <a name="l00888"></a>00888 <span class="keywordflow">for</span>( iit = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.begin(); iit != subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.end(); ++iit ){
  924. <a name="l00889"></a>00889 <span class="keywordflow">if</span>( iit-&gt;node.isUnspecified() ){
  925. <a name="l00890"></a>00890 iit-&gt;node = iNode.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a597257efca218f9499aa4e113d99e139">node</a>;
  926. <a name="l00891"></a>00891 newIntermediate = <span class="keyword">false</span>;
  927. <a name="l00892"></a>00892 <span class="keywordflow">break</span>;
  928. <a name="l00893"></a>00893 }
  929. <a name="l00894"></a>00894 }
  930. <a name="l00895"></a>00895 <span class="keywordflow">if</span>( iit == subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.end() ){
  931. <a name="l00896"></a>00896 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.push_back( iNode );
  932. <a name="l00897"></a>00897 iit = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.end() - 1;
  933. <a name="l00898"></a>00898 }
  934. <a name="l00899"></a>00899
  935. <a name="l00900"></a>00900 <span class="comment">// inform Backup</span>
  936. <a name="l00901"></a>00901 <span class="keywordflow">if</span>( !subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0c585a0f9e8162d0bd55a9698b5bff34">getBackupNode</a>().<a class="code" href="classNodeHandle.html#ab5136375a4548ced7c2014a73c8743c9" title="indicates if this NodeHandle is specified">isUnspecified</a>() ){
  937. <a name="l00902"></a>00902 <a class="code" href="classPubSubBackupIntermediateMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupIntermediateMessage</a>* backupMsg = <span class="keyword">new</span> <a class="code" href="classPubSubBackupIntermediateMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupIntermediateMessage</a>(<span class="stringliteral">&quot;Backup: new Intermediate&quot;</span>);
  938. <a name="l00903"></a>00903 backupMsg-&gt;<a class="code" href="classPubSubBackupIntermediateMessage.html#ae84b3d586b249c5d8b0c99cc5d199a5a">setSubspaceId</a>( intermediateResp-&gt;<a class="code" href="classPubSubIntermediateResponse.html#a10274ee87eb24712c45b63ac3456d835">getSubspaceId</a>() );
  939. <a name="l00904"></a>00904 backupMsg-&gt;<a class="code" href="classPubSubBackupIntermediateMessage.html#a43a3abbbddbcdc5f14dc38867bab7b2c">setNode</a>( iNode.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a597257efca218f9499aa4e113d99e139">node</a> );
  940. <a name="l00905"></a>00905 backupMsg-&gt;<a class="code" href="classPubSubBackupIntermediateMessage.html#adea3fba4eae66064247ab342fc487302">setPos</a>( iit - subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.begin() );
  941. <a name="l00906"></a>00906 backupMsg-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#af0f2565f24c2e5b8e3655c3fb073d887">PUBSUB_BACKUPINTERMEDIATE_L</a>( backupMsg ));
  942. <a name="l00907"></a>00907 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  943. <a name="l00908"></a>00908 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  944. <a name="l00909"></a>00909 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= backupMsg-&gt;getByteLength()
  945. <a name="l00910"></a>00910 );
  946. <a name="l00911"></a>00911 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0c585a0f9e8162d0bd55a9698b5bff34">getBackupNode</a>(), backupMsg );
  947. <a name="l00912"></a>00912 }
  948. <a name="l00913"></a>00913
  949. <a name="l00914"></a>00914 <span class="comment">// if needed, send adopt to parent</span>
  950. <a name="l00915"></a>00915 <span class="keywordtype">int</span> intermediatePos = iit - subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.begin();
  951. <a name="l00916"></a>00916 <span class="keywordtype">int</span> parentPos = intermediatePos/<a class="code" href="classPubSubMMOG.html#a7d310afbff3e729b6a33f8e6614de07e">maxChildren</a> -1;
  952. <a name="l00917"></a>00917 <span class="keywordflow">if</span>( parentPos &gt;= 0 &amp;&amp; !subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>[parentPos].node.isUnspecified() ){
  953. <a name="l00918"></a>00918 <a class="code" href="classPubSubAdoptChildCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubAdoptChildCall</a>* adoptCall = <span class="keyword">new</span> <a class="code" href="classPubSubAdoptChildCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubAdoptChildCall</a>(<span class="stringliteral">&quot;Adopt (intermediate) Node&quot;</span>);
  954. <a name="l00919"></a>00919 adoptCall-&gt;<a class="code" href="classPubSubAdoptChildCall.html#a2c7d51a5d0c8ef5b2f7a07d9a4559aa1">setSubspaceId</a>( intermediateResp-&gt;<a class="code" href="classPubSubIntermediateResponse.html#a10274ee87eb24712c45b63ac3456d835">getSubspaceId</a>() );
  955. <a name="l00920"></a>00920 adoptCall-&gt;<a class="code" href="classPubSubAdoptChildCall.html#a117550b7b25e69c5b16b35a6a7d6d019">setChild</a>( iit-&gt;node );
  956. <a name="l00921"></a>00921 adoptCall-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a40172b8994bee9881c879d1f69994013">PUBSUB_ADOPTCHILDCALL_L</a>( adoptCall ));
  957. <a name="l00922"></a>00922 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  958. <a name="l00923"></a>00923 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  959. <a name="l00924"></a>00924 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= adoptCall-&gt;getByteLength()
  960. <a name="l00925"></a>00925 );
  961. <a name="l00926"></a>00926 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>[parentPos].node, adoptCall );
  962. <a name="l00927"></a>00927 }
  963. <a name="l00928"></a>00928
  964. <a name="l00929"></a>00929 <span class="keywordflow">if</span>( newIntermediate ){
  965. <a name="l00930"></a>00930 <span class="comment">// move one child from iNodes&#39;s parent to cache</span>
  966. <a name="l00931"></a>00931 <span class="keywordflow">if</span>( parentPos &gt;= 0 ) {
  967. <a name="l00932"></a>00932 <span class="comment">// parent is an intermediate node</span>
  968. <a name="l00933"></a>00933 <a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html">PubSubSubspaceResponsible::IntermediateNode</a>&amp; parent = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>[parentPos];
  969. <a name="l00934"></a>00934 <span class="keywordflow">if</span>( parent.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a2ddae3a07ad454ef312681659588b92a">children</a>.begin() != parent.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a2ddae3a07ad454ef312681659588b92a">children</a>.end() ){
  970. <a name="l00935"></a>00935 <span class="keywordtype">bool</span> fixNeeded = <span class="keyword">false</span>;
  971. <a name="l00936"></a>00936 <span class="keywordflow">if</span>( !subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0dad92f50458f0daf1f719c842661a7b">cachedChildren</a>.insert( make_pair( *(parent.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a2ddae3a07ad454ef312681659588b92a">children</a>.begin()), <span class="keyword">false</span> )).second ){
  972. <a name="l00937"></a>00937 fixNeeded = <span class="keyword">true</span>;
  973. <a name="l00938"></a>00938 }
  974. <a name="l00939"></a>00939 <span class="keywordflow">if</span>( !subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0c585a0f9e8162d0bd55a9698b5bff34">getBackupNode</a>().<a class="code" href="classNodeHandle.html#ab5136375a4548ced7c2014a73c8743c9" title="indicates if this NodeHandle is specified">isUnspecified</a>() ){
  975. <a name="l00940"></a>00940 <a class="code" href="classPubSubBackupSubscriptionMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupSubscriptionMessage</a>* backupMsg = <span class="keyword">new</span> <a class="code" href="classPubSubBackupSubscriptionMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupSubscriptionMessage</a>(<span class="stringliteral">&quot;Backup: nodes moved to cache&quot;</span>);
  976. <a name="l00941"></a>00941 backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#a3b6847353d9871bcc13c01ac682c7739">setSubspaceId</a>( intermediateResp-&gt;<a class="code" href="classPubSubIntermediateResponse.html#a10274ee87eb24712c45b63ac3456d835">getSubspaceId</a>() );
  977. <a name="l00942"></a>00942 backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#ab3a10059be8de4c048576c72a1c83fc7">setChild</a>( *(parent.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a2ddae3a07ad454ef312681659588b92a">children</a>.begin()) );
  978. <a name="l00943"></a>00943 backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#a45ca49bce2d925ec64da036f7c67ec1f">setOldParent</a>( parent.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a597257efca218f9499aa4e113d99e139">node</a> );
  979. <a name="l00944"></a>00944 backupMsg-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a485654404a477aa60cb34dd0ae722258">PUBSUB_BACKUPSUBSCRIPTION_L</a>( backupMsg ));
  980. <a name="l00945"></a>00945 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  981. <a name="l00946"></a>00946 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  982. <a name="l00947"></a>00947 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= backupMsg-&gt;getByteLength()
  983. <a name="l00948"></a>00948 );
  984. <a name="l00949"></a>00949 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0c585a0f9e8162d0bd55a9698b5bff34">getBackupNode</a>(), backupMsg );
  985. <a name="l00950"></a>00950 }
  986. <a name="l00951"></a>00951 <a class="code" href="classPubSubNodeLeftMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubNodeLeftMessage</a>* goneMsg = <span class="keyword">new</span> <a class="code" href="classPubSubNodeLeftMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubNodeLeftMessage</a>(<span class="stringliteral">&quot;Node left: moved&quot;</span>);
  987. <a name="l00952"></a>00952 goneMsg-&gt;<a class="code" href="classPubSubNodeLeftMessage.html#a0e52c6bd254d41b146393d4b825f5cb8">setNode</a>( *(parent.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a2ddae3a07ad454ef312681659588b92a">children</a>.begin()) );
  988. <a name="l00953"></a>00953 goneMsg-&gt;<a class="code" href="classPubSubNodeLeftMessage.html#ac7572204eed418bb6befc42859d682bc">setSubspaceId</a>( intermediateResp-&gt;<a class="code" href="classPubSubIntermediateResponse.html#a10274ee87eb24712c45b63ac3456d835">getSubspaceId</a>() );
  989. <a name="l00954"></a>00954 goneMsg-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#ac2a4c9a20c40c17b2a948f346d5ae4fc">PUBSUB_NODELEFT_L</a>( goneMsg ));
  990. <a name="l00955"></a>00955 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  991. <a name="l00956"></a>00956 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  992. <a name="l00957"></a>00957 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= goneMsg-&gt;getByteLength()
  993. <a name="l00958"></a>00958 );
  994. <a name="l00959"></a>00959 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( parent.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a597257efca218f9499aa4e113d99e139">node</a>, goneMsg );
  995. <a name="l00960"></a>00960 parent.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a2ddae3a07ad454ef312681659588b92a">children</a>.erase( parent.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a2ddae3a07ad454ef312681659588b92a">children</a>.begin() );
  996. <a name="l00961"></a>00961 <span class="keywordflow">if</span>( fixNeeded ){
  997. <a name="l00962"></a>00962 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ab2792e92420b16f1e971e9ff83ebce70">fixTotalChildrenCount</a>();
  998. <a name="l00963"></a>00963 }
  999. <a name="l00964"></a>00964 }
  1000. <a name="l00965"></a>00965
  1001. <a name="l00966"></a>00966 } <span class="keywordflow">else</span> {
  1002. <a name="l00967"></a>00967 <span class="comment">// we are parent</span>
  1003. <a name="l00968"></a>00968 <span class="keywordflow">if</span>( subspace.<a class="code" href="classPubSubSubspaceIntermediate.html#aef3a0468a7eb4cbd84f774e2de574b16">children</a>.begin() != subspace.<a class="code" href="classPubSubSubspaceIntermediate.html#aef3a0468a7eb4cbd84f774e2de574b16">children</a>.end() ){
  1004. <a name="l00969"></a>00969 <span class="keywordtype">bool</span> fixNeeded = <span class="keyword">false</span>;
  1005. <a name="l00970"></a>00970 <span class="keywordflow">if</span>( !subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0dad92f50458f0daf1f719c842661a7b">cachedChildren</a>.insert( make_pair( *(subspace.<a class="code" href="classPubSubSubspaceIntermediate.html#aef3a0468a7eb4cbd84f774e2de574b16">children</a>.begin()), <span class="keyword">false</span> )).second ){
  1006. <a name="l00971"></a>00971 fixNeeded = <span class="keyword">true</span>;
  1007. <a name="l00972"></a>00972 }
  1008. <a name="l00973"></a>00973 <span class="keywordflow">if</span>( !subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0c585a0f9e8162d0bd55a9698b5bff34">getBackupNode</a>().<a class="code" href="classNodeHandle.html#ab5136375a4548ced7c2014a73c8743c9" title="indicates if this NodeHandle is specified">isUnspecified</a>() ){
  1009. <a name="l00974"></a>00974 <a class="code" href="classPubSubBackupSubscriptionMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupSubscriptionMessage</a>* backupMsg = <span class="keyword">new</span> <a class="code" href="classPubSubBackupSubscriptionMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupSubscriptionMessage</a>(<span class="stringliteral">&quot;Backup: nodes moved to cache&quot;</span>);
  1010. <a name="l00975"></a>00975 backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#a3b6847353d9871bcc13c01ac682c7739">setSubspaceId</a>( intermediateResp-&gt;<a class="code" href="classPubSubIntermediateResponse.html#a10274ee87eb24712c45b63ac3456d835">getSubspaceId</a>() );
  1011. <a name="l00976"></a>00976 backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#ab3a10059be8de4c048576c72a1c83fc7">setChild</a>( *(subspace.<a class="code" href="classPubSubSubspaceIntermediate.html#aef3a0468a7eb4cbd84f774e2de574b16">children</a>.begin()) );
  1012. <a name="l00977"></a>00977 backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#a45ca49bce2d925ec64da036f7c67ec1f">setOldParent</a>( <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a> );
  1013. <a name="l00978"></a>00978 backupMsg-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a485654404a477aa60cb34dd0ae722258">PUBSUB_BACKUPSUBSCRIPTION_L</a>( backupMsg ));
  1014. <a name="l00979"></a>00979 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1015. <a name="l00980"></a>00980 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1016. <a name="l00981"></a>00981 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= backupMsg-&gt;getByteLength()
  1017. <a name="l00982"></a>00982 );
  1018. <a name="l00983"></a>00983 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0c585a0f9e8162d0bd55a9698b5bff34">getBackupNode</a>(), backupMsg );
  1019. <a name="l00984"></a>00984 }
  1020. <a name="l00985"></a>00985 subspace.<a class="code" href="classPubSubSubspaceIntermediate.html#aef3a0468a7eb4cbd84f774e2de574b16">children</a>.erase( *(subspace.<a class="code" href="classPubSubSubspaceIntermediate.html#aef3a0468a7eb4cbd84f774e2de574b16">children</a>.begin()) );
  1021. <a name="l00986"></a>00986 <span class="keywordflow">if</span>( fixNeeded ){
  1022. <a name="l00987"></a>00987 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ab2792e92420b16f1e971e9ff83ebce70">fixTotalChildrenCount</a>();
  1023. <a name="l00988"></a>00988 }
  1024. <a name="l00989"></a>00989 }
  1025. <a name="l00990"></a>00990 }
  1026. <a name="l00991"></a>00991 } <span class="keywordflow">else</span> {
  1027. <a name="l00992"></a>00992 <span class="comment">// send adopt for all children intermediates</span>
  1028. <a name="l00993"></a>00993 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> pos = (intermediatePos+1) * <a class="code" href="classPubSubMMOG.html#a7d310afbff3e729b6a33f8e6614de07e">maxChildren</a>; pos &lt; (int) subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.size() &amp;&amp;
  1029. <a name="l00994"></a>00994 pos &lt; (intermediatePos+2) * <a class="code" href="classPubSubMMOG.html#a7d310afbff3e729b6a33f8e6614de07e">maxChildren</a>; ++pos ){
  1030. <a name="l00995"></a>00995 <span class="keywordflow">if</span>( subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>[pos].node.isUnspecified() ) <span class="keywordflow">continue</span>;
  1031. <a name="l00996"></a>00996 <a class="code" href="classPubSubAdoptChildCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubAdoptChildCall</a>* adoptCall = <span class="keyword">new</span> <a class="code" href="classPubSubAdoptChildCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubAdoptChildCall</a>(<span class="stringliteral">&quot;Adopt (intermediate) Node&quot;</span>);
  1032. <a name="l00997"></a>00997 adoptCall-&gt;<a class="code" href="classPubSubAdoptChildCall.html#a2c7d51a5d0c8ef5b2f7a07d9a4559aa1">setSubspaceId</a>( intermediateResp-&gt;<a class="code" href="classPubSubIntermediateResponse.html#a10274ee87eb24712c45b63ac3456d835">getSubspaceId</a>() );
  1033. <a name="l00998"></a>00998 adoptCall-&gt;<a class="code" href="classPubSubAdoptChildCall.html#a117550b7b25e69c5b16b35a6a7d6d019">setChild</a>( subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>[pos].node );
  1034. <a name="l00999"></a>00999 adoptCall-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a40172b8994bee9881c879d1f69994013">PUBSUB_ADOPTCHILDCALL_L</a>( adoptCall ));
  1035. <a name="l01000"></a>01000 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1036. <a name="l01001"></a>01001 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1037. <a name="l01002"></a>01002 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= adoptCall-&gt;getByteLength()
  1038. <a name="l01003"></a>01003 );
  1039. <a name="l01004"></a>01004 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( iit-&gt;node, adoptCall );
  1040. <a name="l01005"></a>01005 }
  1041. <a name="l01006"></a>01006 }
  1042. <a name="l01007"></a>01007
  1043. <a name="l01008"></a>01008 <span class="comment">// move as many cached children to the new node as possible</span>
  1044. <a name="l01009"></a>01009 std::map&lt;NodeHandle,bool&gt;::iterator childIt;
  1045. <a name="l01010"></a>01010 <span class="keywordflow">for</span>( childIt = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0dad92f50458f0daf1f719c842661a7b">cachedChildren</a>.begin(); childIt != subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0dad92f50458f0daf1f719c842661a7b">cachedChildren</a>.end(); ++childIt ){
  1046. <a name="l01011"></a>01011 <span class="keywordflow">if</span>( childIt-&gt;second ) <span class="keywordflow">continue</span>;
  1047. <a name="l01012"></a>01012 <a class="code" href="classPubSubAdoptChildCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubAdoptChildCall</a>* adoptCall = <span class="keyword">new</span> <a class="code" href="classPubSubAdoptChildCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubAdoptChildCall</a>(<span class="stringliteral">&quot;Adopt Node&quot;</span>);
  1048. <a name="l01013"></a>01013 adoptCall-&gt;<a class="code" href="classPubSubAdoptChildCall.html#a2c7d51a5d0c8ef5b2f7a07d9a4559aa1">setSubspaceId</a>( intermediateResp-&gt;<a class="code" href="classPubSubIntermediateResponse.html#a10274ee87eb24712c45b63ac3456d835">getSubspaceId</a>() );
  1049. <a name="l01014"></a>01014 adoptCall-&gt;<a class="code" href="classPubSubAdoptChildCall.html#a117550b7b25e69c5b16b35a6a7d6d019">setChild</a>( childIt-&gt;first );
  1050. <a name="l01015"></a>01015 adoptCall-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a40172b8994bee9881c879d1f69994013">PUBSUB_ADOPTCHILDCALL_L</a>( adoptCall ));
  1051. <a name="l01016"></a>01016 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1052. <a name="l01017"></a>01017 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1053. <a name="l01018"></a>01018 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= adoptCall-&gt;getByteLength()
  1054. <a name="l01019"></a>01019 );
  1055. <a name="l01020"></a>01020 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( intermediateResp-&gt;<a class="code" href="classBaseRpcMessage.html#ada3e122125cfb5acc7350277ca69c45a">getSrcNode</a>(), adoptCall );
  1056. <a name="l01021"></a>01021 childIt-&gt;second = <span class="keyword">true</span>;
  1057. <a name="l01022"></a>01022 <span class="keywordflow">if</span>( (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>) <a class="code" href="classPubSubMMOG.html#a7d310afbff3e729b6a33f8e6614de07e">maxChildren</a> == ++(iit-&gt;waitingChildren) ) <span class="keywordflow">break</span>;
  1058. <a name="l01023"></a>01023 }
  1059. <a name="l01024"></a>01024 }
  1060. <a name="l01025"></a>01025
  1061. <a name="l01026"></a><a class="code" href="classPubSubMMOG.html#a301bb30f1b9239fa5ea744400be48a1b">01026</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a301bb30f1b9239fa5ea744400be48a1b">PubSubMMOG::handleAdoptChildCall</a>( <a class="code" href="classPubSubAdoptChildCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubAdoptChildCall</a>* adoptCall )
  1062. <a name="l01027"></a>01027 {
  1063. <a name="l01028"></a>01028 std::map&lt;PubSubSubspaceId, PubSubSubspaceIntermediate&gt;::iterator it;
  1064. <a name="l01029"></a>01029 it = <a class="code" href="classPubSubMMOG.html#ac2ff9ed8d82f2fd97f69343cd8ee78ac">intermediateSubspaces</a>.find( <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a>(adoptCall-&gt;<a class="code" href="classPubSubAdoptChildCall.html#a55f2fabdda4d8e593f62af92f6320efb">getSubspaceId</a>(), <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>) );
  1065. <a name="l01030"></a>01030 <span class="keywordflow">if</span>( it == <a class="code" href="classPubSubMMOG.html#ac2ff9ed8d82f2fd97f69343cd8ee78ac">intermediateSubspaces</a>.end() ) {
  1066. <a name="l01031"></a>01031 EV &lt;&lt; <span class="stringliteral">&quot;[PubSubMMOG::handleAdoptChildCall() @ &quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classTransportAddress.html#a00e613d98d3412e2b92897c25aa0eb4c" title="returns ip address">getIp</a>()
  1067. <a name="l01032"></a>01032 &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classNodeHandle.html#aef531103cdf07c8353267f4d30a80112" title="returns key of this NodeHandle">getKey</a>().<a class="code" href="classOverlayKey.html#aabeb4fd284a630a82e982ba34ece4fd9" title="Returns a string representation of this key.">toString</a>(16) &lt;&lt; <span class="stringliteral">&quot;)]\n&quot;</span>
  1068. <a name="l01033"></a>01033 &lt;&lt; <span class="stringliteral">&quot; Received Adopt Child Call for unknown Subspace!\n&quot;</span>
  1069. <a name="l01034"></a>01034 &lt;&lt; endl;
  1070. <a name="l01035"></a>01035 cancelAndDelete( adoptCall );
  1071. <a name="l01036"></a>01036 <span class="keywordflow">return</span>;
  1072. <a name="l01037"></a>01037 }
  1073. <a name="l01038"></a>01038
  1074. <a name="l01039"></a>01039 it-&gt;second.addChild( adoptCall-&gt;<a class="code" href="classPubSubAdoptChildCall.html#a47f61a8c6ac788a183fafe93ada0e149">getChild</a>() );
  1075. <a name="l01040"></a>01040 <a class="code" href="classPubSubAdoptChildResponse.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubAdoptChildResponse</a>* adoptResp = <span class="keyword">new</span> <a class="code" href="classPubSubAdoptChildResponse.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubAdoptChildResponse</a>(<span class="stringliteral">&quot;I adopted child&quot;</span>);
  1076. <a name="l01041"></a>01041 adoptResp-&gt;<a class="code" href="classPubSubAdoptChildResponse.html#ac2b8964ee2f2c7c009ddead070e4fee5">setSubspaceId</a>( adoptCall-&gt;<a class="code" href="classPubSubAdoptChildCall.html#a55f2fabdda4d8e593f62af92f6320efb">getSubspaceId</a>() );
  1077. <a name="l01042"></a>01042 adoptResp-&gt;<a class="code" href="classPubSubAdoptChildResponse.html#aafd3f2482f2ec5da47cc69b088f99d78">setChild</a>( adoptCall-&gt;<a class="code" href="classPubSubAdoptChildCall.html#a47f61a8c6ac788a183fafe93ada0e149">getChild</a>() );
  1078. <a name="l01043"></a>01043 adoptResp-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a245e5d150580b43d98348a8cd4008373">PUBSUB_ADOPTCHILDRESPONSE_L</a>( adoptResp ));
  1079. <a name="l01044"></a>01044 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1080. <a name="l01045"></a>01045 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1081. <a name="l01046"></a>01046 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= adoptResp-&gt;getByteLength()
  1082. <a name="l01047"></a>01047 );
  1083. <a name="l01048"></a>01048 <a class="code" href="classBaseRpc.html#adc06091d348c98a5efbf54fe0afe8747" title="Send Remote-Procedure response message and deletes call message.">sendRpcResponse</a>( adoptCall, adoptResp );
  1084. <a name="l01049"></a>01049 }
  1085. <a name="l01050"></a>01050
  1086. <a name="l01051"></a><a class="code" href="classPubSubMMOG.html#a9f396c585cfb16b476047c35fbbe05fa">01051</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a9f396c585cfb16b476047c35fbbe05fa">PubSubMMOG::handleAdoptChildResponse</a>( <a class="code" href="classPubSubAdoptChildResponse.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubAdoptChildResponse</a>* adoptResp )
  1087. <a name="l01052"></a>01052 {
  1088. <a name="l01053"></a>01053 std::map&lt;PubSubSubspaceId, PubSubSubspaceResponsible&gt;::iterator it;
  1089. <a name="l01054"></a>01054 it = <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.find( <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a>(adoptResp-&gt;<a class="code" href="classPubSubAdoptChildResponse.html#ac06febb4c2fd644ad5c31b844e6356de">getSubspaceId</a>(), <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>) );
  1090. <a name="l01055"></a>01055 <span class="keywordflow">if</span>( it == <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.end() ) {
  1091. <a name="l01056"></a>01056 EV &lt;&lt; <span class="stringliteral">&quot;[PubSubMMOG::handleAdoptChildResponse() @ &quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classTransportAddress.html#a00e613d98d3412e2b92897c25aa0eb4c" title="returns ip address">getIp</a>()
  1092. <a name="l01057"></a>01057 &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classNodeHandle.html#aef531103cdf07c8353267f4d30a80112" title="returns key of this NodeHandle">getKey</a>().<a class="code" href="classOverlayKey.html#aabeb4fd284a630a82e982ba34ece4fd9" title="Returns a string representation of this key.">toString</a>(16) &lt;&lt; <span class="stringliteral">&quot;)]\n&quot;</span>
  1093. <a name="l01058"></a>01058 &lt;&lt; <span class="stringliteral">&quot; Received AdoptChild Response for unknown Subspace!\n&quot;</span>
  1094. <a name="l01059"></a>01059 &lt;&lt; endl;
  1095. <a name="l01060"></a>01060 <span class="keywordflow">return</span>;
  1096. <a name="l01061"></a>01061 }
  1097. <a name="l01062"></a>01062
  1098. <a name="l01063"></a>01063 <span class="comment">// FIXME: just for testing</span>
  1099. <a name="l01064"></a>01064 <a class="code" href="classPubSubSubspaceResponsible.html">PubSubSubspaceResponsible</a>&amp; subspace = it-&gt;second;
  1100. <a name="l01065"></a>01065 <span class="keywordtype">int</span> iii = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a41dc142fbdac4eebcadd7b62ee0a822e">getTotalChildrenCount</a>();
  1101. <a name="l01066"></a>01066 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ab2792e92420b16f1e971e9ff83ebce70">fixTotalChildrenCount</a>();
  1102. <a name="l01067"></a>01067 <span class="keywordflow">if</span>( iii != subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a41dc142fbdac4eebcadd7b62ee0a822e">getTotalChildrenCount</a>() ){
  1103. <a name="l01068"></a>01068 opp_error(<span class="stringliteral">&quot;Huh?&quot;</span>);
  1104. <a name="l01069"></a>01069 }
  1105. <a name="l01070"></a>01070
  1106. <a name="l01071"></a>01071 <span class="comment">// Find intermediate node in subspace</span>
  1107. <a name="l01072"></a>01072 deque&lt;PubSubSubspaceResponsible::IntermediateNode&gt;::iterator iit;
  1108. <a name="l01073"></a>01073 <span class="keywordflow">for</span>( iit = it-&gt;second.intermediateNodes.begin(); iit != it-&gt;second.intermediateNodes.end(); ++iit ){
  1109. <a name="l01074"></a>01074 <span class="keywordflow">if</span>( !iit-&gt;node.isUnspecified() &amp;&amp; iit-&gt;node == adoptResp-&gt;<a class="code" href="classBaseRpcMessage.html#ada3e122125cfb5acc7350277ca69c45a">getSrcNode</a>() ){
  1110. <a name="l01075"></a>01075
  1111. <a name="l01076"></a>01076 <span class="comment">// if adoption was for a child intermediate node, nothing is to be done</span>
  1112. <a name="l01077"></a>01077 <span class="keywordtype">int</span> intermediatePos = iit - it-&gt;second.intermediateNodes.begin();
  1113. <a name="l01078"></a>01078 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> pos = (intermediatePos+1) * <a class="code" href="classPubSubMMOG.html#a7d310afbff3e729b6a33f8e6614de07e">maxChildren</a>; pos &lt; (int) it-&gt;second.intermediateNodes.size() &amp;&amp;
  1114. <a name="l01079"></a>01079 pos &lt; (intermediatePos+2) * <a class="code" href="classPubSubMMOG.html#a7d310afbff3e729b6a33f8e6614de07e">maxChildren</a>; ++pos )
  1115. <a name="l01080"></a>01080 {
  1116. <a name="l01081"></a>01081 <span class="keywordflow">if</span>( !it-&gt;second.intermediateNodes[pos].node.isUnspecified() &amp;&amp;
  1117. <a name="l01082"></a>01082 adoptResp-&gt;<a class="code" href="classPubSubAdoptChildResponse.html#a2ec09ab70ab5e0f4603c3b856acfde80">getChild</a>() == it-&gt;second.intermediateNodes[pos].node ){
  1118. <a name="l01083"></a>01083 <span class="keywordflow">return</span>;
  1119. <a name="l01084"></a>01084 }
  1120. <a name="l01085"></a>01085 }
  1121. <a name="l01086"></a>01086
  1122. <a name="l01087"></a>01087 <span class="comment">// child is a &quot;real&quot; child-&gt;remove it from cache</span>
  1123. <a name="l01088"></a>01088 <span class="keywordflow">if</span>( !it-&gt;second.cachedChildren.erase( adoptResp-&gt;<a class="code" href="classPubSubAdoptChildResponse.html#a2ec09ab70ab5e0f4603c3b856acfde80">getChild</a>() ) ){
  1124. <a name="l01089"></a>01089 <span class="comment">// if node got deleted in the meantime, inform parent...</span>
  1125. <a name="l01090"></a>01090 <a class="code" href="classPubSubNodeLeftMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubNodeLeftMessage</a>* goneMsg = <span class="keyword">new</span> <a class="code" href="classPubSubNodeLeftMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubNodeLeftMessage</a>(<span class="stringliteral">&quot;Node left Subspace&quot;</span>);
  1126. <a name="l01091"></a>01091 goneMsg-&gt;<a class="code" href="classPubSubNodeLeftMessage.html#a0e52c6bd254d41b146393d4b825f5cb8">setNode</a>( adoptResp-&gt;<a class="code" href="classPubSubAdoptChildResponse.html#a2ec09ab70ab5e0f4603c3b856acfde80">getChild</a>() );
  1127. <a name="l01092"></a>01092 goneMsg-&gt;<a class="code" href="classPubSubNodeLeftMessage.html#ac7572204eed418bb6befc42859d682bc">setSubspaceId</a>( it-&gt;second.getId().getId() );
  1128. <a name="l01093"></a>01093 goneMsg-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#ac2a4c9a20c40c17b2a948f346d5ae4fc">PUBSUB_NODELEFT_L</a>( goneMsg ));
  1129. <a name="l01094"></a>01094 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1130. <a name="l01095"></a>01095 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1131. <a name="l01096"></a>01096 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= goneMsg-&gt;getByteLength()
  1132. <a name="l01097"></a>01097 );
  1133. <a name="l01098"></a>01098 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( adoptResp-&gt;<a class="code" href="classBaseRpcMessage.html#ada3e122125cfb5acc7350277ca69c45a">getSrcNode</a>(), goneMsg );
  1134. <a name="l01099"></a>01099 <span class="keywordflow">return</span>;
  1135. <a name="l01100"></a>01100 }
  1136. <a name="l01101"></a>01101
  1137. <a name="l01102"></a>01102 <span class="comment">// move child to intermediate node&#39;s childrenlist</span>
  1138. <a name="l01103"></a>01103 <span class="keywordflow">if</span>( !iit-&gt;children.insert( adoptResp-&gt;<a class="code" href="classPubSubAdoptChildResponse.html#a2ec09ab70ab5e0f4603c3b856acfde80">getChild</a>() ).second ){
  1139. <a name="l01104"></a>01104 <span class="comment">// Node was already in children list, fix children count</span>
  1140. <a name="l01105"></a>01105 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ab2792e92420b16f1e971e9ff83ebce70">fixTotalChildrenCount</a>();
  1141. <a name="l01106"></a>01106 }
  1142. <a name="l01107"></a>01107 iit-&gt;waitingChildren--;
  1143. <a name="l01108"></a>01108
  1144. <a name="l01109"></a>01109 <span class="comment">// FIXME: just for testing</span>
  1145. <a name="l01110"></a>01110 <a class="code" href="classPubSubSubspaceResponsible.html">PubSubSubspaceResponsible</a>&amp; subspace = it-&gt;second;
  1146. <a name="l01111"></a>01111 <span class="keywordtype">int</span> iii = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a41dc142fbdac4eebcadd7b62ee0a822e">getTotalChildrenCount</a>();
  1147. <a name="l01112"></a>01112 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ab2792e92420b16f1e971e9ff83ebce70">fixTotalChildrenCount</a>();
  1148. <a name="l01113"></a>01113 <span class="keywordflow">if</span>( iii != subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a41dc142fbdac4eebcadd7b62ee0a822e">getTotalChildrenCount</a>() ){
  1149. <a name="l01114"></a>01114 opp_error(<span class="stringliteral">&quot;Huh?&quot;</span>);
  1150. <a name="l01115"></a>01115 }
  1151. <a name="l01116"></a>01116
  1152. <a name="l01117"></a>01117 <span class="comment">// Inform Backup</span>
  1153. <a name="l01118"></a>01118 <span class="keywordflow">if</span>( !it-&gt;second.getBackupNode().isUnspecified() ){
  1154. <a name="l01119"></a>01119 <a class="code" href="classPubSubBackupSubscriptionMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupSubscriptionMessage</a>* backupMsg = <span class="keyword">new</span> <a class="code" href="classPubSubBackupSubscriptionMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupSubscriptionMessage</a>(<span class="stringliteral">&quot;Backup: node got a new parent&quot;</span>);
  1155. <a name="l01120"></a>01120 backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#a3b6847353d9871bcc13c01ac682c7739">setSubspaceId</a>( adoptResp-&gt;<a class="code" href="classPubSubAdoptChildResponse.html#ac06febb4c2fd644ad5c31b844e6356de">getSubspaceId</a>() );
  1156. <a name="l01121"></a>01121 backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#ab3a10059be8de4c048576c72a1c83fc7">setChild</a>( adoptResp-&gt;<a class="code" href="classPubSubAdoptChildResponse.html#a2ec09ab70ab5e0f4603c3b856acfde80">getChild</a>() );
  1157. <a name="l01122"></a>01122 backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#af4c25a5bb0a0f1efeb34cf2c13a9bc38">setParent</a>( adoptResp-&gt;<a class="code" href="classBaseRpcMessage.html#ada3e122125cfb5acc7350277ca69c45a">getSrcNode</a>() );
  1158. <a name="l01123"></a>01123 backupMsg-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a485654404a477aa60cb34dd0ae722258">PUBSUB_BACKUPSUBSCRIPTION_L</a>( backupMsg ));
  1159. <a name="l01124"></a>01124 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1160. <a name="l01125"></a>01125 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1161. <a name="l01126"></a>01126 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= backupMsg-&gt;getByteLength()
  1162. <a name="l01127"></a>01127 );
  1163. <a name="l01128"></a>01128 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( it-&gt;second.getBackupNode(), backupMsg );
  1164. <a name="l01129"></a>01129 <span class="keywordflow">return</span>;
  1165. <a name="l01130"></a>01130 }
  1166. <a name="l01131"></a>01131 }
  1167. <a name="l01132"></a>01132 }
  1168. <a name="l01133"></a>01133
  1169. <a name="l01134"></a>01134 EV &lt;&lt; <span class="stringliteral">&quot;[PubSubMMOG::handleAdoptChildResponse() @ &quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classTransportAddress.html#a00e613d98d3412e2b92897c25aa0eb4c" title="returns ip address">getIp</a>()
  1170. <a name="l01135"></a>01135 &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classNodeHandle.html#aef531103cdf07c8353267f4d30a80112" title="returns key of this NodeHandle">getKey</a>().<a class="code" href="classOverlayKey.html#aabeb4fd284a630a82e982ba34ece4fd9" title="Returns a string representation of this key.">toString</a>(16) &lt;&lt; <span class="stringliteral">&quot;)]\n&quot;</span>
  1171. <a name="l01136"></a>01136 &lt;&lt; <span class="stringliteral">&quot; Received AdoptChild Response for unknown child!\n&quot;</span>
  1172. <a name="l01137"></a>01137 &lt;&lt; endl;
  1173. <a name="l01138"></a>01138 }
  1174. <a name="l01139"></a>01139
  1175. <a name="l01140"></a><a class="code" href="classPubSubMMOG.html#a7179d8d2355f09e50e5172a8bc4e60b1">01140</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a7179d8d2355f09e50e5172a8bc4e60b1">PubSubMMOG::handlePingCall</a>( <a class="code" href="classPubSubPingCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubPingCall</a>* pingCall )
  1176. <a name="l01141"></a>01141 {
  1177. <a name="l01142"></a>01142 <span class="keywordtype">int</span> subspaceId = pingCall-&gt;<a class="code" href="classPubSubPingCall.html#a6c09797ec1a7e667e85b3daba1dc5a60">getSubspaceId</a>();
  1178. <a name="l01143"></a>01143
  1179. <a name="l01144"></a>01144 <span class="keywordflow">if</span>( pingCall-&gt;<a class="code" href="classPubSubPingCall.html#ad2d88a7b8ff45cf95aabfcb792490d1d">getPingType</a>() == PUBSUB_PING_BACKUP ){
  1180. <a name="l01145"></a>01145 <span class="comment">// reset heartbeat timer</span>
  1181. <a name="l01146"></a>01146 std::map&lt;PubSubSubspaceId, PubSubSubspaceResponsible&gt;::iterator it;
  1182. <a name="l01147"></a>01147 it = <a class="code" href="classPubSubMMOG.html#a9cb86fc744b2f9b087a66e0af879f1fc">backupSubspaces</a>.find( <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a>(pingCall-&gt;<a class="code" href="classPubSubPingCall.html#a6c09797ec1a7e667e85b3daba1dc5a60">getSubspaceId</a>(), <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>) );
  1183. <a name="l01148"></a>01148 <span class="keywordflow">if</span>( it == <a class="code" href="classPubSubMMOG.html#a9cb86fc744b2f9b087a66e0af879f1fc">backupSubspaces</a>.end() ) {
  1184. <a name="l01149"></a>01149 EV &lt;&lt; <span class="stringliteral">&quot;[PubSubMMOG::handlePingCall() @ &quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classTransportAddress.html#a00e613d98d3412e2b92897c25aa0eb4c" title="returns ip address">getIp</a>()
  1185. <a name="l01150"></a>01150 &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classNodeHandle.html#aef531103cdf07c8353267f4d30a80112" title="returns key of this NodeHandle">getKey</a>().<a class="code" href="classOverlayKey.html#aabeb4fd284a630a82e982ba34ece4fd9" title="Returns a string representation of this key.">toString</a>(16) &lt;&lt; <span class="stringliteral">&quot;)]\n&quot;</span>
  1186. <a name="l01151"></a>01151 &lt;&lt; <span class="stringliteral">&quot; Received PingCall for unknown Subspace!\n&quot;</span>
  1187. <a name="l01152"></a>01152 &lt;&lt; endl;
  1188. <a name="l01153"></a>01153 <span class="comment">// FIXME: Somebody thinks we are his backup. What shall we do?</span>
  1189. <a name="l01154"></a>01154 } <span class="keywordflow">else</span> {
  1190. <a name="l01155"></a>01155 it-&gt;second.resetHeartbeatFailCount();
  1191. <a name="l01156"></a>01156 <a class="code" href="classPubSubMMOG.html#a7544c76d3fceee2a56dee1bdf63c4db1">startTimer</a>( it-&gt;second.getHeartbeatTimer() );
  1192. <a name="l01157"></a>01157 }
  1193. <a name="l01158"></a>01158 }
  1194. <a name="l01159"></a>01159
  1195. <a name="l01160"></a>01160 <a class="code" href="classPubSubPingResponse.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubPingResponse</a>* pingResp = <span class="keyword">new</span> <a class="code" href="classPubSubPingResponse.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubPingResponse</a>(<span class="stringliteral">&quot;PingResponse&quot;</span>);
  1196. <a name="l01161"></a>01161 pingResp-&gt;<a class="code" href="classPubSubPingResponse.html#a76a52d9b6b986a51d8c1c4797de9b271">setSubspaceId</a>( subspaceId );
  1197. <a name="l01162"></a>01162 pingResp-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a9221c16747bc0f1ebce9a85e72a5d479">PUBSUB_PINGRESPONSE_L</a>( pingResp ));
  1198. <a name="l01163"></a>01163 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1199. <a name="l01164"></a>01164 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1200. <a name="l01165"></a>01165 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= pingResp-&gt;getByteLength()
  1201. <a name="l01166"></a>01166 );
  1202. <a name="l01167"></a>01167 <a class="code" href="classBaseRpc.html#adc06091d348c98a5efbf54fe0afe8747" title="Send Remote-Procedure response message and deletes call message.">sendRpcResponse</a>( pingCall, pingResp );
  1203. <a name="l01168"></a>01168 }
  1204. <a name="l01169"></a>01169
  1205. <a name="l01170"></a><a class="code" href="classPubSubMMOG.html#a6ade874ae0f4871c157cbf3e4334724c">01170</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a6ade874ae0f4871c157cbf3e4334724c">PubSubMMOG::handlePingResponse</a>( <a class="code" href="classPubSubPingResponse.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubPingResponse</a>* pingResp )
  1206. <a name="l01171"></a>01171 {
  1207. <a name="l01172"></a>01172 }
  1208. <a name="l01173"></a>01173
  1209. <a name="l01174"></a><a class="code" href="classPubSubMMOG.html#a0fe097eb8ff809023d0a119b2dc17d61">01174</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a0fe097eb8ff809023d0a119b2dc17d61">PubSubMMOG::takeOverNewSubspace</a>( <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a> subspaceId )
  1210. <a name="l01175"></a>01175 {
  1211. <a name="l01176"></a>01176 <span class="comment">// create a new subspace</span>
  1212. <a name="l01177"></a>01177 <a class="code" href="classPubSubSubspaceResponsible.html">PubSubSubspaceResponsible</a> subspace( subspaceId );
  1213. <a name="l01178"></a>01178 <a class="code" href="classPubSubMMOG.html#a60f9145524471fe4aa44641f1d0e6a17">takeOverSubspace</a>( subspace, <span class="keyword">true</span> );
  1214. <a name="l01179"></a>01179 }
  1215. <a name="l01180"></a>01180
  1216. <a name="l01181"></a><a class="code" href="classPubSubMMOG.html#a60f9145524471fe4aa44641f1d0e6a17">01181</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a60f9145524471fe4aa44641f1d0e6a17">PubSubMMOG::takeOverSubspace</a>( <a class="code" href="classPubSubSubspaceResponsible.html">PubSubSubspaceResponsible</a>&amp; subspace, <span class="keywordtype">bool</span> isNew = <span class="keyword">false</span> )
  1217. <a name="l01182"></a>01182 {
  1218. <a name="l01183"></a>01183 <span class="keyword">const</span> <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a>&amp; subspaceId = subspace.<a class="code" href="classPubSubSubspace.html#a68c0be6c59e362d291533d74a65aa187">getId</a>();
  1219. <a name="l01184"></a>01184 <span class="keywordtype">int</span> intId = subspaceId.<a class="code" href="classPubSubSubspaceId.html#afb4d71a54d5337d65bb89c27e4d4938c">getId</a>();
  1220. <a name="l01185"></a>01185
  1221. <a name="l01186"></a>01186 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ab2792e92420b16f1e971e9ff83ebce70">fixTotalChildrenCount</a>();
  1222. <a name="l01187"></a>01187
  1223. <a name="l01188"></a>01188 <a class="code" href="classNodeHandle.html" title="This class implements a node handle.">NodeHandle</a> oldNode = subspace.<a class="code" href="classPubSubSubspace.html#a996b0242f4c47164d5ee2141755d8fb1">getResponsibleNode</a>();
  1224. <a name="l01189"></a>01189
  1225. <a name="l01190"></a>01190 <span class="comment">// insert subspace into responsible list</span>
  1226. <a name="l01191"></a>01191 subspace.<a class="code" href="classPubSubSubspace.html#addf352c69955906dd9bda7e0a0c09dbb">setResponsibleNode</a>( <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a> );
  1227. <a name="l01192"></a>01192 <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.insert( make_pair(subspaceId, subspace) );
  1228. <a name="l01193"></a>01193
  1229. <a name="l01194"></a>01194 <span class="comment">// request backup</span>
  1230. <a name="l01195"></a>01195 <a class="code" href="classPubSubHelpCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubHelpCall</a>* helpCall = <span class="keyword">new</span> <a class="code" href="classPubSubHelpCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubHelpCall</a>(<span class="stringliteral">&quot;I need a backup node&quot;</span>);
  1231. <a name="l01196"></a>01196 helpCall-&gt;<a class="code" href="classPubSubHelpCall.html#a8f442b6f719d15e347aa4187fb3d2b47">setHelpType</a>( <a class="code" href="PubSubMessage__m_8h.html#a0a7abf0acc5a382f3b386ab1a09cd07aaa575d5ab279429401172053d228e4838">PUBSUB_BACKUP</a> );
  1232. <a name="l01197"></a>01197 helpCall-&gt;<a class="code" href="classPubSubHelpCall.html#a526546e7f6cc281b640ffabca6fd4f29">setSubspaceId</a>( intId );
  1233. <a name="l01198"></a>01198 helpCall-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#aac95c8ba038a0a9dd3671a29330493a9">PUBSUB_HELPCALL_L</a>( helpCall ));
  1234. <a name="l01199"></a>01199 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1235. <a name="l01200"></a>01200 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1236. <a name="l01201"></a>01201 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= helpCall-&gt;getByteLength()
  1237. <a name="l01202"></a>01202 );
  1238. <a name="l01203"></a>01203 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( <a class="code" href="classPubSubMMOG.html#a1e1ba5fd3c791f3aa2172e6b055f68bb">lobbyServer</a>, helpCall );
  1239. <a name="l01204"></a>01204
  1240. <a name="l01205"></a>01205 <span class="keywordflow">if</span>( !isNew ) {
  1241. <a name="l01206"></a>01206 <a class="code" href="classPubSubReplacementMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubReplacementMessage</a>* repMsg = <span class="keyword">new</span> <a class="code" href="classPubSubReplacementMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubReplacementMessage</a>(<span class="stringliteral">&quot;I replaced the responsible node&quot;</span>);
  1242. <a name="l01207"></a>01207 repMsg-&gt;<a class="code" href="classPubSubReplacementMessage.html#af6e6940ad03c2ebda468601eb8c69d08">setSubspaceId</a>( intId );
  1243. <a name="l01208"></a>01208 repMsg-&gt;<a class="code" href="classPubSubReplacementMessage.html#a9561d83a385ef0f9cba891ba4a96e61a">setNewResponsibleNode</a>( <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a> );
  1244. <a name="l01209"></a>01209 repMsg-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a9dd61fb5cd5685440c7e610a2800b1f9">PUBSUB_REPLACEMENT_L</a>( repMsg ));
  1245. <a name="l01210"></a>01210
  1246. <a name="l01211"></a>01211 <span class="comment">// Inform children and lobbyserver about takeover</span>
  1247. <a name="l01212"></a>01212 <a class="code" href="classPubSubMMOG.html#aedde86c47759c2ab5b61744c7065377c">sendMessageToChildren</a>( subspace, repMsg, NULL, repMsg );
  1248. <a name="l01213"></a>01213 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( <a class="code" href="classPubSubMMOG.html#a1e1ba5fd3c791f3aa2172e6b055f68bb">lobbyServer</a>, repMsg );
  1249. <a name="l01214"></a>01214
  1250. <a name="l01215"></a>01215 <span class="comment">// inform lobby server over failed node</span>
  1251. <a name="l01216"></a>01216 <a class="code" href="classPubSubFailedNodeMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubFailedNodeMessage</a>* failedNode = <span class="keyword">new</span> <a class="code" href="classPubSubFailedNodeMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubFailedNodeMessage</a>(<span class="stringliteral">&quot;Node failed&quot;</span>);
  1252. <a name="l01217"></a>01217 failedNode-&gt;<a class="code" href="classPubSubFailedNodeMessage.html#adc7577760792d9a3a2285fb5a368c24d">setFailedNode</a>( oldNode );
  1253. <a name="l01218"></a>01218 failedNode-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#acb366745fb62311b100b1632b04b1141">PUBSUB_FAILEDNODE_L</a>( failedNode ));
  1254. <a name="l01219"></a>01219 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1255. <a name="l01220"></a>01220 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1256. <a name="l01221"></a>01221 pubSubSignalingMessagesSize+= failedNode-&gt;getByteLength()
  1257. <a name="l01222"></a>01222 );
  1258. <a name="l01223"></a>01223 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( <a class="code" href="classPubSubMMOG.html#a1e1ba5fd3c791f3aa2172e6b055f68bb">lobbyServer</a>, failedNode );
  1259. <a name="l01224"></a>01224 }
  1260. <a name="l01225"></a>01225 }
  1261. <a name="l01226"></a>01226
  1262. <a name="l01227"></a><a class="code" href="classPubSubMMOG.html#a237b78a3abc9b6cbb95021e25306e2e2">01227</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a237b78a3abc9b6cbb95021e25306e2e2">PubSubMMOG::sendHearbeatToChildren</a>()
  1263. <a name="l01228"></a>01228 {
  1264. <a name="l01229"></a>01229 std::map&lt;PubSubSubspaceId, PubSubSubspaceResponsible&gt;::iterator it;
  1265. <a name="l01230"></a>01230 <span class="keywordflow">for</span>( it = <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.begin(); it != <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.end(); ++it) {
  1266. <a name="l01231"></a>01231 <a class="code" href="classPubSubPingCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubPingCall</a>* bHeartbeat = <span class="keyword">new</span> <a class="code" href="classPubSubPingCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubPingCall</a>(<span class="stringliteral">&quot;Heartbeat Backup&quot;</span>);
  1267. <a name="l01232"></a>01232 bHeartbeat-&gt;<a class="code" href="classPubSubPingCall.html#a13e6a60918d785ba886728b5f4bfe784">setPingType</a>( <a class="code" href="PubSubMessage__m_8h.html#a955af4961bb8702caeddf04706c0681ba4bcfe90f539ae081948077a9d0c1d992">PUBSUB_PING_BACKUP</a> );
  1268. <a name="l01233"></a>01233 bHeartbeat-&gt;<a class="code" href="classPubSubPingCall.html#a33af6b48853e7c263c97ed80be0374ae">setSubspaceId</a>( it-&gt;second.getId().getId() );
  1269. <a name="l01234"></a>01234 bHeartbeat-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a5afa100d3f724e66abc9356ec55342b5">PUBSUB_PINGCALL_L</a>( bHeartbeat ));
  1270. <a name="l01235"></a>01235
  1271. <a name="l01236"></a>01236 <a class="code" href="classPubSubPingCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubPingCall</a>* iHeartbeat = <span class="keyword">new</span> <a class="code" href="classPubSubPingCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubPingCall</a>(<span class="stringliteral">&quot;Heartbeat Intermediate&quot;</span>);
  1272. <a name="l01237"></a>01237 iHeartbeat-&gt;<a class="code" href="classPubSubPingCall.html#a13e6a60918d785ba886728b5f4bfe784">setPingType</a>( <a class="code" href="PubSubMessage__m_8h.html#a955af4961bb8702caeddf04706c0681ba3402d727b81d4511a52d09df2252918c">PUBSUB_PING_INTERMEDIATE</a> );
  1273. <a name="l01238"></a>01238 iHeartbeat-&gt;<a class="code" href="classPubSubPingCall.html#a33af6b48853e7c263c97ed80be0374ae">setSubspaceId</a>( it-&gt;second.getId().getId() );
  1274. <a name="l01239"></a>01239 iHeartbeat-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a5afa100d3f724e66abc9356ec55342b5">PUBSUB_PINGCALL_L</a>( iHeartbeat ));
  1275. <a name="l01240"></a>01240
  1276. <a name="l01241"></a>01241 <a class="code" href="classPubSubMMOG.html#aedde86c47759c2ab5b61744c7065377c">sendMessageToChildren</a>( it-&gt;second, iHeartbeat, bHeartbeat, NULL);
  1277. <a name="l01242"></a>01242 <span class="keyword">delete</span> bHeartbeat;
  1278. <a name="l01243"></a>01243 <span class="keyword">delete</span> iHeartbeat;
  1279. <a name="l01244"></a>01244 }
  1280. <a name="l01245"></a>01245 }
  1281. <a name="l01246"></a>01246
  1282. <a name="l01247"></a><a class="code" href="classPubSubMMOG.html#abd00be445c110f527365d00553713334">01247</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#abd00be445c110f527365d00553713334">PubSubMMOG::sendPingToChildren</a>()
  1283. <a name="l01248"></a>01248 {
  1284. <a name="l01249"></a>01249 std::map&lt;PubSubSubspaceId, PubSubSubspaceResponsible&gt;::iterator it;
  1285. <a name="l01250"></a>01250 <span class="keywordflow">for</span>( it = <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.begin(); it != <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.end(); ++it) {
  1286. <a name="l01251"></a>01251 <a class="code" href="classPubSubPingCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubPingCall</a>* heartbeat = <span class="keyword">new</span> <a class="code" href="classPubSubPingCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubPingCall</a>(<span class="stringliteral">&quot;Ping&quot;</span>);
  1287. <a name="l01252"></a>01252 heartbeat-&gt;<a class="code" href="classPubSubPingCall.html#a13e6a60918d785ba886728b5f4bfe784">setPingType</a>( <a class="code" href="PubSubMessage__m_8h.html#a955af4961bb8702caeddf04706c0681ba6be4bc3a5b9c7bee39a3eed787e5eb90">PUBSUB_PING_CHILD</a> );
  1288. <a name="l01253"></a>01253 heartbeat-&gt;<a class="code" href="classPubSubPingCall.html#a33af6b48853e7c263c97ed80be0374ae">setSubspaceId</a>( it-&gt;second.getId().getId() );
  1289. <a name="l01254"></a>01254 heartbeat-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a5afa100d3f724e66abc9356ec55342b5">PUBSUB_PINGCALL_L</a>( heartbeat ));
  1290. <a name="l01255"></a>01255 <a class="code" href="classPubSubMMOG.html#aedde86c47759c2ab5b61744c7065377c">sendMessageToChildren</a>( it-&gt;second, NULL, NULL, heartbeat );
  1291. <a name="l01256"></a>01256 <span class="keyword">delete</span> heartbeat;
  1292. <a name="l01257"></a>01257 }
  1293. <a name="l01258"></a>01258 }
  1294. <a name="l01259"></a>01259
  1295. <a name="l01260"></a><a class="code" href="classPubSubMMOG.html#a01a6bc8e4b0e38e57d2e3108088f67f3">01260</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a01a6bc8e4b0e38e57d2e3108088f67f3">PubSubMMOG::handleParentTimeout</a>( <a class="code" href="classPubSubTimer.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubTimer</a>* timer )
  1296. <a name="l01261"></a>01261 {
  1297. <a name="l01262"></a>01262 <span class="comment">// our parent timed out. we have to take over the subspace...</span>
  1298. <a name="l01263"></a>01263 <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a> subspaceId(timer-&gt;<a class="code" href="classPubSubTimer.html#a5d7727faa7e6264688af6211880bbff8">getSubspaceId</a>(), <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>);
  1299. <a name="l01264"></a>01264 std::map&lt;PubSubSubspaceId, PubSubSubspaceResponsible&gt;::iterator it;
  1300. <a name="l01265"></a>01265 it = <a class="code" href="classPubSubMMOG.html#a9cb86fc744b2f9b087a66e0af879f1fc">backupSubspaces</a>.find( subspaceId );
  1301. <a name="l01266"></a>01266 <span class="keywordflow">if</span>( it == <a class="code" href="classPubSubMMOG.html#a9cb86fc744b2f9b087a66e0af879f1fc">backupSubspaces</a>.end() ) {
  1302. <a name="l01267"></a>01267 <span class="keyword">delete</span> timer;
  1303. <a name="l01268"></a>01268 <span class="keywordflow">return</span>;
  1304. <a name="l01269"></a>01269 }
  1305. <a name="l01270"></a>01270
  1306. <a name="l01271"></a>01271 <span class="comment">// increase fail count; if to high, take over subspace</span>
  1307. <a name="l01272"></a>01272 it-&gt;second.incHeartbeatFailCount();
  1308. <a name="l01273"></a>01273 <span class="keywordflow">if</span>( it-&gt;second.getHeartbeatFailCount() &gt; 1 ) { <span class="comment">// FIXME: make it a parameter</span>
  1309. <a name="l01274"></a>01274
  1310. <a name="l01275"></a>01275 <span class="comment">// Delete Timer</span>
  1311. <a name="l01276"></a>01276 cancelAndDelete( timer );
  1312. <a name="l01277"></a>01277 it-&gt;second.setHeartbeatTimer( NULL );
  1313. <a name="l01278"></a>01278
  1314. <a name="l01279"></a>01279 <span class="comment">// Take over Subspace</span>
  1315. <a name="l01280"></a>01280 <a class="code" href="classPubSubMMOG.html#a60f9145524471fe4aa44641f1d0e6a17">takeOverSubspace</a>( it-&gt;second );
  1316. <a name="l01281"></a>01281 <a class="code" href="classPubSubMMOG.html#a9cb86fc744b2f9b087a66e0af879f1fc">backupSubspaces</a>.erase( it );
  1317. <a name="l01282"></a>01282
  1318. <a name="l01283"></a>01283 } <span class="keywordflow">else</span> {
  1319. <a name="l01284"></a>01284 <a class="code" href="classPubSubMMOG.html#a7544c76d3fceee2a56dee1bdf63c4db1">startTimer</a>( timer );
  1320. <a name="l01285"></a>01285 }
  1321. <a name="l01286"></a>01286 }
  1322. <a name="l01287"></a>01287
  1323. <a name="l01288"></a><a class="code" href="classPubSubMMOG.html#a217e815ddc5ba02f8afe33a73389184f">01288</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a217e815ddc5ba02f8afe33a73389184f">PubSubMMOG::handleBackupCallTimeout</a>( <a class="code" href="classPubSubBackupCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupCall</a>* backupCall, <span class="keyword">const</span> <a class="code" href="classTransportAddress.html" title="This class implements a common transport address.">TransportAddress</a>&amp; oldNode )
  1324. <a name="l01289"></a>01289 {
  1325. <a name="l01290"></a>01290 <span class="comment">// FIXME: cast oldNode to NodeHandle</span>
  1326. <a name="l01291"></a>01291 <span class="comment">// Inform Lobbyserver over failed node</span>
  1327. <a name="l01292"></a>01292 <a class="code" href="classPubSubFailedNodeMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubFailedNodeMessage</a>* failedNode = <span class="keyword">new</span> <a class="code" href="classPubSubFailedNodeMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubFailedNodeMessage</a>(<span class="stringliteral">&quot;Node failed&quot;</span>);
  1328. <a name="l01293"></a>01293 failedNode-&gt;<a class="code" href="classPubSubFailedNodeMessage.html#adc7577760792d9a3a2285fb5a368c24d">setFailedNode</a>( oldNode );
  1329. <a name="l01294"></a>01294 failedNode-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#acb366745fb62311b100b1632b04b1141">PUBSUB_FAILEDNODE_L</a>( failedNode ));
  1330. <a name="l01295"></a>01295 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1331. <a name="l01296"></a>01296 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1332. <a name="l01297"></a>01297 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= failedNode-&gt;getByteLength()
  1333. <a name="l01298"></a>01298 );
  1334. <a name="l01299"></a>01299 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( <a class="code" href="classPubSubMMOG.html#a1e1ba5fd3c791f3aa2172e6b055f68bb">lobbyServer</a>, failedNode );
  1335. <a name="l01300"></a>01300
  1336. <a name="l01301"></a>01301 <span class="comment">// Request new Backup</span>
  1337. <a name="l01302"></a>01302 <a class="code" href="classPubSubHelpCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubHelpCall</a>* helpCall = <span class="keyword">new</span> <a class="code" href="classPubSubHelpCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubHelpCall</a>(<span class="stringliteral">&quot;I need a backup node&quot;</span>);
  1338. <a name="l01303"></a>01303 helpCall-&gt;<a class="code" href="classPubSubHelpCall.html#a8f442b6f719d15e347aa4187fb3d2b47">setHelpType</a>( <a class="code" href="PubSubMessage__m_8h.html#a0a7abf0acc5a382f3b386ab1a09cd07aaa575d5ab279429401172053d228e4838">PUBSUB_BACKUP</a> );
  1339. <a name="l01304"></a>01304 helpCall-&gt;<a class="code" href="classPubSubHelpCall.html#a526546e7f6cc281b640ffabca6fd4f29">setSubspaceId</a>( backupCall-&gt;<a class="code" href="classPubSubBackupCall.html#a78774c6987e65617ae00b8f896f2963b">getSubspaceId</a>() );
  1340. <a name="l01305"></a>01305 helpCall-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#aac95c8ba038a0a9dd3671a29330493a9">PUBSUB_HELPCALL_L</a>( helpCall ));
  1341. <a name="l01306"></a>01306 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1342. <a name="l01307"></a>01307 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1343. <a name="l01308"></a>01308 pubSubSignalingMessagesSize+= helpCall-&gt;getByteLength()
  1344. <a name="l01309"></a>01309 );
  1345. <a name="l01310"></a>01310 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( <a class="code" href="classPubSubMMOG.html#a1e1ba5fd3c791f3aa2172e6b055f68bb">lobbyServer</a>, helpCall );
  1346. <a name="l01311"></a>01311
  1347. <a name="l01312"></a>01312 <span class="comment">// find appropriate subspace and mark backup as failed</span>
  1348. <a name="l01313"></a>01313 <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a> subspaceId(backupCall-&gt;<a class="code" href="classPubSubBackupCall.html#a78774c6987e65617ae00b8f896f2963b">getSubspaceId</a>(), <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>);
  1349. <a name="l01314"></a>01314 std::map&lt;PubSubSubspaceId, PubSubSubspaceResponsible&gt;::iterator it;
  1350. <a name="l01315"></a>01315 it = <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.find( subspaceId );
  1351. <a name="l01316"></a>01316 <span class="keywordflow">if</span>( it == <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.end() ) {
  1352. <a name="l01317"></a>01317 <span class="keywordflow">return</span>;
  1353. <a name="l01318"></a>01318 }
  1354. <a name="l01319"></a>01319 it-&gt;second.setBackupNode( <a class="code" href="classNodeHandle.html#a79bf2c5e29c969cbd0b2581cb188d8a6" title="the unspecified NodeHandle">NodeHandle::UNSPECIFIED_NODE</a> );
  1355. <a name="l01320"></a>01320 }
  1356. <a name="l01321"></a>01321
  1357. <a name="l01322"></a><a class="code" href="classPubSubMMOG.html#a0ca3bd97cac131ba5c2ff02235cc6a2f">01322</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a0ca3bd97cac131ba5c2ff02235cc6a2f">PubSubMMOG::handlePingCallTimeout</a>( <a class="code" href="classPubSubPingCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubPingCall</a>* pingCall, <span class="keyword">const</span> <a class="code" href="classTransportAddress.html" title="This class implements a common transport address.">TransportAddress</a>&amp; oldNode )
  1358. <a name="l01323"></a>01323 {
  1359. <a name="l01324"></a>01324 <span class="comment">// Inform Lobbyserver over failed node</span>
  1360. <a name="l01325"></a>01325 <span class="keyword">const</span> <a class="code" href="classNodeHandle.html" title="This class implements a node handle.">NodeHandle</a>&amp; oldNodeHandle = <span class="keyword">dynamic_cast&lt;</span><span class="keyword">const </span><a class="code" href="classNodeHandle.html" title="This class implements a node handle.">NodeHandle</a>&amp;<span class="keyword">&gt;</span>(oldNode);
  1361. <a name="l01326"></a>01326 <span class="comment">// FIXME: use oldNodeHandle instead of oldNode</span>
  1362. <a name="l01327"></a>01327 <a class="code" href="classPubSubFailedNodeMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubFailedNodeMessage</a>* failedNode = <span class="keyword">new</span> <a class="code" href="classPubSubFailedNodeMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubFailedNodeMessage</a>(<span class="stringliteral">&quot;Node failed&quot;</span>);
  1363. <a name="l01328"></a>01328 failedNode-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#acb366745fb62311b100b1632b04b1141">PUBSUB_FAILEDNODE_L</a>( failedNode ));
  1364. <a name="l01329"></a>01329 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1365. <a name="l01330"></a>01330 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1366. <a name="l01331"></a>01331 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= failedNode-&gt;getByteLength()
  1367. <a name="l01332"></a>01332 );
  1368. <a name="l01333"></a>01333 failedNode-&gt;<a class="code" href="classPubSubFailedNodeMessage.html#adc7577760792d9a3a2285fb5a368c24d">setFailedNode</a>( oldNode );
  1369. <a name="l01334"></a>01334 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( <a class="code" href="classPubSubMMOG.html#a1e1ba5fd3c791f3aa2172e6b055f68bb">lobbyServer</a>, failedNode );
  1370. <a name="l01335"></a>01335
  1371. <a name="l01336"></a>01336 <span class="comment">// find appropriate subspace</span>
  1372. <a name="l01337"></a>01337 <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a> subspaceId(pingCall-&gt;<a class="code" href="classPubSubPingCall.html#a6c09797ec1a7e667e85b3daba1dc5a60">getSubspaceId</a>(), <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>);
  1373. <a name="l01338"></a>01338 std::map&lt;PubSubSubspaceId, PubSubSubspaceResponsible&gt;::iterator it;
  1374. <a name="l01339"></a>01339 it = <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.find( subspaceId );
  1375. <a name="l01340"></a>01340 <span class="keywordflow">if</span>( it == <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.end() ) {
  1376. <a name="l01341"></a>01341 <span class="keywordflow">return</span>;
  1377. <a name="l01342"></a>01342 }
  1378. <a name="l01343"></a>01343 <a class="code" href="classPubSubSubspaceResponsible.html">PubSubSubspaceResponsible</a>&amp; subspace = it-&gt;second;
  1379. <a name="l01344"></a>01344
  1380. <a name="l01345"></a>01345 <span class="keywordflow">if</span>( pingCall-&gt;<a class="code" href="classPubSubPingCall.html#ad2d88a7b8ff45cf95aabfcb792490d1d">getPingType</a>() == PUBSUB_PING_CHILD ){
  1381. <a name="l01346"></a>01346 <span class="comment">// remove child</span>
  1382. <a name="l01347"></a>01347 <a class="code" href="classPubSubMMOG.html#a104570a1f3f3f4951bf67e9b8e09b0e8">unsubscribeChild</a>( oldNodeHandle, subspace );
  1383. <a name="l01348"></a>01348
  1384. <a name="l01349"></a>01349 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>( pingCall-&gt;<a class="code" href="classPubSubPingCall.html#ad2d88a7b8ff45cf95aabfcb792490d1d">getPingType</a>() == PUBSUB_PING_BACKUP ){
  1385. <a name="l01350"></a>01350
  1386. <a name="l01351"></a>01351 <span class="comment">// if we didn&#39;t already have (or asked for) a new backup</span>
  1387. <a name="l01352"></a>01352 <span class="keywordflow">if</span>( !subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0c585a0f9e8162d0bd55a9698b5bff34">getBackupNode</a>().<a class="code" href="classNodeHandle.html#ab5136375a4548ced7c2014a73c8743c9" title="indicates if this NodeHandle is specified">isUnspecified</a>() &amp;&amp;
  1388. <a name="l01353"></a>01353 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0c585a0f9e8162d0bd55a9698b5bff34">getBackupNode</a>() == oldNodeHandle )
  1389. <a name="l01354"></a>01354 {
  1390. <a name="l01355"></a>01355 <span class="comment">// our backup timed out. we have to request a new one...</span>
  1391. <a name="l01356"></a>01356 <span class="comment">// delete old backup entry</span>
  1392. <a name="l01357"></a>01357 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a462a25a436aa25d8cc38310119a5d671">setBackupNode</a>( <a class="code" href="classNodeHandle.html#a79bf2c5e29c969cbd0b2581cb188d8a6" title="the unspecified NodeHandle">NodeHandle::UNSPECIFIED_NODE</a> );
  1393. <a name="l01358"></a>01358
  1394. <a name="l01359"></a>01359 <span class="comment">// Request new Backup</span>
  1395. <a name="l01360"></a>01360 <a class="code" href="classPubSubHelpCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubHelpCall</a>* helpCall = <span class="keyword">new</span> <a class="code" href="classPubSubHelpCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubHelpCall</a>(<span class="stringliteral">&quot;I need a backup node&quot;</span>);
  1396. <a name="l01361"></a>01361 helpCall-&gt;<a class="code" href="classPubSubHelpCall.html#a8f442b6f719d15e347aa4187fb3d2b47">setHelpType</a>( <a class="code" href="PubSubMessage__m_8h.html#a0a7abf0acc5a382f3b386ab1a09cd07aaa575d5ab279429401172053d228e4838">PUBSUB_BACKUP</a> );
  1397. <a name="l01362"></a>01362 helpCall-&gt;<a class="code" href="classPubSubHelpCall.html#a526546e7f6cc281b640ffabca6fd4f29">setSubspaceId</a>( pingCall-&gt;<a class="code" href="classPubSubPingCall.html#a6c09797ec1a7e667e85b3daba1dc5a60">getSubspaceId</a>() );
  1398. <a name="l01363"></a>01363 helpCall-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#aac95c8ba038a0a9dd3671a29330493a9">PUBSUB_HELPCALL_L</a>( helpCall ));
  1399. <a name="l01364"></a>01364 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1400. <a name="l01365"></a>01365 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1401. <a name="l01366"></a>01366 pubSubSignalingMessagesSize+= helpCall-&gt;getByteLength()
  1402. <a name="l01367"></a>01367 );
  1403. <a name="l01368"></a>01368 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( <a class="code" href="classPubSubMMOG.html#a1e1ba5fd3c791f3aa2172e6b055f68bb">lobbyServer</a>, helpCall );
  1404. <a name="l01369"></a>01369 }
  1405. <a name="l01370"></a>01370
  1406. <a name="l01371"></a>01371 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>( pingCall-&gt;<a class="code" href="classPubSubPingCall.html#ad2d88a7b8ff45cf95aabfcb792490d1d">getPingType</a>() == PUBSUB_PING_INTERMEDIATE ){
  1407. <a name="l01372"></a>01372 <span class="comment">// one intermediate node timed out. we have to request a new one...</span>
  1408. <a name="l01373"></a>01373 <span class="comment">// delete old intermediate entry</span>
  1409. <a name="l01374"></a>01374 deque&lt;PubSubSubspaceResponsible::IntermediateNode&gt;::iterator iit;
  1410. <a name="l01375"></a>01375 <span class="keywordflow">for</span>( iit = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.begin(); iit != subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.end(); ++iit ){
  1411. <a name="l01376"></a>01376 <span class="keywordflow">if</span>( !iit-&gt;node.isUnspecified() &amp;&amp; oldNode == iit-&gt;node ) <span class="keywordflow">break</span>;
  1412. <a name="l01377"></a>01377 }
  1413. <a name="l01378"></a>01378 <span class="keywordflow">if</span>( iit == subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.end() ) <span class="keywordflow">return</span>;
  1414. <a name="l01379"></a>01379
  1415. <a name="l01380"></a>01380 <a class="code" href="classNodeHandle.html" title="This class implements a node handle.">NodeHandle</a> oldNode = iit-&gt;node;
  1416. <a name="l01381"></a>01381 iit-&gt;node = <a class="code" href="classNodeHandle.html#a79bf2c5e29c969cbd0b2581cb188d8a6" title="the unspecified NodeHandle">NodeHandle::UNSPECIFIED_NODE</a>;
  1417. <a name="l01382"></a>01382
  1418. <a name="l01383"></a>01383 <span class="comment">// inform Backup</span>
  1419. <a name="l01384"></a>01384 <span class="keywordflow">if</span>( !subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0c585a0f9e8162d0bd55a9698b5bff34">getBackupNode</a>().<a class="code" href="classNodeHandle.html#ab5136375a4548ced7c2014a73c8743c9" title="indicates if this NodeHandle is specified">isUnspecified</a>() ){
  1420. <a name="l01385"></a>01385 <a class="code" href="classPubSubBackupIntermediateMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupIntermediateMessage</a>* backupMsg = <span class="keyword">new</span> <a class="code" href="classPubSubBackupIntermediateMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupIntermediateMessage</a>(<span class="stringliteral">&quot;Backup: Intermediate failed&quot;</span>);
  1421. <a name="l01386"></a>01386 backupMsg-&gt;<a class="code" href="classPubSubBackupIntermediateMessage.html#ae84b3d586b249c5d8b0c99cc5d199a5a">setSubspaceId</a>( pingCall-&gt;<a class="code" href="classPubSubPingCall.html#a6c09797ec1a7e667e85b3daba1dc5a60">getSubspaceId</a>() );
  1422. <a name="l01387"></a>01387 backupMsg-&gt;<a class="code" href="classPubSubBackupIntermediateMessage.html#adea3fba4eae66064247ab342fc487302">setPos</a>( iit - it-&gt;second.intermediateNodes.begin() );
  1423. <a name="l01388"></a>01388 backupMsg-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#af0f2565f24c2e5b8e3655c3fb073d887">PUBSUB_BACKUPINTERMEDIATE_L</a>( backupMsg ));
  1424. <a name="l01389"></a>01389 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1425. <a name="l01390"></a>01390 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1426. <a name="l01391"></a>01391 pubSubSignalingMessagesSize+= backupMsg-&gt;getByteLength()
  1427. <a name="l01392"></a>01392 );
  1428. <a name="l01393"></a>01393 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0c585a0f9e8162d0bd55a9698b5bff34">getBackupNode</a>(), backupMsg );
  1429. <a name="l01394"></a>01394 }
  1430. <a name="l01395"></a>01395
  1431. <a name="l01396"></a>01396 <span class="keywordtype">bool</span> fixNeeded = <span class="keyword">false</span>;
  1432. <a name="l01397"></a>01397 <span class="comment">// Take over all children until new intermediate is found.</span>
  1433. <a name="l01398"></a>01398 set&lt;NodeHandle&gt;::iterator childIt;
  1434. <a name="l01399"></a>01399 <span class="keywordflow">for</span>( childIt = iit-&gt;children.begin(); childIt != iit-&gt;children.end(); ++childIt ){
  1435. <a name="l01400"></a>01400 <span class="keywordflow">if</span>( !subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0dad92f50458f0daf1f719c842661a7b">cachedChildren</a>.insert( make_pair(*childIt, <span class="keyword">false</span>)).second ){
  1436. <a name="l01401"></a>01401 fixNeeded = <span class="keyword">true</span>;
  1437. <a name="l01402"></a>01402 }
  1438. <a name="l01403"></a>01403
  1439. <a name="l01404"></a>01404 <span class="comment">// Inform Backup</span>
  1440. <a name="l01405"></a>01405 <span class="keywordflow">if</span>( !subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0c585a0f9e8162d0bd55a9698b5bff34">getBackupNode</a>().<a class="code" href="classNodeHandle.html#ab5136375a4548ced7c2014a73c8743c9" title="indicates if this NodeHandle is specified">isUnspecified</a>() ){
  1441. <a name="l01406"></a>01406 <a class="code" href="classPubSubBackupSubscriptionMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupSubscriptionMessage</a>* backupMsg = <span class="keyword">new</span> <a class="code" href="classPubSubBackupSubscriptionMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupSubscriptionMessage</a>(<span class="stringliteral">&quot;Backup: nodes moved to cache&quot;</span>);
  1442. <a name="l01407"></a>01407 backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#a3b6847353d9871bcc13c01ac682c7739">setSubspaceId</a>( pingCall-&gt;<a class="code" href="classPubSubPingCall.html#a6c09797ec1a7e667e85b3daba1dc5a60">getSubspaceId</a>() );
  1443. <a name="l01408"></a>01408 backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#ab3a10059be8de4c048576c72a1c83fc7">setChild</a>( *childIt );
  1444. <a name="l01409"></a>01409 backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#a45ca49bce2d925ec64da036f7c67ec1f">setOldParent</a>( oldNodeHandle );
  1445. <a name="l01410"></a>01410 backupMsg-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a485654404a477aa60cb34dd0ae722258">PUBSUB_BACKUPSUBSCRIPTION_L</a>( backupMsg ));
  1446. <a name="l01411"></a>01411 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1447. <a name="l01412"></a>01412 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1448. <a name="l01413"></a>01413 pubSubSignalingMessagesSize+= backupMsg-&gt;getByteLength()
  1449. <a name="l01414"></a>01414 );
  1450. <a name="l01415"></a>01415 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0c585a0f9e8162d0bd55a9698b5bff34">getBackupNode</a>(), backupMsg );
  1451. <a name="l01416"></a>01416 }
  1452. <a name="l01417"></a>01417 }
  1453. <a name="l01418"></a>01418 iit-&gt;children.clear();
  1454. <a name="l01419"></a>01419 <span class="keywordflow">if</span>( fixNeeded ) subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ab2792e92420b16f1e971e9ff83ebce70">fixTotalChildrenCount</a>();
  1455. <a name="l01420"></a>01420
  1456. <a name="l01421"></a>01421 <span class="comment">// inform parent of intermediate node</span>
  1457. <a name="l01422"></a>01422 <span class="keywordtype">int</span> parentPos = (iit - subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.begin())/<a class="code" href="classPubSubMMOG.html#a7d310afbff3e729b6a33f8e6614de07e">maxChildren</a> -1;
  1458. <a name="l01423"></a>01423 <span class="keywordflow">if</span>( parentPos &gt;= 0 ){
  1459. <a name="l01424"></a>01424 <a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html">PubSubSubspaceResponsible::IntermediateNode</a>&amp; parent = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>[parentPos];
  1460. <a name="l01425"></a>01425 <span class="keywordflow">if</span>( !parent.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a597257efca218f9499aa4e113d99e139">node</a>.<a class="code" href="classNodeHandle.html#ab5136375a4548ced7c2014a73c8743c9" title="indicates if this NodeHandle is specified">isUnspecified</a>() ){
  1461. <a name="l01426"></a>01426 <a class="code" href="classPubSubNodeLeftMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubNodeLeftMessage</a>* goneMsg = <span class="keyword">new</span> <a class="code" href="classPubSubNodeLeftMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubNodeLeftMessage</a>(<span class="stringliteral">&quot;Intermediate left Subspace&quot;</span>);
  1462. <a name="l01427"></a>01427 goneMsg-&gt;<a class="code" href="classPubSubNodeLeftMessage.html#a0e52c6bd254d41b146393d4b825f5cb8">setNode</a>( oldNodeHandle );
  1463. <a name="l01428"></a>01428 goneMsg-&gt;<a class="code" href="classPubSubNodeLeftMessage.html#ac7572204eed418bb6befc42859d682bc">setSubspaceId</a>( subspace.<a class="code" href="classPubSubSubspace.html#a68c0be6c59e362d291533d74a65aa187">getId</a>().<a class="code" href="classPubSubSubspaceId.html#afb4d71a54d5337d65bb89c27e4d4938c">getId</a>() );
  1464. <a name="l01429"></a>01429 goneMsg-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#ac2a4c9a20c40c17b2a948f346d5ae4fc">PUBSUB_NODELEFT_L</a>( goneMsg ));
  1465. <a name="l01430"></a>01430 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1466. <a name="l01431"></a>01431 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1467. <a name="l01432"></a>01432 pubSubSignalingMessagesSize+= goneMsg-&gt;getByteLength()
  1468. <a name="l01433"></a>01433 );
  1469. <a name="l01434"></a>01434 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( parent.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a597257efca218f9499aa4e113d99e139">node</a>, goneMsg );
  1470. <a name="l01435"></a>01435 }
  1471. <a name="l01436"></a>01436 }
  1472. <a name="l01437"></a>01437
  1473. <a name="l01438"></a>01438 <span class="comment">// Request new Intermediate</span>
  1474. <a name="l01439"></a>01439 <a class="code" href="classPubSubHelpCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubHelpCall</a>* helpCall = <span class="keyword">new</span> <a class="code" href="classPubSubHelpCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubHelpCall</a>(<span class="stringliteral">&quot;I need an intermediate node&quot;</span>);
  1475. <a name="l01440"></a>01440 helpCall-&gt;<a class="code" href="classPubSubHelpCall.html#a8f442b6f719d15e347aa4187fb3d2b47">setHelpType</a>( <a class="code" href="PubSubMessage__m_8h.html#a0a7abf0acc5a382f3b386ab1a09cd07aa99501a84d5d53b3a4c78362dc7c7a551">PUBSUB_INTERMEDIATE</a> );
  1476. <a name="l01441"></a>01441 helpCall-&gt;<a class="code" href="classPubSubHelpCall.html#a526546e7f6cc281b640ffabca6fd4f29">setSubspaceId</a>( pingCall-&gt;<a class="code" href="classPubSubPingCall.html#a6c09797ec1a7e667e85b3daba1dc5a60">getSubspaceId</a>() );
  1477. <a name="l01442"></a>01442 helpCall-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#aac95c8ba038a0a9dd3671a29330493a9">PUBSUB_HELPCALL_L</a>( helpCall ));
  1478. <a name="l01443"></a>01443 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1479. <a name="l01444"></a>01444 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1480. <a name="l01445"></a>01445 pubSubSignalingMessagesSize+= helpCall-&gt;getByteLength()
  1481. <a name="l01446"></a>01446 );
  1482. <a name="l01447"></a>01447 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( <a class="code" href="classPubSubMMOG.html#a1e1ba5fd3c791f3aa2172e6b055f68bb">lobbyServer</a>, helpCall );
  1483. <a name="l01448"></a>01448 }
  1484. <a name="l01449"></a>01449 <span class="comment">// FIXME: just for testing</span>
  1485. <a name="l01450"></a>01450 <span class="keywordtype">int</span> iii = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a41dc142fbdac4eebcadd7b62ee0a822e">getTotalChildrenCount</a>();
  1486. <a name="l01451"></a>01451 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ab2792e92420b16f1e971e9ff83ebce70">fixTotalChildrenCount</a>();
  1487. <a name="l01452"></a>01452 <span class="keywordflow">if</span>( iii != subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a41dc142fbdac4eebcadd7b62ee0a822e">getTotalChildrenCount</a>() ){
  1488. <a name="l01453"></a>01453 opp_error(<span class="stringliteral">&quot;Huh?&quot;</span>);
  1489. <a name="l01454"></a>01454 }
  1490. <a name="l01455"></a>01455
  1491. <a name="l01456"></a>01456 }
  1492. <a name="l01457"></a>01457
  1493. <a name="l01458"></a><a class="code" href="classPubSubMMOG.html#a1e97ea82ff0848af1f5437b1c8da7c99">01458</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a1e97ea82ff0848af1f5437b1c8da7c99">PubSubMMOG::handleSubscriptionCallTimeout</a>( <a class="code" href="classPubSubSubscriptionCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubSubscriptionCall</a>* subscriptionCall, <span class="keyword">const</span> <a class="code" href="classTransportAddress.html" title="This class implements a common transport address.">TransportAddress</a>&amp; oldNode )
  1494. <a name="l01459"></a>01459 {
  1495. <a name="l01460"></a>01460 <span class="comment">// FIXME: cast oldNode to NodeHandle</span>
  1496. <a name="l01461"></a>01461 <span class="comment">// our subscription call timed out. This means the responsible node is dead...</span>
  1497. <a name="l01462"></a>01462 <span class="comment">// Inform Lobbyserver over failed node</span>
  1498. <a name="l01463"></a>01463 <a class="code" href="classPubSubFailedNodeMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubFailedNodeMessage</a>* failedNode = <span class="keyword">new</span> <a class="code" href="classPubSubFailedNodeMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubFailedNodeMessage</a>(<span class="stringliteral">&quot;Node failed&quot;</span>);
  1499. <a name="l01464"></a>01464 failedNode-&gt;<a class="code" href="classPubSubFailedNodeMessage.html#adc7577760792d9a3a2285fb5a368c24d">setFailedNode</a>( oldNode );
  1500. <a name="l01465"></a>01465 failedNode-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#acb366745fb62311b100b1632b04b1141">PUBSUB_FAILEDNODE_L</a>( failedNode ));
  1501. <a name="l01466"></a>01466 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1502. <a name="l01467"></a>01467 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1503. <a name="l01468"></a>01468 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= failedNode-&gt;getByteLength()
  1504. <a name="l01469"></a>01469 );
  1505. <a name="l01470"></a>01470 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( <a class="code" href="classPubSubMMOG.html#a1e1ba5fd3c791f3aa2172e6b055f68bb">lobbyServer</a>, failedNode );
  1506. <a name="l01471"></a>01471
  1507. <a name="l01472"></a>01472 <span class="comment">// Ask for new responsible node</span>
  1508. <a name="l01473"></a>01473 <a class="code" href="classPubSubResponsibleNodeCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubResponsibleNodeCall</a>* respCall = <span class="keyword">new</span> <a class="code" href="classPubSubResponsibleNodeCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubResponsibleNodeCall</a>(<span class="stringliteral">&quot;Request Responsible NodeHandle&quot;</span>);
  1509. <a name="l01474"></a>01474 <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a> subspaceId( subscriptionCall-&gt;<a class="code" href="classPubSubSubscriptionCall.html#a6cba83861e6c98de7a2721a596d2ff14">getSubspaceId</a>(), <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>);
  1510. <a name="l01475"></a>01475 respCall-&gt;<a class="code" href="classPubSubResponsibleNodeCall.html#a061903ad243ddb58c094ee5a3c5a206b">setSubspacePos</a>( <a class="code" href="classVector2D.html">Vector2D</a>(subspaceId.getX(), subspaceId.getY()) );
  1511. <a name="l01476"></a>01476 respCall-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a5d4e7d4a5b91386ccba0e0a03330ab9d">PUBSUB_RESPONSIBLENODECALL_L</a>( respCall ));
  1512. <a name="l01477"></a>01477 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1513. <a name="l01478"></a>01478 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1514. <a name="l01479"></a>01479 pubSubSignalingMessagesSize+= respCall-&gt;getByteLength()
  1515. <a name="l01480"></a>01480 );
  1516. <a name="l01481"></a>01481 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( <a class="code" href="classPubSubMMOG.html#a1e1ba5fd3c791f3aa2172e6b055f68bb">lobbyServer</a>, respCall, NULL, 5, 5 ); <span class="comment">// FIXME: Make it a parameter...</span>
  1517. <a name="l01482"></a>01482 }
  1518. <a name="l01483"></a>01483
  1519. <a name="l01484"></a><a class="code" href="classPubSubMMOG.html#abd3f25e6c1521cc5d6959fc1929a2ac6">01484</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#abd3f25e6c1521cc5d6959fc1929a2ac6">PubSubMMOG::handleReplacementMessage</a>( <a class="code" href="classPubSubReplacementMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubReplacementMessage</a>* replaceMsg )
  1520. <a name="l01485"></a>01485 {
  1521. <a name="l01486"></a>01486 <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a> subspaceId(replaceMsg-&gt;<a class="code" href="classPubSubReplacementMessage.html#ab1379bead1302a2e9278039991db882f">getSubspaceId</a>(), <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>);
  1522. <a name="l01487"></a>01487
  1523. <a name="l01488"></a>01488 <span class="comment">// There&#39;s a new responsible node for a subspace</span>
  1524. <a name="l01489"></a>01489 <span class="comment">// Replace the old one in the intermediateSubspaces map...</span>
  1525. <a name="l01490"></a>01490 std::map&lt;PubSubSubspaceId, PubSubSubspaceIntermediate&gt;::iterator it;
  1526. <a name="l01491"></a>01491 it = <a class="code" href="classPubSubMMOG.html#ac2ff9ed8d82f2fd97f69343cd8ee78ac">intermediateSubspaces</a>.find( subspaceId );
  1527. <a name="l01492"></a>01492 <span class="keywordflow">if</span>( it != <a class="code" href="classPubSubMMOG.html#ac2ff9ed8d82f2fd97f69343cd8ee78ac">intermediateSubspaces</a>.end() ) {
  1528. <a name="l01493"></a>01493 it-&gt;second.setResponsibleNode( replaceMsg-&gt;<a class="code" href="classPubSubReplacementMessage.html#ad86ff24aed5d6c098aa882032966cb79">getNewResponsibleNode</a>() );
  1529. <a name="l01494"></a>01494 }
  1530. <a name="l01495"></a>01495
  1531. <a name="l01496"></a>01496 <span class="comment">// ... and in the subsribed subspaces list</span>
  1532. <a name="l01497"></a>01497 std::list&lt;PubSubSubspace&gt;::iterator iit;
  1533. <a name="l01498"></a>01498 <span class="keywordflow">for</span>( iit = <a class="code" href="classPubSubMMOG.html#a0535f1d205515626aaa20d25f8da3cda">subscribedSubspaces</a>.begin(); iit != <a class="code" href="classPubSubMMOG.html#a0535f1d205515626aaa20d25f8da3cda">subscribedSubspaces</a>.end(); ++iit ){
  1534. <a name="l01499"></a>01499 <span class="keywordflow">if</span>( iit-&gt;getId() == subspaceId ) {
  1535. <a name="l01500"></a>01500 iit-&gt;setResponsibleNode( replaceMsg-&gt;<a class="code" href="classPubSubReplacementMessage.html#ad86ff24aed5d6c098aa882032966cb79">getNewResponsibleNode</a>() );
  1536. <a name="l01501"></a>01501 <span class="keywordflow">return</span>;
  1537. <a name="l01502"></a>01502 }
  1538. <a name="l01503"></a>01503 }
  1539. <a name="l01504"></a>01504 }
  1540. <a name="l01505"></a>01505
  1541. <a name="l01506"></a><a class="code" href="classPubSubMMOG.html#af1197b5fab38765c9e510cb6e755f62a">01506</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#af1197b5fab38765c9e510cb6e755f62a">PubSubMMOG::handleReleaseIntermediate</a>( <a class="code" href="classPubSubReleaseIntermediateMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubReleaseIntermediateMessage</a>* releaseMsg )
  1542. <a name="l01507"></a>01507 {
  1543. <a name="l01508"></a>01508 <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a> subspaceId(releaseMsg-&gt;<a class="code" href="classPubSubReleaseIntermediateMessage.html#a18c562845e99ef0ef4d72faba29aded5">getSubspaceId</a>(), <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>);
  1544. <a name="l01509"></a>01509 <a class="code" href="classPubSubMMOG.html#ac2ff9ed8d82f2fd97f69343cd8ee78ac">intermediateSubspaces</a>.erase( subspaceId );
  1545. <a name="l01510"></a>01510 }
  1546. <a name="l01511"></a>01511
  1547. <a name="l01512"></a><a class="code" href="classPubSubMMOG.html#a77b144f6034216ef0184589cf5b4da8d">01512</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a77b144f6034216ef0184589cf5b4da8d">PubSubMMOG::handleIntermediateBackup</a>( <a class="code" href="classPubSubBackupIntermediateMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupIntermediateMessage</a>* backupMsg )
  1548. <a name="l01513"></a>01513 {
  1549. <a name="l01514"></a>01514 <span class="comment">// find appropriate subspace</span>
  1550. <a name="l01515"></a>01515 <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a> subspaceId(backupMsg-&gt;<a class="code" href="classPubSubBackupIntermediateMessage.html#a29368618e2b7954ae2080f6d3f53cada">getSubspaceId</a>(), <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>);
  1551. <a name="l01516"></a>01516 std::map&lt;PubSubSubspaceId, PubSubSubspaceResponsible&gt;::iterator it;
  1552. <a name="l01517"></a>01517 it = <a class="code" href="classPubSubMMOG.html#a9cb86fc744b2f9b087a66e0af879f1fc">backupSubspaces</a>.find( subspaceId );
  1553. <a name="l01518"></a>01518 <span class="keywordflow">if</span>( it == <a class="code" href="classPubSubMMOG.html#a9cb86fc744b2f9b087a66e0af879f1fc">backupSubspaces</a>.end() ) {
  1554. <a name="l01519"></a>01519 <span class="keywordflow">return</span>;
  1555. <a name="l01520"></a>01520 }
  1556. <a name="l01521"></a>01521
  1557. <a name="l01522"></a>01522 <span class="keywordflow">if</span>( backupMsg-&gt;<a class="code" href="classPubSubBackupIntermediateMessage.html#ab6e4a0ccaf47b2adde4de6629eee7cd2">getPos</a>() &gt;= (int) it-&gt;second.intermediateNodes.size() ){
  1558. <a name="l01523"></a>01523 it-&gt;second.intermediateNodes.resize( backupMsg-&gt;<a class="code" href="classPubSubBackupIntermediateMessage.html#ab6e4a0ccaf47b2adde4de6629eee7cd2">getPos</a>() + 1 );
  1559. <a name="l01524"></a>01524 }
  1560. <a name="l01525"></a>01525 it-&gt;second.intermediateNodes[ backupMsg-&gt;<a class="code" href="classPubSubBackupIntermediateMessage.html#ab6e4a0ccaf47b2adde4de6629eee7cd2">getPos</a>() ].node = backupMsg-&gt;<a class="code" href="classPubSubBackupIntermediateMessage.html#ae375666139531eea47c20adc4d95437c">getNode</a>();
  1561. <a name="l01526"></a>01526 }
  1562. <a name="l01527"></a>01527
  1563. <a name="l01528"></a><a class="code" href="classPubSubMMOG.html#a354f1a0173cb3cc5a00bc7d16d17f73a">01528</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a354f1a0173cb3cc5a00bc7d16d17f73a">PubSubMMOG::handleSubscriptionBackup</a>( <a class="code" href="classPubSubBackupSubscriptionMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupSubscriptionMessage</a>* backupMsg )
  1564. <a name="l01529"></a>01529 {
  1565. <a name="l01530"></a>01530 <span class="comment">// Note: this funktion may break subspace&#39;s tatalChildrenCall</span>
  1566. <a name="l01531"></a>01531 <span class="comment">// You have to use fixTotalChildrenCount before using the subspace</span>
  1567. <a name="l01532"></a>01532 <span class="comment">// find appropriate subspace</span>
  1568. <a name="l01533"></a>01533 <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a> subspaceId(backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#a86c045717d5a7327f8e9484b399167d5">getSubspaceId</a>(), <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>);
  1569. <a name="l01534"></a>01534 std::map&lt;PubSubSubspaceId, PubSubSubspaceResponsible&gt;::iterator it;
  1570. <a name="l01535"></a>01535 it = <a class="code" href="classPubSubMMOG.html#a9cb86fc744b2f9b087a66e0af879f1fc">backupSubspaces</a>.find( subspaceId );
  1571. <a name="l01536"></a>01536 <span class="keywordflow">if</span>( it == <a class="code" href="classPubSubMMOG.html#a9cb86fc744b2f9b087a66e0af879f1fc">backupSubspaces</a>.end() ) {
  1572. <a name="l01537"></a>01537 <span class="keywordflow">return</span>;
  1573. <a name="l01538"></a>01538 }
  1574. <a name="l01539"></a>01539 <a class="code" href="classPubSubSubspaceResponsible.html">PubSubSubspaceResponsible</a>&amp; subspace = it-&gt;second;
  1575. <a name="l01540"></a>01540
  1576. <a name="l01541"></a>01541 deque&lt;PubSubSubspaceResponsible::IntermediateNode&gt;::iterator iit;
  1577. <a name="l01542"></a>01542
  1578. <a name="l01543"></a>01543 <span class="keywordflow">if</span>( !backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#a9f318b50e53b2c75f8cac7ab2629a614">getOldParent</a>().<a class="code" href="classNodeHandle.html#ab5136375a4548ced7c2014a73c8743c9" title="indicates if this NodeHandle is specified">isUnspecified</a>() ){
  1579. <a name="l01544"></a>01544 <span class="comment">// oldParent set -&gt; move child</span>
  1580. <a name="l01545"></a>01545 <span class="keywordflow">if</span>( backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#a9f318b50e53b2c75f8cac7ab2629a614">getOldParent</a>() == subspace.<a class="code" href="classPubSubSubspace.html#a996b0242f4c47164d5ee2141755d8fb1">getResponsibleNode</a>() ){
  1581. <a name="l01546"></a>01546 <span class="comment">// direct child -&gt; cache</span>
  1582. <a name="l01547"></a>01547 subspace.<a class="code" href="classPubSubSubspaceIntermediate.html#ada0034be890586e3cc0305bfa089e031">removeChild</a>( backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#a457980ddd7bf8f15c5392ab43b0d090e">getChild</a>() );
  1583. <a name="l01548"></a>01548 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0dad92f50458f0daf1f719c842661a7b">cachedChildren</a>.insert(make_pair( backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#a457980ddd7bf8f15c5392ab43b0d090e">getChild</a>(), <span class="keyword">false</span>) );
  1584. <a name="l01549"></a>01549
  1585. <a name="l01550"></a>01550 } <span class="keywordflow">else</span> {
  1586. <a name="l01551"></a>01551 <span class="comment">// from I -&gt; chache</span>
  1587. <a name="l01552"></a>01552 <span class="keywordflow">for</span>( iit = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.begin(); iit != subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.end(); ++iit ){
  1588. <a name="l01553"></a>01553 <span class="comment">// if( !iit-&gt;node.isUnspecified() &amp;&amp; iit-&gt;node == backupMsg-&gt;getOldParent() ){</span>
  1589. <a name="l01554"></a>01554 iit-&gt;children.erase( backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#a457980ddd7bf8f15c5392ab43b0d090e">getChild</a>() );
  1590. <a name="l01555"></a>01555 <span class="comment">// }</span>
  1591. <a name="l01556"></a>01556 }
  1592. <a name="l01557"></a>01557 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0dad92f50458f0daf1f719c842661a7b">cachedChildren</a>.insert(make_pair( backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#a457980ddd7bf8f15c5392ab43b0d090e">getChild</a>(), <span class="keyword">false</span>) );
  1593. <a name="l01558"></a>01558 }
  1594. <a name="l01559"></a>01559 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>( backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#aaca1114e8cbfe010357b2088dbb5696a">getParent</a>().<a class="code" href="classNodeHandle.html#ab5136375a4548ced7c2014a73c8743c9" title="indicates if this NodeHandle is specified">isUnspecified</a>() ){
  1595. <a name="l01560"></a>01560 <span class="comment">// parent not set -&gt; new child to chache</span>
  1596. <a name="l01561"></a>01561 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0dad92f50458f0daf1f719c842661a7b">cachedChildren</a>.insert(make_pair( backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#a457980ddd7bf8f15c5392ab43b0d090e">getChild</a>(), <span class="keyword">false</span>) );
  1597. <a name="l01562"></a>01562
  1598. <a name="l01563"></a>01563 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>( backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#aaca1114e8cbfe010357b2088dbb5696a">getParent</a>() == subspace.<a class="code" href="classPubSubSubspace.html#a996b0242f4c47164d5ee2141755d8fb1">getResponsibleNode</a>() ){
  1599. <a name="l01564"></a>01564 <span class="comment">// new direct child</span>
  1600. <a name="l01565"></a>01565 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ae254ce652d4827abfb7981b4f067c89a">addChild</a>( backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#a457980ddd7bf8f15c5392ab43b0d090e">getChild</a>() );
  1601. <a name="l01566"></a>01566 } <span class="keywordflow">else</span> {
  1602. <a name="l01567"></a>01567 <span class="comment">// move child from cache to intermediate</span>
  1603. <a name="l01568"></a>01568 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0dad92f50458f0daf1f719c842661a7b">cachedChildren</a>.erase( backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#a457980ddd7bf8f15c5392ab43b0d090e">getChild</a>() );
  1604. <a name="l01569"></a>01569
  1605. <a name="l01570"></a>01570 <span class="keywordflow">for</span>( iit = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.begin(); iit != subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.end(); ++iit ){
  1606. <a name="l01571"></a>01571 <span class="keywordflow">if</span>( !iit-&gt;node.isUnspecified() &amp;&amp; iit-&gt;node == backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#aaca1114e8cbfe010357b2088dbb5696a">getParent</a>() ){
  1607. <a name="l01572"></a>01572 iit-&gt;children.insert( backupMsg-&gt;<a class="code" href="classPubSubBackupSubscriptionMessage.html#a457980ddd7bf8f15c5392ab43b0d090e">getChild</a>() );
  1608. <a name="l01573"></a>01573 }
  1609. <a name="l01574"></a>01574 }
  1610. <a name="l01575"></a>01575 <span class="comment">// FIXME: check for errors</span>
  1611. <a name="l01576"></a>01576 }
  1612. <a name="l01577"></a>01577 }
  1613. <a name="l01578"></a>01578
  1614. <a name="l01579"></a><a class="code" href="classPubSubMMOG.html#a74e961ef109ba657e32f82519721eeaf">01579</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a74e961ef109ba657e32f82519721eeaf">PubSubMMOG::handleUnsubscribeBackup</a>( <a class="code" href="classPubSubBackupUnsubscribeMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupUnsubscribeMessage</a>* backupMsg )
  1615. <a name="l01580"></a>01580 {
  1616. <a name="l01581"></a>01581 <span class="comment">// Note: this funktion may break subspace&#39;s tatalChildrenCall</span>
  1617. <a name="l01582"></a>01582 <span class="comment">// You have to use fixTotalChildrenCount before using the subspace</span>
  1618. <a name="l01583"></a>01583 <span class="comment">// find appropriate subspace</span>
  1619. <a name="l01584"></a>01584 <a class="code" href="classPubSubSubspaceId.html">PubSubSubspaceId</a> subspaceId(backupMsg-&gt;<a class="code" href="classPubSubBackupUnsubscribeMessage.html#abd6c02f362cbe028c6734790c58c0f7a">getSubspaceId</a>(), <a class="code" href="classPubSubMMOG.html#a4051d53d8d09521b830246ca19b0004b">numSubspaces</a>);
  1620. <a name="l01585"></a>01585 std::map&lt;PubSubSubspaceId, PubSubSubspaceResponsible&gt;::iterator it;
  1621. <a name="l01586"></a>01586 it = <a class="code" href="classPubSubMMOG.html#a9cb86fc744b2f9b087a66e0af879f1fc">backupSubspaces</a>.find( subspaceId );
  1622. <a name="l01587"></a>01587 <span class="keywordflow">if</span>( it == <a class="code" href="classPubSubMMOG.html#a9cb86fc744b2f9b087a66e0af879f1fc">backupSubspaces</a>.end() ) {
  1623. <a name="l01588"></a>01588 <span class="keywordflow">return</span>;
  1624. <a name="l01589"></a>01589 }
  1625. <a name="l01590"></a>01590 <a class="code" href="classPubSubSubspaceResponsible.html">PubSubSubspaceResponsible</a>&amp; subspace = it-&gt;second;
  1626. <a name="l01591"></a>01591
  1627. <a name="l01592"></a>01592 deque&lt;PubSubSubspaceResponsible::IntermediateNode&gt;::iterator iit;
  1628. <a name="l01593"></a>01593 set&lt;NodeHandle&gt;::iterator childIt;
  1629. <a name="l01594"></a>01594
  1630. <a name="l01595"></a>01595 <span class="keywordflow">if</span>( !subspace.<a class="code" href="classPubSubSubspaceIntermediate.html#ada0034be890586e3cc0305bfa089e031">removeChild</a>(backupMsg-&gt;<a class="code" href="classPubSubBackupUnsubscribeMessage.html#a67e1e3ffdb3722403645fbfdf007ae57">getChild</a>()) &amp;&amp; !subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0dad92f50458f0daf1f719c842661a7b">cachedChildren</a>.erase( backupMsg-&gt;<a class="code" href="classPubSubBackupUnsubscribeMessage.html#a67e1e3ffdb3722403645fbfdf007ae57">getChild</a>()) ){
  1631. <a name="l01596"></a>01596 <span class="keywordflow">for</span>( iit = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.begin(); iit != subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.end(); ++iit ){
  1632. <a name="l01597"></a>01597 iit-&gt;children.erase( backupMsg-&gt;<a class="code" href="classPubSubBackupUnsubscribeMessage.html#a67e1e3ffdb3722403645fbfdf007ae57">getChild</a>() );
  1633. <a name="l01598"></a>01598 }
  1634. <a name="l01599"></a>01599 }
  1635. <a name="l01600"></a>01600 <span class="keywordflow">if</span>( !backupMsg-&gt;<a class="code" href="classPubSubBackupUnsubscribeMessage.html#a35249f2b557ff54817a03fcaa927f148">getIntermediate</a>().<a class="code" href="classNodeHandle.html#ab5136375a4548ced7c2014a73c8743c9" title="indicates if this NodeHandle is specified">isUnspecified</a>() ){
  1636. <a name="l01601"></a>01601 <span class="comment">// remove intermediate</span>
  1637. <a name="l01602"></a>01602 <span class="keywordflow">for</span>( iit = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.begin(); iit != subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.end(); ++iit ){
  1638. <a name="l01603"></a>01603 <span class="keywordflow">if</span>( !iit-&gt;node.isUnspecified() &amp;&amp; iit-&gt;node == backupMsg-&gt;<a class="code" href="classPubSubBackupUnsubscribeMessage.html#a35249f2b557ff54817a03fcaa927f148">getIntermediate</a>() ){
  1639. <a name="l01604"></a>01604 <span class="keywordflow">for</span>( childIt = iit-&gt;children.begin(); childIt != iit-&gt;children.end(); ++childIt ){
  1640. <a name="l01605"></a>01605 <span class="comment">// FIXME: note really stable. let the resp node inform us about child moves</span>
  1641. <a name="l01606"></a>01606 <span class="comment">// remove children of last intermediate</span>
  1642. <a name="l01607"></a>01607 <span class="keywordflow">if</span>( subspace.<a class="code" href="classPubSubSubspaceIntermediate.html#a17ae7d975c0ae11c5b8e25c970e2fdb4">getNumChildren</a>() + subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0037dfdbb81b9918713cba46ad994cb9">getNumIntermediates</a>() &lt; <a class="code" href="classPubSubMMOG.html#a7d310afbff3e729b6a33f8e6614de07e">maxChildren</a> ){
  1643. <a name="l01608"></a>01608 <span class="comment">// we have room for the child</span>
  1644. <a name="l01609"></a>01609 subspace.<a class="code" href="classPubSubSubspaceIntermediate.html#aef3a0468a7eb4cbd84f774e2de574b16">children</a>.insert( *childIt );
  1645. <a name="l01610"></a>01610 } <span class="keywordflow">else</span> {
  1646. <a name="l01611"></a>01611 <span class="comment">// Node has to go to some intermediate</span>
  1647. <a name="l01612"></a>01612 <span class="comment">// cache it</span>
  1648. <a name="l01613"></a>01613 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0dad92f50458f0daf1f719c842661a7b">cachedChildren</a>.insert( make_pair(*childIt, <span class="keyword">true</span>) );
  1649. <a name="l01614"></a>01614 }
  1650. <a name="l01615"></a>01615 }
  1651. <a name="l01616"></a>01616 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.erase( iit );
  1652. <a name="l01617"></a>01617 <span class="keywordflow">break</span>;
  1653. <a name="l01618"></a>01618 }
  1654. <a name="l01619"></a>01619 }
  1655. <a name="l01620"></a>01620 }
  1656. <a name="l01621"></a>01621 }
  1657. <a name="l01622"></a>01622
  1658. <a name="l01623"></a><a class="code" href="classPubSubMMOG.html#a104570a1f3f3f4951bf67e9b8e09b0e8">01623</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a104570a1f3f3f4951bf67e9b8e09b0e8">PubSubMMOG::unsubscribeChild</a>( <span class="keyword">const</span> <a class="code" href="classNodeHandle.html" title="This class implements a node handle.">NodeHandle</a>&amp; node, <a class="code" href="classPubSubSubspaceResponsible.html">PubSubSubspaceResponsible</a>&amp; subspace )
  1659. <a name="l01624"></a>01624 {
  1660. <a name="l01625"></a>01625 <a class="code" href="classPubSubBackupUnsubscribeMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupUnsubscribeMessage</a>* backupMsg = <span class="keyword">new</span> <a class="code" href="classPubSubBackupUnsubscribeMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubBackupUnsubscribeMessage</a>(<span class="stringliteral">&quot;Backup: node left subspace&quot;</span>);
  1661. <a name="l01626"></a>01626 backupMsg-&gt;<a class="code" href="classPubSubBackupUnsubscribeMessage.html#af0f90e64fa9b7e0a1826020ffb261136">setChild</a>( node );
  1662. <a name="l01627"></a>01627 backupMsg-&gt;<a class="code" href="classPubSubBackupUnsubscribeMessage.html#a1083ae2bea42efe011631f803428d694">setSubspaceId</a>( subspace.<a class="code" href="classPubSubSubspace.html#a68c0be6c59e362d291533d74a65aa187">getId</a>().<a class="code" href="classPubSubSubspaceId.html#afb4d71a54d5337d65bb89c27e4d4938c">getId</a>() );
  1663. <a name="l01628"></a>01628 <a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html">PubSubSubspaceResponsible::IntermediateNode</a>* iNode = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a5380c2d29951d510f7dfc7808ebedf3b">removeAnyChild</a>( node );
  1664. <a name="l01629"></a>01629 <span class="keywordflow">if</span>( iNode &amp;&amp; !iNode-&gt;<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a597257efca218f9499aa4e113d99e139">node</a>.<a class="code" href="classNodeHandle.html#ab5136375a4548ced7c2014a73c8743c9" title="indicates if this NodeHandle is specified">isUnspecified</a>() ) {
  1665. <a name="l01630"></a>01630 <span class="comment">// Node is handled by an intermediate node, inform him</span>
  1666. <a name="l01631"></a>01631 <a class="code" href="classPubSubNodeLeftMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubNodeLeftMessage</a>* goneMsg = <span class="keyword">new</span> <a class="code" href="classPubSubNodeLeftMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubNodeLeftMessage</a>(<span class="stringliteral">&quot;Node left Subspace&quot;</span>);
  1667. <a name="l01632"></a>01632 goneMsg-&gt;<a class="code" href="classPubSubNodeLeftMessage.html#a0e52c6bd254d41b146393d4b825f5cb8">setNode</a>( node );
  1668. <a name="l01633"></a>01633 goneMsg-&gt;<a class="code" href="classPubSubNodeLeftMessage.html#ac7572204eed418bb6befc42859d682bc">setSubspaceId</a>( subspace.<a class="code" href="classPubSubSubspace.html#a68c0be6c59e362d291533d74a65aa187">getId</a>().<a class="code" href="classPubSubSubspaceId.html#afb4d71a54d5337d65bb89c27e4d4938c">getId</a>() );
  1669. <a name="l01634"></a>01634 goneMsg-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#ac2a4c9a20c40c17b2a948f346d5ae4fc">PUBSUB_NODELEFT_L</a>( goneMsg ));
  1670. <a name="l01635"></a>01635 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1671. <a name="l01636"></a>01636 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1672. <a name="l01637"></a>01637 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= goneMsg-&gt;getByteLength()
  1673. <a name="l01638"></a>01638 );
  1674. <a name="l01639"></a>01639 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( iNode-&gt;<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a597257efca218f9499aa4e113d99e139">node</a>, goneMsg );
  1675. <a name="l01640"></a>01640 }
  1676. <a name="l01641"></a>01641 <span class="keywordflow">if</span> ( subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a41dc142fbdac4eebcadd7b62ee0a822e">getTotalChildrenCount</a>() &lt; ( <a class="code" href="classPubSubMMOG.html#a7d310afbff3e729b6a33f8e6614de07e">maxChildren</a> - 1) * subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0037dfdbb81b9918713cba46ad994cb9">getNumIntermediates</a>()){<span class="comment">// FIXME: parameter when to start cleanup?</span>
  1677. <a name="l01642"></a>01642 <span class="comment">// Too many &quot;free&quot; slots, remove one intermediate node</span>
  1678. <a name="l01643"></a>01643 <a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html">PubSubSubspaceResponsible::IntermediateNode</a>&amp; liNode = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.back();
  1679. <a name="l01644"></a>01644 <span class="keywordflow">if</span>( !liNode.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a597257efca218f9499aa4e113d99e139">node</a>.<a class="code" href="classNodeHandle.html#ab5136375a4548ced7c2014a73c8743c9" title="indicates if this NodeHandle is specified">isUnspecified</a>() ){
  1680. <a name="l01645"></a>01645 <span class="comment">// Inform node + lobby about release from intermediate node status</span>
  1681. <a name="l01646"></a>01646 <a class="code" href="classPubSubReleaseIntermediateMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubReleaseIntermediateMessage</a>* releaseMsg = <span class="keyword">new</span> <a class="code" href="classPubSubReleaseIntermediateMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubReleaseIntermediateMessage</a>(<span class="stringliteral">&quot;I don&#39;t need you anymore as intermediate&quot;</span>);
  1682. <a name="l01647"></a>01647 releaseMsg-&gt;<a class="code" href="classPubSubReleaseIntermediateMessage.html#adc6c4cfc5ea1ab1cd1f12bba42ba569d">setSubspaceId</a>( subspace.<a class="code" href="classPubSubSubspace.html#a68c0be6c59e362d291533d74a65aa187">getId</a>().<a class="code" href="classPubSubSubspaceId.html#afb4d71a54d5337d65bb89c27e4d4938c">getId</a>() );
  1683. <a name="l01648"></a>01648 releaseMsg-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a7a3eb4a2755d7c92be0f817a2a90340a">PUBSUB_RELEASEINTERMEDIATE_L</a>( releaseMsg ));
  1684. <a name="l01649"></a>01649 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1685. <a name="l01650"></a>01650 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1686. <a name="l01651"></a>01651 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= releaseMsg-&gt;getByteLength()
  1687. <a name="l01652"></a>01652 );
  1688. <a name="l01653"></a>01653 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( liNode.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a597257efca218f9499aa4e113d99e139">node</a>, releaseMsg );
  1689. <a name="l01654"></a>01654
  1690. <a name="l01655"></a>01655 <a class="code" href="classPubSubHelpReleaseMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubHelpReleaseMessage</a>* helpRMsg = <span class="keyword">new</span> <a class="code" href="classPubSubHelpReleaseMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubHelpReleaseMessage</a>(<span class="stringliteral">&quot;node is not my intermediate anymore&quot;</span>);
  1691. <a name="l01656"></a>01656 helpRMsg-&gt;<a class="code" href="classPubSubHelpReleaseMessage.html#a5effa76957e673df36cb81367fe2d95e">setSubspaceId</a>( subspace.<a class="code" href="classPubSubSubspace.html#a68c0be6c59e362d291533d74a65aa187">getId</a>().<a class="code" href="classPubSubSubspaceId.html#afb4d71a54d5337d65bb89c27e4d4938c">getId</a>() );
  1692. <a name="l01657"></a>01657 helpRMsg-&gt;<a class="code" href="classPubSubHelpReleaseMessage.html#a6aadd8d27e6797da7cfb166ecfb0621f">setNode</a>( liNode.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a597257efca218f9499aa4e113d99e139">node</a> );
  1693. <a name="l01658"></a>01658 helpRMsg-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#add2bbabb5819a74b1655d4f4ebdc5275">PUBSUB_HELPRELEASE_L</a>( helpRMsg ));
  1694. <a name="l01659"></a>01659 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1695. <a name="l01660"></a>01660 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1696. <a name="l01661"></a>01661 pubSubSignalingMessagesSize+= helpRMsg-&gt;getByteLength()
  1697. <a name="l01662"></a>01662 );
  1698. <a name="l01663"></a>01663 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( <a class="code" href="classPubSubMMOG.html#a1e1ba5fd3c791f3aa2172e6b055f68bb">lobbyServer</a>, helpRMsg );
  1699. <a name="l01664"></a>01664
  1700. <a name="l01665"></a>01665 <span class="comment">// inform parent of intermediate node</span>
  1701. <a name="l01666"></a>01666 <span class="keywordtype">int</span> parentPos = (subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.size()-1)/<a class="code" href="classPubSubMMOG.html#a7d310afbff3e729b6a33f8e6614de07e">maxChildren</a> -1;
  1702. <a name="l01667"></a>01667 <span class="keywordflow">if</span>( parentPos &gt;= 0 ){
  1703. <a name="l01668"></a>01668 <a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html">PubSubSubspaceResponsible::IntermediateNode</a>&amp; parent = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>[parentPos];
  1704. <a name="l01669"></a>01669 <span class="keywordflow">if</span>( !parent.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a597257efca218f9499aa4e113d99e139">node</a>.<a class="code" href="classNodeHandle.html#ab5136375a4548ced7c2014a73c8743c9" title="indicates if this NodeHandle is specified">isUnspecified</a>() ){
  1705. <a name="l01670"></a>01670 <a class="code" href="classPubSubNodeLeftMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubNodeLeftMessage</a>* goneMsg = <span class="keyword">new</span> <a class="code" href="classPubSubNodeLeftMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubNodeLeftMessage</a>(<span class="stringliteral">&quot;Intermediate left Subspace&quot;</span>);
  1706. <a name="l01671"></a>01671 goneMsg-&gt;<a class="code" href="classPubSubNodeLeftMessage.html#a0e52c6bd254d41b146393d4b825f5cb8">setNode</a>( liNode.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a597257efca218f9499aa4e113d99e139">node</a> );
  1707. <a name="l01672"></a>01672 goneMsg-&gt;<a class="code" href="classPubSubNodeLeftMessage.html#ac7572204eed418bb6befc42859d682bc">setSubspaceId</a>( subspace.<a class="code" href="classPubSubSubspace.html#a68c0be6c59e362d291533d74a65aa187">getId</a>().<a class="code" href="classPubSubSubspaceId.html#afb4d71a54d5337d65bb89c27e4d4938c">getId</a>() );
  1708. <a name="l01673"></a>01673 goneMsg-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#ac2a4c9a20c40c17b2a948f346d5ae4fc">PUBSUB_NODELEFT_L</a>( goneMsg ));
  1709. <a name="l01674"></a>01674 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1710. <a name="l01675"></a>01675 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1711. <a name="l01676"></a>01676 pubSubSignalingMessagesSize+= goneMsg-&gt;getByteLength()
  1712. <a name="l01677"></a>01677 );
  1713. <a name="l01678"></a>01678 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( parent.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a597257efca218f9499aa4e113d99e139">node</a>, goneMsg );
  1714. <a name="l01679"></a>01679 }
  1715. <a name="l01680"></a>01680 }
  1716. <a name="l01681"></a>01681 }
  1717. <a name="l01682"></a>01682
  1718. <a name="l01683"></a>01683 <span class="keywordtype">bool</span> fixNeeded = <span class="keyword">false</span>;
  1719. <a name="l01684"></a>01684 set&lt;NodeHandle&gt;::iterator childIt;
  1720. <a name="l01685"></a>01685 <span class="keywordflow">for</span>( childIt = liNode.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a2ddae3a07ad454ef312681659588b92a">children</a>.begin(); childIt != liNode.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a2ddae3a07ad454ef312681659588b92a">children</a>.end(); ++childIt ){
  1721. <a name="l01686"></a>01686 <span class="comment">// remove children of last intermediate</span>
  1722. <a name="l01687"></a>01687 <span class="keywordflow">if</span>( subspace.<a class="code" href="classPubSubSubspaceIntermediate.html#a17ae7d975c0ae11c5b8e25c970e2fdb4">getNumChildren</a>() + subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0037dfdbb81b9918713cba46ad994cb9">getNumIntermediates</a>() &lt; <a class="code" href="classPubSubMMOG.html#a7d310afbff3e729b6a33f8e6614de07e">maxChildren</a> ){
  1723. <a name="l01688"></a>01688 <span class="comment">// we have room for the child</span>
  1724. <a name="l01689"></a>01689 <span class="keywordflow">if</span>( !subspace.<a class="code" href="classPubSubSubspaceIntermediate.html#aef3a0468a7eb4cbd84f774e2de574b16">children</a>.insert( *childIt ).second ) fixNeeded = <span class="keyword">true</span>;
  1725. <a name="l01690"></a>01690
  1726. <a name="l01691"></a>01691 <span class="comment">//FIXME: send backup new-&gt;toMe</span>
  1727. <a name="l01692"></a>01692 } <span class="keywordflow">else</span> {
  1728. <a name="l01693"></a>01693 <span class="comment">// Node has to go to some intermediate</span>
  1729. <a name="l01694"></a>01694 <span class="comment">// find intermediate with free capacities</span>
  1730. <a name="l01695"></a>01695 <a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html">PubSubSubspaceResponsible::IntermediateNode</a>* newINode;
  1731. <a name="l01696"></a>01696 newINode = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a2a6d3bc5ff302065df572a07f604a3de">getNextFreeIntermediate</a>();
  1732. <a name="l01697"></a>01697
  1733. <a name="l01698"></a>01698 <span class="keywordflow">if</span>( newINode &amp;&amp; newINode-&gt;<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a597257efca218f9499aa4e113d99e139">node</a> != liNode.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a597257efca218f9499aa4e113d99e139">node</a> ){
  1734. <a name="l01699"></a>01699 <span class="comment">// cache it</span>
  1735. <a name="l01700"></a>01700 <span class="keywordflow">if</span>( !subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0dad92f50458f0daf1f719c842661a7b">cachedChildren</a>.insert( make_pair(*childIt, <span class="keyword">true</span>) ).second ) fixNeeded = <span class="keyword">true</span>;
  1736. <a name="l01701"></a>01701 <span class="comment">//FIXME: send backup new-&gt;toCache</span>
  1737. <a name="l01702"></a>01702
  1738. <a name="l01703"></a>01703 ++(newINode-&gt;<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#adc4e60645148ad5003649a9dd77587a6">waitingChildren</a>);
  1739. <a name="l01704"></a>01704
  1740. <a name="l01705"></a>01705 <span class="comment">// let him adopt the child</span>
  1741. <a name="l01706"></a>01706 <a class="code" href="classPubSubAdoptChildCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubAdoptChildCall</a>* adoptCall = <span class="keyword">new</span> <a class="code" href="classPubSubAdoptChildCall.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubAdoptChildCall</a>(<span class="stringliteral">&quot;Adopt Node&quot;</span>);
  1742. <a name="l01707"></a>01707 adoptCall-&gt;<a class="code" href="classPubSubAdoptChildCall.html#a2c7d51a5d0c8ef5b2f7a07d9a4559aa1">setSubspaceId</a>( subspace.<a class="code" href="classPubSubSubspace.html#a68c0be6c59e362d291533d74a65aa187">getId</a>().<a class="code" href="classPubSubSubspaceId.html#afb4d71a54d5337d65bb89c27e4d4938c">getId</a>() );
  1743. <a name="l01708"></a>01708 adoptCall-&gt;<a class="code" href="classPubSubAdoptChildCall.html#a117550b7b25e69c5b16b35a6a7d6d019">setChild</a>( *childIt );
  1744. <a name="l01709"></a>01709 adoptCall-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a40172b8994bee9881c879d1f69994013">PUBSUB_ADOPTCHILDCALL_L</a>( adoptCall ));
  1745. <a name="l01710"></a>01710 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1746. <a name="l01711"></a>01711 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1747. <a name="l01712"></a>01712 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= adoptCall-&gt;getByteLength()
  1748. <a name="l01713"></a>01713 );
  1749. <a name="l01714"></a>01714 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( newINode-&gt;<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a597257efca218f9499aa4e113d99e139">node</a>, adoptCall );
  1750. <a name="l01715"></a>01715 } <span class="keywordflow">else</span> {
  1751. <a name="l01716"></a>01716 <span class="comment">// no intermediate found</span>
  1752. <a name="l01717"></a>01717 <span class="comment">// just move child to cache and wait for a new one</span>
  1753. <a name="l01718"></a>01718 <span class="keywordflow">if</span>( !subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0dad92f50458f0daf1f719c842661a7b">cachedChildren</a>.insert( make_pair(*childIt, <span class="keyword">false</span>) ).second ) fixNeeded = <span class="keyword">true</span>;
  1754. <a name="l01719"></a>01719 }
  1755. <a name="l01720"></a>01720 }
  1756. <a name="l01721"></a>01721 }
  1757. <a name="l01722"></a>01722 <span class="comment">// delete node from subspace&#39;s intermediate node list</span>
  1758. <a name="l01723"></a>01723 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.pop_back();
  1759. <a name="l01724"></a>01724 <span class="comment">// inform backup about deleted intermediate</span>
  1760. <a name="l01725"></a>01725 backupMsg-&gt;<a class="code" href="classPubSubBackupUnsubscribeMessage.html#a93305260d050119fc759f9e657d4420c">setIntermediate</a>( liNode.<a class="code" href="classPubSubSubspaceResponsible_1_1IntermediateNode.html#a597257efca218f9499aa4e113d99e139">node</a> );
  1761. <a name="l01726"></a>01726
  1762. <a name="l01727"></a>01727 <span class="keywordflow">if</span>( fixNeeded ) subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ab2792e92420b16f1e971e9ff83ebce70">fixTotalChildrenCount</a>();
  1763. <a name="l01728"></a>01728 }
  1764. <a name="l01729"></a>01729
  1765. <a name="l01730"></a>01730 <span class="comment">// FIXME: just for testing</span>
  1766. <a name="l01731"></a>01731 <span class="keywordtype">int</span> iii = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a41dc142fbdac4eebcadd7b62ee0a822e">getTotalChildrenCount</a>();
  1767. <a name="l01732"></a>01732 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ab2792e92420b16f1e971e9ff83ebce70">fixTotalChildrenCount</a>();
  1768. <a name="l01733"></a>01733 <span class="keywordflow">if</span>( iii != subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a41dc142fbdac4eebcadd7b62ee0a822e">getTotalChildrenCount</a>() ){
  1769. <a name="l01734"></a>01734 opp_error(<span class="stringliteral">&quot;Huh?&quot;</span>);
  1770. <a name="l01735"></a>01735 }
  1771. <a name="l01736"></a>01736
  1772. <a name="l01737"></a>01737 <span class="keywordflow">if</span>( !subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0c585a0f9e8162d0bd55a9698b5bff34">getBackupNode</a>().<a class="code" href="classNodeHandle.html#ab5136375a4548ced7c2014a73c8743c9" title="indicates if this NodeHandle is specified">isUnspecified</a>() ){
  1773. <a name="l01738"></a>01738 backupMsg-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a7e3bc76c2154625bc34828f44408df2e">PUBSUB_BACKUPUNSUBSCRIBE_L</a>( backupMsg ));
  1774. <a name="l01739"></a>01739 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1775. <a name="l01740"></a>01740 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1776. <a name="l01741"></a>01741 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= backupMsg-&gt;getByteLength()
  1777. <a name="l01742"></a>01742 );
  1778. <a name="l01743"></a>01743 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0c585a0f9e8162d0bd55a9698b5bff34">getBackupNode</a>(), backupMsg );
  1779. <a name="l01744"></a>01744 } <span class="keywordflow">else</span> {
  1780. <a name="l01745"></a>01745 <span class="keyword">delete</span> backupMsg;
  1781. <a name="l01746"></a>01746 }
  1782. <a name="l01747"></a>01747 }
  1783. <a name="l01748"></a>01748
  1784. <a name="l01749"></a><a class="code" href="classPubSubMMOG.html#aedde86c47759c2ab5b61744c7065377c">01749</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#aedde86c47759c2ab5b61744c7065377c">PubSubMMOG::sendMessageToChildren</a>( <a class="code" href="classPubSubSubspaceResponsible.html">PubSubSubspaceResponsible</a>&amp; subspace,
  1785. <a name="l01750"></a>01750 <a class="code" href="classBaseOverlayMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">BaseOverlayMessage</a>* toIntermediates,
  1786. <a name="l01751"></a>01751 <a class="code" href="classBaseOverlayMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">BaseOverlayMessage</a>* toBackup,
  1787. <a name="l01752"></a>01752 <a class="code" href="classBaseOverlayMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">BaseOverlayMessage</a>* toPlayers )
  1788. <a name="l01753"></a>01753 {
  1789. <a name="l01754"></a>01754 <a class="code" href="classBaseCallMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">BaseCallMessage</a>* intermediateCall = <span class="keyword">dynamic_cast&lt;</span><a class="code" href="classBaseCallMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">BaseCallMessage</a>*<span class="keyword">&gt;</span>(toIntermediates);
  1790. <a name="l01755"></a>01755 <a class="code" href="classBaseCallMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">BaseCallMessage</a>* backupCall = <span class="keyword">dynamic_cast&lt;</span><a class="code" href="classBaseCallMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">BaseCallMessage</a>*<span class="keyword">&gt;</span>(toBackup);
  1791. <a name="l01756"></a>01756 <a class="code" href="classBaseCallMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">BaseCallMessage</a>* playerCall = <span class="keyword">dynamic_cast&lt;</span><a class="code" href="classBaseCallMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">BaseCallMessage</a>*<span class="keyword">&gt;</span>(toPlayers);
  1792. <a name="l01757"></a>01757
  1793. <a name="l01758"></a>01758 std::set&lt;NodeHandle&gt;::iterator childIt;
  1794. <a name="l01759"></a>01759
  1795. <a name="l01760"></a>01760 <span class="keywordflow">if</span>( toPlayers ) {
  1796. <a name="l01761"></a>01761 <span class="comment">// Inform all children ...</span>
  1797. <a name="l01762"></a>01762 <span class="keywordflow">for</span>( childIt = subspace.<a class="code" href="classPubSubSubspaceIntermediate.html#aef3a0468a7eb4cbd84f774e2de574b16">children</a>.begin(); childIt != subspace.<a class="code" href="classPubSubSubspaceIntermediate.html#aef3a0468a7eb4cbd84f774e2de574b16">children</a>.end(); ++childIt ) {
  1798. <a name="l01763"></a>01763 <span class="keywordflow">if</span>( playerCall ){
  1799. <a name="l01764"></a>01764 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1800. <a name="l01765"></a>01765 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1801. <a name="l01766"></a>01766 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= playerCall-&gt;getByteLength()
  1802. <a name="l01767"></a>01767 );
  1803. <a name="l01768"></a>01768 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( *childIt, static_cast&lt;BaseCallMessage*&gt;(playerCall-&gt;<a class="code" href="classBaseCallMessage.html#a2e1b28efce2f3b0b45c6b101b9515704">dup</a>()) );
  1804. <a name="l01769"></a>01769 } <span class="keywordflow">else</span> {
  1805. <a name="l01770"></a>01770 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1806. <a name="l01771"></a>01771 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1807. <a name="l01772"></a>01772 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= toPlayers-&gt;getByteLength()
  1808. <a name="l01773"></a>01773 );
  1809. <a name="l01774"></a>01774 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( *childIt, static_cast&lt;BaseOverlayMessage*&gt;(toPlayers-&gt;<a class="code" href="classBaseOverlayMessage.html#ade9ac38d77f492e194e6f1129590f409">dup</a>()) );
  1810. <a name="l01775"></a>01775 }
  1811. <a name="l01776"></a>01776 }
  1812. <a name="l01777"></a>01777 <span class="comment">// ... and all cached children ...</span>
  1813. <a name="l01778"></a>01778 std::map&lt;NodeHandle, bool&gt;::iterator cacheChildIt;
  1814. <a name="l01779"></a>01779 <span class="keywordflow">for</span>( cacheChildIt = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0dad92f50458f0daf1f719c842661a7b">cachedChildren</a>.begin(); cacheChildIt != subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0dad92f50458f0daf1f719c842661a7b">cachedChildren</a>.end(); ++cacheChildIt ) {
  1815. <a name="l01780"></a>01780 <span class="keywordflow">if</span>( playerCall ){
  1816. <a name="l01781"></a>01781 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1817. <a name="l01782"></a>01782 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1818. <a name="l01783"></a>01783 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= playerCall-&gt;getByteLength()
  1819. <a name="l01784"></a>01784 );
  1820. <a name="l01785"></a>01785 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( cacheChildIt-&gt;first, static_cast&lt;BaseCallMessage*&gt;(playerCall-&gt;<a class="code" href="classBaseCallMessage.html#a2e1b28efce2f3b0b45c6b101b9515704">dup</a>()) );
  1821. <a name="l01786"></a>01786 } <span class="keywordflow">else</span> {
  1822. <a name="l01787"></a>01787 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1823. <a name="l01788"></a>01788 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1824. <a name="l01789"></a>01789 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= toPlayers-&gt;getByteLength()
  1825. <a name="l01790"></a>01790 );
  1826. <a name="l01791"></a>01791 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( cacheChildIt-&gt;first, static_cast&lt;BaseOverlayMessage*&gt;(toPlayers-&gt;<a class="code" href="classBaseOverlayMessage.html#ade9ac38d77f492e194e6f1129590f409">dup</a>()) );
  1827. <a name="l01792"></a>01792 }
  1828. <a name="l01793"></a>01793 }
  1829. <a name="l01794"></a>01794 }
  1830. <a name="l01795"></a>01795 deque&lt;PubSubSubspaceResponsible::IntermediateNode&gt;::iterator iit;
  1831. <a name="l01796"></a>01796 <span class="comment">// ... all intermediate nodes ...</span>
  1832. <a name="l01797"></a>01797 <span class="keywordflow">for</span>( iit = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.begin(); iit != subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.end(); ++iit ){
  1833. <a name="l01798"></a>01798 <span class="keywordflow">if</span>( toIntermediates &amp;&amp; !iit-&gt;node.isUnspecified() ){
  1834. <a name="l01799"></a>01799 <span class="keywordflow">if</span>( intermediateCall ){
  1835. <a name="l01800"></a>01800 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1836. <a name="l01801"></a>01801 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1837. <a name="l01802"></a>01802 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= intermediateCall-&gt;getByteLength()
  1838. <a name="l01803"></a>01803 );
  1839. <a name="l01804"></a>01804 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( iit-&gt;node, static_cast&lt;BaseCallMessage*&gt;(intermediateCall-&gt;<a class="code" href="classBaseCallMessage.html#a2e1b28efce2f3b0b45c6b101b9515704">dup</a>()) );
  1840. <a name="l01805"></a>01805 } <span class="keywordflow">else</span> {
  1841. <a name="l01806"></a>01806 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1842. <a name="l01807"></a>01807 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1843. <a name="l01808"></a>01808 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= toIntermediates-&gt;getByteLength()
  1844. <a name="l01809"></a>01809 );
  1845. <a name="l01810"></a>01810 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( iit-&gt;node, static_cast&lt;BaseOverlayMessage*&gt;(toIntermediates-&gt;<a class="code" href="classBaseOverlayMessage.html#ade9ac38d77f492e194e6f1129590f409">dup</a>()) );
  1846. <a name="l01811"></a>01811 }
  1847. <a name="l01812"></a>01812 }
  1848. <a name="l01813"></a>01813 <span class="keywordflow">if</span>( toPlayers ) {
  1849. <a name="l01814"></a>01814 <span class="comment">// .. and all intermediate node&#39;s children ...</span>
  1850. <a name="l01815"></a>01815 <span class="keywordflow">for</span>( childIt = iit-&gt;children.begin(); childIt != iit-&gt;children.end(); ++childIt ){
  1851. <a name="l01816"></a>01816 <span class="keywordflow">if</span>( playerCall ){
  1852. <a name="l01817"></a>01817 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1853. <a name="l01818"></a>01818 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1854. <a name="l01819"></a>01819 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= playerCall-&gt;getByteLength()
  1855. <a name="l01820"></a>01820 );
  1856. <a name="l01821"></a>01821 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( *childIt, static_cast&lt;BaseCallMessage*&gt;(playerCall-&gt;<a class="code" href="classBaseCallMessage.html#a2e1b28efce2f3b0b45c6b101b9515704">dup</a>()) );
  1857. <a name="l01822"></a>01822 } <span class="keywordflow">else</span> {
  1858. <a name="l01823"></a>01823 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1859. <a name="l01824"></a>01824 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1860. <a name="l01825"></a>01825 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= toPlayers-&gt;getByteLength()
  1861. <a name="l01826"></a>01826 );
  1862. <a name="l01827"></a>01827 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( *childIt, static_cast&lt;BaseOverlayMessage*&gt;(toPlayers-&gt;<a class="code" href="classBaseOverlayMessage.html#ade9ac38d77f492e194e6f1129590f409">dup</a>()) );
  1863. <a name="l01828"></a>01828 }
  1864. <a name="l01829"></a>01829 }
  1865. <a name="l01830"></a>01830 }
  1866. <a name="l01831"></a>01831 }
  1867. <a name="l01832"></a>01832 <span class="comment">// ... and the backup node</span>
  1868. <a name="l01833"></a>01833 <span class="keywordflow">if</span>( toBackup &amp;&amp; !subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0c585a0f9e8162d0bd55a9698b5bff34">getBackupNode</a>().<a class="code" href="classNodeHandle.html#ab5136375a4548ced7c2014a73c8743c9" title="indicates if this NodeHandle is specified">isUnspecified</a>() ) {
  1869. <a name="l01834"></a>01834 <span class="keywordflow">if</span>( backupCall ){
  1870. <a name="l01835"></a>01835 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1871. <a name="l01836"></a>01836 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1872. <a name="l01837"></a>01837 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= backupCall-&gt;getByteLength()
  1873. <a name="l01838"></a>01838 );
  1874. <a name="l01839"></a>01839 <a class="code" href="classBaseRpc.html#ac128e0ff0d09f81b652f7d3e00ce9441" title="Sends a Remote-Procedure-Call message to the underlay ">sendUdpRpcCall</a>( subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0c585a0f9e8162d0bd55a9698b5bff34">getBackupNode</a>(), <span class="keyword">static_cast&lt;</span><a class="code" href="classBaseCallMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">BaseCallMessage</a>*<span class="keyword">&gt;</span>(backupCall-&gt;<a class="code" href="classBaseCallMessage.html#a2e1b28efce2f3b0b45c6b101b9515704">dup</a>()) );
  1875. <a name="l01840"></a>01840 } <span class="keywordflow">else</span> {
  1876. <a name="l01841"></a>01841 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1877. <a name="l01842"></a>01842 ++<a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a>;
  1878. <a name="l01843"></a>01843 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a>+= toBackup-&gt;getByteLength()
  1879. <a name="l01844"></a>01844 );
  1880. <a name="l01845"></a>01845 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0c585a0f9e8162d0bd55a9698b5bff34">getBackupNode</a>(), <span class="keyword">static_cast&lt;</span><a class="code" href="classBaseOverlayMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">BaseOverlayMessage</a>*<span class="keyword">&gt;</span>(toBackup-&gt;<a class="code" href="classBaseOverlayMessage.html#ade9ac38d77f492e194e6f1129590f409">dup</a>()) );
  1881. <a name="l01846"></a>01846 }
  1882. <a name="l01847"></a>01847 }
  1883. <a name="l01848"></a>01848 }
  1884. <a name="l01849"></a>01849
  1885. <a name="l01850"></a>01850
  1886. <a name="l01851"></a><a class="code" href="classPubSubMMOG.html#a3c4d846c243253afb0f72592e44590ff">01851</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a3c4d846c243253afb0f72592e44590ff">PubSubMMOG::publishEvents</a>()
  1887. <a name="l01852"></a>01852 {
  1888. <a name="l01853"></a>01853 <span class="comment">// FOr all (responsible) subspaces</span>
  1889. <a name="l01854"></a>01854 <span class="keywordtype">int</span> numRespSubspaces = <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.size();
  1890. <a name="l01855"></a>01855 std::map&lt;PubSubSubspaceId, PubSubSubspaceResponsible&gt;::iterator it;
  1891. <a name="l01856"></a>01856 <span class="keywordflow">for</span>( it = <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.begin(); it != <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.end(); ++it ){
  1892. <a name="l01857"></a>01857 <a class="code" href="classPubSubSubspaceResponsible.html">PubSubSubspaceResponsible</a>&amp; subspace = it-&gt;second;
  1893. <a name="l01858"></a>01858
  1894. <a name="l01859"></a>01859 <span class="comment">// Prepare a movement list message aggregating all stored move messages</span>
  1895. <a name="l01860"></a>01860 <a class="code" href="classPubSubMoveListMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubMoveListMessage</a>* moveList = <span class="keyword">new</span> <a class="code" href="classPubSubMoveListMessage.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubMoveListMessage</a>(<span class="stringliteral">&quot;Movement list&quot;</span>);
  1896. <a name="l01861"></a>01861 moveList-&gt;<a class="code" href="classPubSubMoveListMessage.html#af98f7efd6b1f747ed72c9e369d46401b">setTimestamp</a>( simTime() );
  1897. <a name="l01862"></a>01862 moveList-&gt;<a class="code" href="classPubSubMoveListMessage.html#a54ee6ddb0320ba5d4232ce9d69a8bd27">setSubspaceId</a>( subspace.<a class="code" href="classPubSubSubspace.html#a68c0be6c59e362d291533d74a65aa187">getId</a>().<a class="code" href="classPubSubSubspaceId.html#afb4d71a54d5337d65bb89c27e4d4938c">getId</a>() );
  1898. <a name="l01863"></a>01863 moveList-&gt;<a class="code" href="classPubSubMoveListMessage.html#a7cfc3016cda8ffe6a48efb921b17d454">setPlayerArraySize</a>( subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a3f199ce5648d14d4faf8672db1b9e8c7">waitingMoveMessages</a>.size() );
  1899. <a name="l01864"></a>01864 moveList-&gt;<a class="code" href="classPubSubMoveListMessage.html#ac471ea4143307ab400a66a5d570a3579">setPositionArraySize</a>( subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a3f199ce5648d14d4faf8672db1b9e8c7">waitingMoveMessages</a>.size() );
  1900. <a name="l01865"></a>01865 moveList-&gt;<a class="code" href="classPubSubMoveListMessage.html#a5d28566e440f12fcc2adc5c13063def8">setPositionAgeArraySize</a>( subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a3f199ce5648d14d4faf8672db1b9e8c7">waitingMoveMessages</a>.size() );
  1901. <a name="l01866"></a>01866
  1902. <a name="l01867"></a>01867 std::deque&lt;PubSubMoveMessage*&gt;::iterator msgIt;
  1903. <a name="l01868"></a>01868 <span class="keywordtype">int</span> pos = 0;
  1904. <a name="l01869"></a>01869 <span class="keywordflow">for</span>( msgIt = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a3f199ce5648d14d4faf8672db1b9e8c7">waitingMoveMessages</a>.begin(); msgIt != subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a3f199ce5648d14d4faf8672db1b9e8c7">waitingMoveMessages</a>.end(); ++msgIt ){
  1905. <a name="l01870"></a>01870 moveList-&gt;<a class="code" href="classPubSubMoveListMessage.html#af7b6375b51fc979b9dc4f2fd3df1a327">setPlayer</a>( pos, (*msgIt)-&gt;getPlayer() );
  1906. <a name="l01871"></a>01871 moveList-&gt;<a class="code" href="classPubSubMoveListMessage.html#af1ce3b62f7ddc31c530741c665cbe4c3">setPosition</a>( pos, (*msgIt)-&gt;getPosition() );
  1907. <a name="l01872"></a>01872 moveList-&gt;<a class="code" href="classPubSubMoveListMessage.html#a487720e23323a1f2c19b203a5a4a9a6e">setPositionAge</a>( pos, simTime() - (*msgIt)-&gt;getCreationTime() );
  1908. <a name="l01873"></a>01873 pos++;
  1909. <a name="l01874"></a>01874 cancelAndDelete( *msgIt );
  1910. <a name="l01875"></a>01875 }
  1911. <a name="l01876"></a>01876 subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a3f199ce5648d14d4faf8672db1b9e8c7">waitingMoveMessages</a>.clear();
  1912. <a name="l01877"></a>01877
  1913. <a name="l01878"></a>01878 moveList-&gt;setBitLength( <a class="code" href="PubSubMessage__m_8h.html#a874c79322e2687e6c465d6c75129b8df">PUBSUB_MOVELIST_L</a>( moveList ));
  1914. <a name="l01879"></a>01879 <span class="comment">// Send message to all direct children...</span>
  1915. <a name="l01880"></a>01880 <span class="keywordflow">for</span>( set&lt;NodeHandle&gt;::iterator childIt = subspace.<a class="code" href="classPubSubSubspaceIntermediate.html#aef3a0468a7eb4cbd84f774e2de574b16">children</a>.begin();
  1916. <a name="l01881"></a>01881 childIt != subspace.<a class="code" href="classPubSubSubspaceIntermediate.html#aef3a0468a7eb4cbd84f774e2de574b16">children</a>.end(); ++childIt )
  1917. <a name="l01882"></a>01882 {
  1918. <a name="l01883"></a>01883 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1919. <a name="l01884"></a>01884 ++<a class="code" href="classPubSubMMOG.html#ae81f55efe5b21342597e408ff3474eee">numMoveListMessages</a>;
  1920. <a name="l01885"></a>01885 <a class="code" href="classPubSubMMOG.html#a5a665dd74681081d669ea57efd5d83b0">moveListMessagesSize</a>+= moveList-&gt;getByteLength();
  1921. <a name="l01886"></a>01886 <a class="code" href="classPubSubMMOG.html#a4561eb4e380c7aea874ea622b9145603">respMoveListMessagesSize</a>+= (int)((<span class="keywordtype">double</span>) moveList-&gt;getByteLength() / numRespSubspaces)
  1922. <a name="l01887"></a>01887 );
  1923. <a name="l01888"></a>01888 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( *childIt, (<a class="code" href="classBaseOverlayMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">BaseOverlayMessage</a>*) moveList-&gt;<a class="code" href="classPubSubMoveListMessage.html#a5d61d0f12b29063f944e6fd5775d3da7">dup</a>() );
  1924. <a name="l01889"></a>01889 }
  1925. <a name="l01890"></a>01890
  1926. <a name="l01891"></a>01891 <span class="comment">//... all cached children (if messages are not too big) ...</span>
  1927. <a name="l01892"></a>01892 <span class="keywordflow">if</span>( moveList-&gt;getByteLength() &lt; 1024 ){ <span class="comment">// FIXME: magic number. make it a parameter, or dependant on the available bandwidth</span>
  1928. <a name="l01893"></a>01893 <span class="keywordflow">for</span>( map&lt;NodeHandle, bool&gt;::iterator childIt = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0dad92f50458f0daf1f719c842661a7b">cachedChildren</a>.begin();
  1929. <a name="l01894"></a>01894 childIt != subspace.<a class="code" href="classPubSubSubspaceResponsible.html#a0dad92f50458f0daf1f719c842661a7b">cachedChildren</a>.end(); ++childIt )
  1930. <a name="l01895"></a>01895 {
  1931. <a name="l01896"></a>01896 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1932. <a name="l01897"></a>01897 ++<a class="code" href="classPubSubMMOG.html#ae81f55efe5b21342597e408ff3474eee">numMoveListMessages</a>;
  1933. <a name="l01898"></a>01898 <a class="code" href="classPubSubMMOG.html#a5a665dd74681081d669ea57efd5d83b0">moveListMessagesSize</a>+= moveList-&gt;getByteLength();
  1934. <a name="l01899"></a>01899 <a class="code" href="classPubSubMMOG.html#a4561eb4e380c7aea874ea622b9145603">respMoveListMessagesSize</a>+= (int)((<span class="keywordtype">double</span>) moveList-&gt;getByteLength() / numRespSubspaces)
  1935. <a name="l01900"></a>01900 );
  1936. <a name="l01901"></a>01901 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( childIt-&gt;first, (<a class="code" href="classBaseOverlayMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">BaseOverlayMessage</a>*) moveList-&gt;<a class="code" href="classPubSubMoveListMessage.html#a5d61d0f12b29063f944e6fd5775d3da7">dup</a>() );
  1937. <a name="l01902"></a>01902 <span class="comment">// ... but don&#39;t send msgs to too many cached children, as this would exhaust our bandwidth</span>
  1938. <a name="l01903"></a>01903 }
  1939. <a name="l01904"></a>01904 }
  1940. <a name="l01905"></a>01905
  1941. <a name="l01906"></a>01906 <span class="comment">// ... all direct intermediates and intermediates with broken parent</span>
  1942. <a name="l01907"></a>01907 deque&lt;PubSubSubspaceResponsible::IntermediateNode&gt;::iterator iit;
  1943. <a name="l01908"></a>01908 <span class="keywordflow">for</span>( iit = subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.begin(); iit != subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.end(); ++iit )
  1944. <a name="l01909"></a>01909 {
  1945. <a name="l01910"></a>01910 <span class="keywordtype">int</span> intermediatePos = iit - subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>.begin();
  1946. <a name="l01911"></a>01911 <span class="keywordflow">if</span>( intermediatePos &gt;= <a class="code" href="classPubSubMMOG.html#a7d310afbff3e729b6a33f8e6614de07e">maxChildren</a> &amp;&amp;
  1947. <a name="l01912"></a>01912 !subspace.<a class="code" href="classPubSubSubspaceResponsible.html#ac0c251df1da2b4752784b9c77a697059">intermediateNodes</a>[intermediatePos/<a class="code" href="classPubSubMMOG.html#a7d310afbff3e729b6a33f8e6614de07e">maxChildren</a> -1].node.isUnspecified() ) <span class="keywordflow">continue</span>;
  1948. <a name="l01913"></a>01913 <span class="keywordflow">if</span>( !iit-&gt;node.isUnspecified() ) {
  1949. <a name="l01914"></a>01914 <a class="code" href="GlobalStatistics_8h.html#af29140ebe8e0a93406a58441f7c5fec8" title="Macro used for recording statistics considering measureNetwIn parameter.">RECORD_STATS</a>(
  1950. <a name="l01915"></a>01915 ++<a class="code" href="classPubSubMMOG.html#ae81f55efe5b21342597e408ff3474eee">numMoveListMessages</a>;
  1951. <a name="l01916"></a>01916 <a class="code" href="classPubSubMMOG.html#a5a665dd74681081d669ea57efd5d83b0">moveListMessagesSize</a>+= moveList-&gt;getByteLength();
  1952. <a name="l01917"></a>01917 <a class="code" href="classPubSubMMOG.html#a4561eb4e380c7aea874ea622b9145603">respMoveListMessagesSize</a>+= (int)((<span class="keywordtype">double</span>) moveList-&gt;getByteLength() / numRespSubspaces)
  1953. <a name="l01918"></a>01918 );
  1954. <a name="l01919"></a>01919 <a class="code" href="classBaseOverlay.html#a124850e5bc8d81b3eb4f3aec75868449" title="Sends message to underlay.">sendMessageToUDP</a>( iit-&gt;node, (<a class="code" href="classBaseOverlayMessage.html" title="Class generated from common/CommonMessages.msg by opp_msgc.">BaseOverlayMessage</a>*) moveList-&gt;<a class="code" href="classPubSubMoveListMessage.html#a5d61d0f12b29063f944e6fd5775d3da7">dup</a>() );
  1955. <a name="l01920"></a>01920 }
  1956. <a name="l01921"></a>01921 }
  1957. <a name="l01922"></a>01922
  1958. <a name="l01923"></a>01923 <span class="keyword">delete</span> moveList;
  1959. <a name="l01924"></a>01924 }
  1960. <a name="l01925"></a>01925 }
  1961. <a name="l01926"></a>01926
  1962. <a name="l01927"></a><a class="code" href="classPubSubMMOG.html#a3e573d9ce39091daea435016a587b239">01927</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a3e573d9ce39091daea435016a587b239">PubSubMMOG::setBootstrapedIcon</a>()
  1963. <a name="l01928"></a>01928 {
  1964. <a name="l01929"></a>01929 <span class="keywordflow">if</span>(ev.isGUI()) {
  1965. <a name="l01930"></a>01930 <span class="keywordflow">if</span>(<a class="code" href="classBaseOverlay.html#ab4be6d88417117fbf33a445d56af2655">state</a> == <a class="code" href="classBaseOverlay.html#a0ad4b12b0c9949661f66db7fbbf7d40fab3a263fb274a58d63b15cd61ba910335">READY</a>) {
  1966. <a name="l01931"></a>01931 getParentModule()-&gt;getParentModule()-&gt;getDisplayString().setTagArg(<span class="stringliteral">&quot;i2&quot;</span>, 1, <span class="stringliteral">&quot;green&quot;</span>);
  1967. <a name="l01932"></a>01932 getDisplayString().setTagArg(<span class="stringliteral">&quot;i&quot;</span>, 1, <span class="stringliteral">&quot;green&quot;</span>);
  1968. <a name="l01933"></a>01933 }
  1969. <a name="l01934"></a>01934 <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classBaseOverlay.html#ab4be6d88417117fbf33a445d56af2655">state</a> == <a class="code" href="classBaseOverlay.html#a0ad4b12b0c9949661f66db7fbbf7d40fabe22ce6e9471e472a566ba6cc27fbb5a">JOINING</a>) {
  1970. <a name="l01935"></a>01935 getParentModule()-&gt;getParentModule()-&gt;getDisplayString().setTagArg(<span class="stringliteral">&quot;i2&quot;</span>, 1, <span class="stringliteral">&quot;yellow&quot;</span>);
  1971. <a name="l01936"></a>01936 getDisplayString().setTagArg(<span class="stringliteral">&quot;i&quot;</span>, 1, <span class="stringliteral">&quot;yellow&quot;</span>);
  1972. <a name="l01937"></a>01937 }
  1973. <a name="l01938"></a>01938 <span class="keywordflow">else</span> {
  1974. <a name="l01939"></a>01939 getParentModule()-&gt;getParentModule()-&gt;getDisplayString().setTagArg(<span class="stringliteral">&quot;i2&quot;</span>, 1, <span class="stringliteral">&quot;red&quot;</span>);
  1975. <a name="l01940"></a>01940 getDisplayString().setTagArg(<span class="stringliteral">&quot;i&quot;</span>, 1, <span class="stringliteral">&quot;red&quot;</span>);
  1976. <a name="l01941"></a>01941 }
  1977. <a name="l01942"></a>01942 }
  1978. <a name="l01943"></a>01943 }
  1979. <a name="l01944"></a>01944
  1980. <a name="l01945"></a><a class="code" href="classPubSubMMOG.html#a7544c76d3fceee2a56dee1bdf63c4db1">01945</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#a7544c76d3fceee2a56dee1bdf63c4db1">PubSubMMOG::startTimer</a>( <a class="code" href="classPubSubTimer.html" title="Class generated from overlay/pubsubmmog/PubSubMessage.msg by opp_msgc.">PubSubTimer</a>* timer )
  1981. <a name="l01946"></a>01946 {
  1982. <a name="l01947"></a>01947 <span class="keywordflow">if</span>( !timer ) {
  1983. <a name="l01948"></a>01948 EV &lt;&lt; <span class="stringliteral">&quot;[PubSubMMOG::startTimer() @ &quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classTransportAddress.html#a00e613d98d3412e2b92897c25aa0eb4c" title="returns ip address">getIp</a>()
  1984. <a name="l01949"></a>01949 &lt;&lt; <span class="stringliteral">&quot; (&quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a>.<a class="code" href="classNodeHandle.html#aef531103cdf07c8353267f4d30a80112" title="returns key of this NodeHandle">getKey</a>().<a class="code" href="classOverlayKey.html#aabeb4fd284a630a82e982ba34ece4fd9" title="Returns a string representation of this key.">toString</a>(16) &lt;&lt; <span class="stringliteral">&quot;)]\n&quot;</span>
  1985. <a name="l01950"></a>01950 &lt;&lt; <span class="stringliteral">&quot; WARNING! Trying to start NULL timer @ &quot;</span> &lt;&lt; <a class="code" href="classBaseRpc.html#a88eb68c06450fd12ea072f471bf1c1b8" title="NodeHandle to this node.">thisNode</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>
  1986. <a name="l01951"></a>01951 &lt;&lt; endl;
  1987. <a name="l01952"></a>01952 <span class="keywordflow">return</span>;
  1988. <a name="l01953"></a>01953 }
  1989. <a name="l01954"></a>01954
  1990. <a name="l01955"></a>01955 <span class="keywordflow">if</span>( timer-&gt;isScheduled() ) {
  1991. <a name="l01956"></a>01956 cancelEvent( timer );
  1992. <a name="l01957"></a>01957 }
  1993. <a name="l01958"></a>01958
  1994. <a name="l01959"></a>01959 simtime_t duration = 0;
  1995. <a name="l01960"></a>01960 <span class="keywordflow">switch</span>( timer-&gt;<a class="code" href="classPubSubTimer.html#a4f1885dff2e7dc391d899e5b6b3cc92f">getType</a>() ) {
  1996. <a name="l01961"></a>01961 <span class="keywordflow">case</span> <a class="code" href="PubSubMessage__m_8h.html#ac87923fdb9d8348a9eb766921ec0e04caec28dc4bd962108ceb27575f46b81ebd">PUBSUB_HEARTBEAT</a>:
  1997. <a name="l01962"></a>01962 duration = <a class="code" href="classPubSubMMOG.html#a98fd6baf72474a184c902133581273fa">parentTimeout</a>/2;
  1998. <a name="l01963"></a>01963 <span class="keywordflow">break</span>;
  1999. <a name="l01964"></a>01964 <span class="keywordflow">case</span> <a class="code" href="PubSubMessage__m_8h.html#ac87923fdb9d8348a9eb766921ec0e04caa64f2984ebaaa94fb52bc3ff99d24fa1">PUBSUB_CHILDPING</a>:
  2000. <a name="l01965"></a>01965 duration = <a class="code" href="classPubSubMMOG.html#a98fd6baf72474a184c902133581273fa">parentTimeout</a>*10; <span class="comment">// FIXME: make it a parameter</span>
  2001. <a name="l01966"></a>01966 <span class="keywordflow">break</span>;
  2002. <a name="l01967"></a>01967 <span class="keywordflow">case</span> <a class="code" href="PubSubMessage__m_8h.html#ac87923fdb9d8348a9eb766921ec0e04cad6da37474996a5016fe145fcc24a52c8">PUBSUB_PARENT_TIMEOUT</a>:
  2003. <a name="l01968"></a>01968 duration = <a class="code" href="classPubSubMMOG.html#a98fd6baf72474a184c902133581273fa">parentTimeout</a>;
  2004. <a name="l01969"></a>01969 <span class="keywordflow">break</span>;
  2005. <a name="l01970"></a>01970 <span class="keywordflow">case</span> <a class="code" href="PubSubMessage__m_8h.html#ac87923fdb9d8348a9eb766921ec0e04cab87b77accd020036a875063be27c753c">PUBSUB_EVENTDELIVERY</a>:
  2006. <a name="l01971"></a>01971 duration = 1.0/<a class="code" href="classPubSubMMOG.html#a228fe6f61d1fe510d1336296c4bf254c">movementRate</a>;
  2007. <a name="l01972"></a>01972 <span class="keywordflow">break</span>;
  2008. <a name="l01973"></a>01973 }
  2009. <a name="l01974"></a>01974 scheduleAt(simTime() + duration, timer );
  2010. <a name="l01975"></a>01975 }
  2011. <a name="l01976"></a>01976
  2012. <a name="l01977"></a><a class="code" href="classPubSubMMOG.html#ab097bce7563e87ecf690559095908207">01977</a> <span class="keywordtype">void</span> <a class="code" href="classPubSubMMOG.html#ab097bce7563e87ecf690559095908207" title="collects statistical data in derived class">PubSubMMOG::finishOverlay</a>()
  2013. <a name="l01978"></a>01978 {
  2014. <a name="l01979"></a>01979 simtime_t time = <a class="code" href="classBaseRpc.html#a9552ba3a2b09c83b3c561e65dab9f23d" title="pointer to GlobalStatistics module in this node">globalStatistics</a>-&gt;<a class="code" href="classGlobalStatistics.html#a610799ebfbf64696c59b811870cc8300">calcMeasuredLifetime</a>(<a class="code" href="classBaseOverlay.html#af0eebaddea732ee4ab4d247c388e62bd" title="simtime when the node has been created">creationTime</a>);
  2015. <a name="l01980"></a>01980 <span class="keywordflow">if</span> (time &lt; <a class="code" href="classGlobalStatistics.html#a169810c78519b271f7e32fdc7c9fc641" title="minimum useful measured lifetime in seconds">GlobalStatistics::MIN_MEASURED</a>) <span class="keywordflow">return</span>;
  2016. <a name="l01981"></a>01981
  2017. <a name="l01982"></a>01982 <a class="code" href="classBaseRpc.html#a9552ba3a2b09c83b3c561e65dab9f23d" title="pointer to GlobalStatistics module in this node">globalStatistics</a>-&gt;<a class="code" href="classGlobalStatistics.html#a6a697a0b67f344e4bc214159761f943a" title="Add a new value to the cStdDev container specified by the name parameter.">addStdDev</a>(<span class="stringliteral">&quot;PubSubMMOG: Sent Signaling Messages/s&quot;</span>,
  2018. <a name="l01983"></a>01983 <a class="code" href="classPubSubMMOG.html#aed031b28dd4fd6b2db5f68247ff742d7">numPubSubSignalingMessages</a> / time);
  2019. <a name="l01984"></a>01984 <a class="code" href="classBaseRpc.html#a9552ba3a2b09c83b3c561e65dab9f23d" title="pointer to GlobalStatistics module in this node">globalStatistics</a>-&gt;<a class="code" href="classGlobalStatistics.html#a6a697a0b67f344e4bc214159761f943a" title="Add a new value to the cStdDev container specified by the name parameter.">addStdDev</a>(<span class="stringliteral">&quot;PubSubMMOG: Sent Signaling bytes/s&quot;</span>,
  2020. <a name="l01985"></a>01985 <a class="code" href="classPubSubMMOG.html#a16f1ec7076f68484acd789057428a3cc">pubSubSignalingMessagesSize</a> / time);
  2021. <a name="l01986"></a>01986 <a class="code" href="classBaseRpc.html#a9552ba3a2b09c83b3c561e65dab9f23d" title="pointer to GlobalStatistics module in this node">globalStatistics</a>-&gt;<a class="code" href="classGlobalStatistics.html#a6a697a0b67f344e4bc214159761f943a" title="Add a new value to the cStdDev container specified by the name parameter.">addStdDev</a>(<span class="stringliteral">&quot;PubSubMMOG: Sent Move Messages/s&quot;</span>,
  2022. <a name="l01987"></a>01987 <a class="code" href="classPubSubMMOG.html#a11ca86e89977d8bb4d1512a5e64ce8d3">numMoveMessages</a> / time);
  2023. <a name="l01988"></a>01988 <a class="code" href="classBaseRpc.html#a9552ba3a2b09c83b3c561e65dab9f23d" title="pointer to GlobalStatistics module in this node">globalStatistics</a>-&gt;<a class="code" href="classGlobalStatistics.html#a6a697a0b67f344e4bc214159761f943a" title="Add a new value to the cStdDev container specified by the name parameter.">addStdDev</a>(<span class="stringliteral">&quot;PubSubMMOG: Sent Move bytes/s&quot;</span>,
  2024. <a name="l01989"></a>01989 <a class="code" href="classPubSubMMOG.html#a122b6f4eacfc82a453cdabace026a0d5">moveMessagesSize</a> / time);
  2025. <a name="l01990"></a>01990 <a class="code" href="classBaseRpc.html#a9552ba3a2b09c83b3c561e65dab9f23d" title="pointer to GlobalStatistics module in this node">globalStatistics</a>-&gt;<a class="code" href="classGlobalStatistics.html#a6a697a0b67f344e4bc214159761f943a" title="Add a new value to the cStdDev container specified by the name parameter.">addStdDev</a>(<span class="stringliteral">&quot;PubSubMMOG: Sent MoveList Messages/s&quot;</span>,
  2026. <a name="l01991"></a>01991 <a class="code" href="classPubSubMMOG.html#ae81f55efe5b21342597e408ff3474eee">numMoveListMessages</a> / time);
  2027. <a name="l01992"></a>01992 <a class="code" href="classBaseRpc.html#a9552ba3a2b09c83b3c561e65dab9f23d" title="pointer to GlobalStatistics module in this node">globalStatistics</a>-&gt;<a class="code" href="classGlobalStatistics.html#a6a697a0b67f344e4bc214159761f943a" title="Add a new value to the cStdDev container specified by the name parameter.">addStdDev</a>(<span class="stringliteral">&quot;PubSubMMOG: Sent MoveList bytes/s&quot;</span>,
  2028. <a name="l01993"></a>01993 <a class="code" href="classPubSubMMOG.html#a5a665dd74681081d669ea57efd5d83b0">moveListMessagesSize</a> / time);
  2029. <a name="l01994"></a>01994 <a class="code" href="classBaseRpc.html#a9552ba3a2b09c83b3c561e65dab9f23d" title="pointer to GlobalStatistics module in this node">globalStatistics</a>-&gt;<a class="code" href="classGlobalStatistics.html#a6a697a0b67f344e4bc214159761f943a" title="Add a new value to the cStdDev container specified by the name parameter.">addStdDev</a>(<span class="stringliteral">&quot;PubSubMMOG: Received Move Events (correct timeslot)/s&quot;</span>,
  2030. <a name="l01995"></a>01995 <a class="code" href="classPubSubMMOG.html#a0adb17b77190fd14c0979fe39a5889cc">numEventsCorrectTimeslot</a> / time);
  2031. <a name="l01996"></a>01996 <a class="code" href="classBaseRpc.html#a9552ba3a2b09c83b3c561e65dab9f23d" title="pointer to GlobalStatistics module in this node">globalStatistics</a>-&gt;<a class="code" href="classGlobalStatistics.html#a6a697a0b67f344e4bc214159761f943a" title="Add a new value to the cStdDev container specified by the name parameter.">addStdDev</a>(<span class="stringliteral">&quot;PubSubMMOG: Received Move Events (wrong timeslot)/s&quot;</span>,
  2032. <a name="l01997"></a>01997 <a class="code" href="classPubSubMMOG.html#aa809123a9ef7f64ea622400ed60a2d4c">numEventsWrongTimeslot</a> / time);
  2033. <a name="l01998"></a>01998 <a class="code" href="classBaseRpc.html#a9552ba3a2b09c83b3c561e65dab9f23d" title="pointer to GlobalStatistics module in this node">globalStatistics</a>-&gt;<a class="code" href="classGlobalStatistics.html#a6a697a0b67f344e4bc214159761f943a" title="Add a new value to the cStdDev container specified by the name parameter.">addStdDev</a>(<span class="stringliteral">&quot;PubSubMMOG: Responsible Nodes: Send MoveList Bytes/s&quot;</span>,
  2034. <a name="l01999"></a>01999 <a class="code" href="classPubSubMMOG.html#a4561eb4e380c7aea874ea622b9145603">respMoveListMessagesSize</a> / time);
  2035. <a name="l02000"></a>02000 <a class="code" href="classBaseRpc.html#a9552ba3a2b09c83b3c561e65dab9f23d" title="pointer to GlobalStatistics module in this node">globalStatistics</a>-&gt;<a class="code" href="classGlobalStatistics.html#a6a697a0b67f344e4bc214159761f943a" title="Add a new value to the cStdDev container specified by the name parameter.">addStdDev</a>(<span class="stringliteral">&quot;PubSubMMOG: Lost or too long delayed MoveLists/s&quot;</span>,
  2036. <a name="l02001"></a>02001 <a class="code" href="classPubSubMMOG.html#a1450e36b5a7103fe4581f271fac13340">lostMovementLists</a> / time);
  2037. <a name="l02002"></a>02002 <a class="code" href="classBaseRpc.html#a9552ba3a2b09c83b3c561e65dab9f23d" title="pointer to GlobalStatistics module in this node">globalStatistics</a>-&gt;<a class="code" href="classGlobalStatistics.html#a6a697a0b67f344e4bc214159761f943a" title="Add a new value to the cStdDev container specified by the name parameter.">addStdDev</a>(<span class="stringliteral">&quot;PubSubMMOG: Received valid MoveLists/s&quot;</span>,
  2038. <a name="l02003"></a>02003 <a class="code" href="classPubSubMMOG.html#a8415fe6a47b3b961fd54f9e3b5f8d3f0">receivedMovementLists</a> / time);
  2039. <a name="l02004"></a>02004 }
  2040. <a name="l02005"></a>02005
  2041. <a name="l02006"></a><a class="code" href="classPubSubMMOG.html#ad55240696d31dd1a7003a7269aca4743">02006</a> <a class="code" href="classPubSubMMOG.html#ad55240696d31dd1a7003a7269aca4743">PubSubMMOG::~PubSubMMOG</a>()
  2042. <a name="l02007"></a>02007 {
  2043. <a name="l02008"></a>02008 <span class="comment">// Delete all waiting move messages</span>
  2044. <a name="l02009"></a>02009 std::map&lt;PubSubSubspaceId, PubSubSubspaceResponsible&gt;::iterator it;
  2045. <a name="l02010"></a>02010 <span class="keywordflow">for</span>( it = <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.begin(); it != <a class="code" href="classPubSubMMOG.html#a4b4d32adfbffbd585d8a174d47b24db9">responsibleSubspaces</a>.end(); ++it) {
  2046. <a name="l02011"></a>02011 deque&lt;PubSubMoveMessage*&gt;::iterator msgIt;
  2047. <a name="l02012"></a>02012 <span class="keywordflow">for</span>( msgIt = it-&gt;second.waitingMoveMessages.begin(); msgIt != it-&gt;second.waitingMoveMessages.end(); ++msgIt ){
  2048. <a name="l02013"></a>02013 cancelAndDelete( *msgIt );
  2049. <a name="l02014"></a>02014 }
  2050. <a name="l02015"></a>02015 it-&gt;second.waitingMoveMessages.clear();
  2051. <a name="l02016"></a>02016 }
  2052. <a name="l02017"></a>02017
  2053. <a name="l02018"></a>02018 cancelAndDelete(<a class="code" href="classPubSubMMOG.html#aebf88e5c0a0f294c706c3281b1aae373">heartbeatTimer</a>);
  2054. <a name="l02019"></a>02019 }
  2055. </pre></div></div>
  2056. </div>
  2057. <hr class="footer"/><address class="footer"><small>Generated on Wed Nov 3 2010 14:40:45 for OverSim by&nbsp;
  2058. <a href="http://www.doxygen.org/index.html">
  2059. <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
  2060. </body>
  2061. </html>