summaryrefslogtreecommitdiff
path: root/ace/RMCast/RMCast_Reassembly.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ace/RMCast/RMCast_Reassembly.cpp')
-rw-r--r--ace/RMCast/RMCast_Reassembly.cpp75
1 files changed, 48 insertions, 27 deletions
diff --git a/ace/RMCast/RMCast_Reassembly.cpp b/ace/RMCast/RMCast_Reassembly.cpp
index ed488341bae..5d4cc34b4c8 100644
--- a/ace/RMCast/RMCast_Reassembly.cpp
+++ b/ace/RMCast/RMCast_Reassembly.cpp
@@ -22,19 +22,18 @@ ACE_RMCast_Reassembly (void)
ACE_RMCast_Reassembly::~ACE_RMCast_Reassembly (void)
{
- /*!<
- We cleanup the resources in the destructor
- <B color=red>@@ TODO</B> Why not in the close() operation?
- */
- for (Message_Map_Iterator i = this->messages_.begin ();
- i != this->messages_.end ();
- ++i)
- {
- ACE_RMCast_Partial_Message *message = (*i).int_id_;
- if (message != 0)
- delete message;
- }
- this->messages_.unbind_all ();
+ (void) this->close_i ();
+}
+
+/**
+ *
+ * We cleanup the resources in the destructor
+ */
+int
+ACE_RMCast_Reassembly::close ()
+{
+ this->close_i ();
+ return this->ACE_RMCast_Module::close ();
}
int
@@ -43,9 +42,15 @@ ACE_RMCast_Reassembly::data (ACE_RMCast::Data &data)
if (this->next () == 0)
return 0;
+ // ACE_DEBUG ((LM_DEBUG,
+ // "Reassembly::data - %d,%d,%d\n",
+ // data.sequence_number,
+ // data.total_size,
+ // data.fragment_offset));
+
if (data.payload->length () + data.fragment_offset > data.total_size)
{
- ACE_DEBUG ((LM_DEBUG,
+ ACE_ERROR ((LM_ERROR,
"RMCast_Reassembly::data - invalid size\n"));
return -1; // Corrupt message?
}
@@ -60,33 +65,35 @@ ACE_RMCast_Reassembly::data (ACE_RMCast::Data &data)
ACE_RMCast_Partial_Message (data.total_size),
-1);
+ // ACE_DEBUG ((LM_DEBUG,
+ // "Reassembly::data - new message\n"));
if (this->messages_.bind (data.sequence_number,
message) == -1)
return -1; // Internal error?
}
- // The message was in the collection, but it has been received
- // already, this is a duplicate fragment, just drop it.
- if (message == 0)
- return 0;
-
if (message->fragment_received (data.total_size,
data.fragment_offset,
data.payload) == -1)
{
- ACE_DEBUG ((LM_DEBUG,
- "Error in fragment_received\n"));
+ // ACE_DEBUG ((LM_DEBUG,
+ // "Error in fragment_received\n"));
return -1;
}
if (!message->is_complete ())
- return 0;
+ {
+ // ACE_DEBUG ((LM_DEBUG,
+ // "Reassembly::data - message still incomplete\n"));
+ return 0;
+ }
- // Remove the message from the collection, but leave a marker
- // to indicate that it was already received...
- if (this->messages_.rebind (data.sequence_number,
- (ACE_RMCast_Partial_Message*)0) == -1)
- return -1;
+ if (this->messages_.unbind (data.sequence_number) == -1)
+ {
+ // ACE_DEBUG ((LM_DEBUG,
+ // "Reassembly::data - message now complete\n"));
+ return -1;
+ }
}
// Push the message...
@@ -104,6 +111,20 @@ ACE_RMCast_Reassembly::data (ACE_RMCast::Data &data)
return r;
}
+void
+ACE_RMCast_Reassembly::close_i (void)
+{
+ for (Message_Map_Iterator i = this->messages_.begin ();
+ i != this->messages_.end ();
+ ++i)
+ {
+ ACE_RMCast_Partial_Message *message = (*i).int_id_;
+ if (message != 0)
+ delete message;
+ }
+ this->messages_.unbind_all ();
+}
+
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
template class ACE_Hash_Map_Manager<ACE_UINT32,ACE_RMCast_Partial_Message*,ACE_Null_Mutex>;