diff options
author | bala <balanatarajan@users.noreply.github.com> | 2001-05-03 19:55:29 +0000 |
---|---|---|
committer | bala <balanatarajan@users.noreply.github.com> | 2001-05-03 19:55:29 +0000 |
commit | 7e06af98f78132705e9de2c89614707a1eac4a1f (patch) | |
tree | 590d46f399f50675742c66bc7120d9ecc9b2b79a /ace/CDR_Stream.cpp | |
parent | a7e39417a2f37ca95093bd1afc8e04fc28c52a72 (diff) | |
download | ATCD-7e06af98f78132705e9de2c89614707a1eac4a1f.tar.gz |
ChangeLogTag: Thu May 3 14:52:33 2001 Balachandran Natarajan <bala@cs.wustl.edu>
Diffstat (limited to 'ace/CDR_Stream.cpp')
-rw-r--r-- | ace/CDR_Stream.cpp | 48 |
1 files changed, 40 insertions, 8 deletions
diff --git a/ace/CDR_Stream.cpp b/ace/CDR_Stream.cpp index 0f64ff0d66d..079ffb3d5cc 100644 --- a/ace/CDR_Stream.cpp +++ b/ace/CDR_Stream.cpp @@ -1014,23 +1014,55 @@ ACE_InputCDR::reset (const ACE_Message_Block* data, void ACE_InputCDR::steal_from (ACE_InputCDR &cdr) { -#if 0 this->do_byte_swap_ = cdr.do_byte_swap_; this->start_.data_block (cdr.start_.data_block ()->duplicate ()); this->start_.rd_ptr (cdr.start_.rd_ptr ()); this->start_.wr_ptr (cdr.start_.wr_ptr ()); -#endif - this->steal_data (cdr); cdr.reset_contents (); } void -ACE_InputCDR::steal_data (ACE_InputCDR &cdr) +ACE_InputCDR::exchange_data_blocks (ACE_InputCDR &cdr) { - this->do_byte_swap_ = cdr.do_byte_swap_; - this->start_.data_block (cdr.start_.data_block ()->duplicate ()); - this->start_.rd_ptr (cdr.start_.rd_ptr ()); - this->start_.wr_ptr (cdr.start_.wr_ptr ()); + // Exchange byte orders + int byte_order = cdr.do_byte_swap_; + cdr.do_byte_swap_ = this->do_byte_swap_; + this->do_byte_swap_ = byte_order; + + // Get the destination read and write pointers + size_t drd_pos = + cdr.start_.rd_ptr () - cdr.start_.base (); + size_t dwr_pos = + cdr.start_.wr_ptr () - cdr.start_.base (); + + // Get the source read & write pointers + size_t srd_pos = + this->start_.rd_ptr () - this->start_.base (); + size_t swr_pos = + this->start_.wr_ptr () - this->start_.base (); + + // Exchange data_blocks. Dont release any of the data blocks. + ACE_Data_Block *dnb = + this->start_.replace_data_block (cdr.start_.data_block ()); + cdr.start_.replace_data_block (dnb); + + + // Reset the <cdr> pointers to zero before it is set again. + cdr.start_.reset (); + this->start_.reset (); + + // Set the read and write pointers. + if (cdr.start_.size () >= srd_pos) + cdr.start_.rd_ptr (srd_pos); + + if (cdr.start_.size () >= swr_pos) + cdr.start_.wr_ptr (swr_pos); + + if (this->start_.size () >= drd_pos) + this->start_.rd_ptr (drd_pos); + + if (this->start_.size () >= dwr_pos) + this->start_.wr_ptr (dwr_pos); } |