OpenDDS  Snapshot(2023/04/28-20:55)
MessageBlock.cpp
Go to the documentation of this file.
1 /*
2  *
3  *
4  * Distributed under the OpenDDS License.
5  * See: http://www.opendds.org/license.html
6  */
7 
8 #include "DCPS/DdsDcps_pch.h" //Only the _pch include should start with DCPS/
9 
10 #include "MessageBlock.h"
11 
12 #include <algorithm>
13 
15 
16 namespace OpenDDS {
17 namespace DCPS {
18 
20  : data_()
21  , rd_ptr_()
22  , wr_ptr_()
23 {
24  ACE_Allocator* const alloc = ACE_Allocator::instance();
26  (ACE_Data_Block*) alloc->malloc(sizeof(ACE_Data_Block)),
27  ACE_Data_Block(size, ACE_Message_Block::MB_DATA, 0, alloc, 0,
28  0, alloc));
29 }
30 
31 MessageBlock::MessageBlock(const char* data, size_t size)
32  : data_()
33  , rd_ptr_()
34  , wr_ptr_(size)
35 {
36  ACE_Allocator* const alloc = ACE_Allocator::instance();
38  (ACE_Data_Block*) alloc->malloc(sizeof(ACE_Data_Block)),
39  ACE_Data_Block(size, ACE_Message_Block::MB_DATA, data, alloc, 0,
41 }
42 
44  : data_(amb.data_block()->duplicate())
45  , rd_ptr_(amb.rd_ptr() - amb.base())
46  , wr_ptr_(amb.wr_ptr() - amb.base())
47 {}
48 
50  : data_(rhs.data_->duplicate())
51  , rd_ptr_(rhs.rd_ptr_)
52  , wr_ptr_(rhs.wr_ptr_)
53 {}
54 
56 {
57  if (data_) {
58  data_->release();
59  }
60 }
61 
62 void
64 {
65  std::swap(data_, rhs.data_);
68 }
69 
72 {
73  if (&rhs != this) {
74  MessageBlock copy(rhs);
75  swap(copy);
76  }
77  return *this;
78 }
79 
80 #ifdef ACE_HAS_CPP11
82  : data_(rhs.data_)
83  , rd_ptr_(rhs.rd_ptr_)
84  , wr_ptr_(rhs.wr_ptr_)
85 {
86  rhs.data_ = 0;
87 }
88 
91 {
92  swap(rhs);
93  return *this;
94 }
95 #endif
96 
97 void swap(MessageBlock& lhs, MessageBlock& rhs)
98 {
99  lhs.swap(rhs);
100 }
101 
102 } // DCPS
103 } // OPENDDS
104 
void swap(MessageBlock &lhs, MessageBlock &rhs)
MessageBlock & operator=(const MessageBlock &rhs)
ACE_Data_Block * release(ACE_Lock *lock=0)
MessageBlock(const ACE_Message_Block &amb)
construct a MessageBlock that references the existing amb&#39;s ACE_Data_Block
#define ACE_NEW_MALLOC(POINTER, ALLOCATOR, CONSTRUCTOR)
void swap(MessageBlock &rhs)
static ACE_Allocator * instance(void)
DDS::ReturnCode_t copy(DDS::DynamicData_ptr dest, DDS::DynamicData_ptr src)
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
ACE_Data_Block * data_
Definition: MessageBlock.h:56
The Internal API and Implementation of OpenDDS.
Definition: AddressCache.h:28
virtual void * malloc(size_type nbytes)=0