12 #ifndef SST_CORE_INTERPROCESS_TUNNEL_DEF_H 13 #define SST_CORE_INTERPROCESS_TUNNEL_DEF_H 23 #include "sst/core/interprocess/circularBuffer.h" 34 extern uint32_t globalMMAPIPCCount;
39 volatile uint32_t expectedChildren;
56 template <
typename ShareDataType,
typename MsgType>
69 TunnelDef(
size_t numBuffers,
size_t bufferSize, uint32_t expectedChildren) :
74 numBuffs = numBuffers;
75 buffSize = bufferSize;
76 children = expectedChildren;
77 shmSize = calculateShmemSize(numBuffers, bufferSize);
89 shmSize = isd->shmSegSize;
102 nextAllocPtr = (uint8_t*)shmPtr;
106 std::pair<size_t, InternalSharedData*> aResult =
107 reserveSpace<InternalSharedData>((1 + numBuffs) *
sizeof(
size_t));
108 isd = aResult.second;
109 isd->expectedChildren = children;
110 isd->shmSegSize = shmSize;
111 isd->numBuffers = numBuffs;
114 std::pair<size_t, ShareDataType*> bResult = reserveSpace<ShareDataType>(0);
115 isd->offsets[0] = bResult.first;
119 const size_t cbSize =
sizeof(MsgType) * buffSize;
120 for (
size_t c = 0; c < isd->numBuffers; c++ ) {
123 std::pair<size_t, CircBuff_t*> cResult = reserveSpace<CircBuff_t>(cbSize);
124 isd->offsets[1 + c] = cResult.first;
125 cPtr = cResult.second;
126 if ( !cPtr->setBufferSize(buffSize) ) exit(1);
127 circBuffs.push_back(cPtr);
129 return isd->expectedChildren;
133 shmSize = isd->shmSegSize;
135 sharedData = (ShareDataType*)((uint8_t*)shmPtr + isd->offsets[0]);
137 for (
size_t c = 0; c < isd->numBuffers; c++ ) {
138 circBuffs.push_back((
CircBuff_t*)((uint8_t*)shmPtr + isd->offsets[c + 1]));
140 numBuffs = isd->numBuffers;
142 auto t = isd->expectedChildren - 1;
143 isd->expectedChildren = t;
155 for (
size_t i = 0; i < circBuffs.size(); i++ ) {
156 circBuffs[i]->~CircBuff_t();
178 void writeMessage(
size_t buffer,
const MsgType& command) { circBuffs[buffer]->write(command); }
184 MsgType
readMessage(
size_t buffer) {
return circBuffs[buffer]->read(); }
191 bool readMessageNB(
size_t buffer, MsgType* result) {
return circBuffs[buffer]->readNB(result); }
196 void clearBuffer(
size_t buffer) { circBuffs[buffer]->clearBuffer(); }
207 template <
typename T>
208 std::pair<size_t, T*> reserveSpace(
size_t extraSpace = 0)
210 size_t space =
sizeof(T) + extraSpace;
211 if ( (
size_t)((nextAllocPtr + space) - (uint8_t*)shmPtr) > shmSize )
return std::make_pair<size_t, T*>(0, NULL);
212 T* ptr = (T*)nextAllocPtr;
213 nextAllocPtr += space;
215 return std::make_pair((uint8_t*)ptr - (uint8_t*)shmPtr, ptr);
219 static size_t calculateShmemSize(
size_t numBuffers,
size_t bufferSize)
221 long pagesize = sysconf(_SC_PAGESIZE);
223 size_t isd = 1 + ((
sizeof(InternalSharedData) + (1 + numBuffers) *
sizeof(size_t)) / pagesize);
224 size_t buffer = 1 + ((
sizeof(CircularBuffer<MsgType>) + bufferSize *
sizeof(MsgType)) / pagesize);
225 size_t shdata = 1 + ((
sizeof(ShareDataType) +
sizeof(InternalSharedData)) / pagesize);
228 return (2 + isd + shdata + numBuffers * buffer) * pagesize;
242 uint8_t* nextAllocPtr;
252 std::vector<CircBuff_t*> circBuffs;
257 #endif // SST_CORE_INTERPROCESS_TUNNEL_DEF_H ShareDataType * getSharedData()
return a pointer to the ShareDataType region
Definition: tunneldef.h:172
void clearBuffer(size_t buffer)
Empty the messages in a buffer.
Definition: tunneldef.h:196
size_t getTunnelSize()
return size of tunnel
Definition: tunneldef.h:169
ShareDataType * sharedData
Pointer to the Shared Data Region.
Definition: tunneldef.h:233
TunnelDef(void *sPtr)
Access an existing tunnel Child creates the TunnelDef, reads the shmSize, and then resizes its map ac...
Definition: tunneldef.h:84
size_t getNumBuffers()
Return the number of buffers.
Definition: tunneldef.h:236
uint32_t initialize(void *sPtr)
Finish setting up a tunnel once the manager knows the correct size of the tunnel and has mmap'd a lar...
Definition: tunneldef.h:97
Definition: circularBuffer.h:20
Definition: circularBuffer.h:23
void shutdown()
Clean up a region.
Definition: tunneldef.h:152
This class defines a shared-memory region between a master process and one or more child processes Re...
Definition: tunneldef.h:57
virtual ~TunnelDef()
Destructor.
Definition: tunneldef.h:149
bool readMessageNB(size_t buffer, MsgType *result)
Read data from buffer, non-blocking.
Definition: tunneldef.h:191
Definition: tunneldef.h:37
void writeMessage(size_t buffer, const MsgType &command)
Write data to buffer, blocks until space is available.
Definition: tunneldef.h:178
MsgType readMessage(size_t buffer)
Read data from buffer, blocks until message received.
Definition: tunneldef.h:184
TunnelDef(size_t numBuffers, size_t bufferSize, uint32_t expectedChildren)
Create a new tunnel.
Definition: tunneldef.h:69
bool isMaster()
return whether this is a master-side tunnel or a child
Definition: tunneldef.h:199