24 link->transport_priority(),
28 , datalink_control_size_(link->config()->datalink_control_size_)
30 #ifdef OPENDDS_SHMEM_UNIX 52 const size_t limit = (extra >=
sizeof(int)) ? n_elems : (n_elems - 1);
57 peer->
find(
"Semaphore", mem);
59 #if defined OPENDDS_SHMEM_WINDOWS 60 HANDLE srcProc = ::OpenProcess(PROCESS_DUP_HANDLE,
false ,
65 DUPLICATE_SAME_ACCESS );
66 ::CloseHandle(srcProc);
67 #elif defined OPENDDS_SHMEM_UNIX 80 if (static_cast<size_t>(iov[0].iov_len) != hdr_sz) {
82 "expecting iov[0] of size %B, got %B\n",
83 link_, hdr_sz, iov[0].iov_len), 0);
90 "expecting iov[0] to contain the transport header\n",
link_), 0);
98 size_t pool_alloc_size = 0;
99 for (
int i = 1 ; i < n; ++i) {
100 pool_alloc_size += iov[i].iov_len;
105 if (alloc == 0 || (from_pool = alloc->
malloc(pool_alloc_size)) == 0) {
107 "to allocate %B bytes for data\n",
link_, pool_alloc_size), 0);
112 char* payload =
reinterpret_cast<char*
>(from_pool);
113 char* iter = payload;
114 for (
int i = 1 ; i < n; ++i) {
115 std::memcpy(iter, iov[i].iov_base, iov[i].iov_len);
116 iter += iov[i].iov_len;
122 "to find control segment with bound name %C\n",
link_,
bound_name_.c_str()), 0);
127 for (
ShmemData* iter = reinterpret_cast<ShmemData*>(mem);
130 alloc->
free(iter->payload_);
136 "releasing control block #%d\n",
link_,
137 iter - reinterpret_cast<ShmemData*>(mem)), 5);
151 "space for control\n",
link_), 0);
160 VDBG((
LM_DEBUG,
"(%P|%t) ShmemSendStrategy for link %@ " 161 "writing at control block #%d header %@ payload %@ len %B\n",
170 "failed to find space for control\n",
link_), 0);
176 return pool_alloc_size + iov[0].iov_len;
182 #ifdef OPENDDS_SHMEM_WINDOWS
int find(const char *name, void *&pointer)
virtual bool start_i()
Let the subclass start.
ShmemAllocator * local_allocator()
std::string peer_address()
ShmemAllocator * peer_allocator()
static const ACE_CDR::Octet DCPS_PROTOCOL[6]
const size_t datalink_control_size_
int bind(const char *name, void *pointer, int duplicates=0)
virtual ssize_t send_bytes_i(const iovec iov[], int n)
virtual void stop_i()
Let the subclass stop.
void * malloc(size_t nbytes)
char transport_header_[TRANSPORT_HDR_SERIALIZED_SZ]
ACE_Based_Pointer_Basic< char > payload_
ACE_sema_t peer_semaphore_
ShmemData * current_data_
void * memset(void *s, int c, size_t len)
void * calloc(size_t nbytes, char initial_value='\0')
#define VDBG_LVL(DBG_ARGS, LEVEL)
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
int sema_post(ACE_sema_t *s)
ShmemSendStrategy(ShmemDataLink *link)
The Internal API and Implementation of OpenDDS.