12#ifndef SST_CORE_INTERPROCESS_TUNNEL_DEF_H 
   13#define SST_CORE_INTERPROCESS_TUNNEL_DEF_H 
   23#include "sst/core/interprocess/circularBuffer.h" 
   29namespace SST::Core::Interprocess {
 
   31extern uint32_t globalMMAPIPCCount;
 
   36    volatile uint32_t expectedChildren;
 
 
   53template <
typename ShareDataType, 
typename MsgType>
 
   66    TunnelDef(
size_t numBuffers, 
size_t bufferSize, uint32_t expectedChildren) :
 
   71        numBuffs = numBuffers;
 
   72        buffSize = bufferSize;
 
   73        children = expectedChildren;
 
   74        shmSize  = calculateShmemSize(numBuffers, bufferSize);
 
 
   86        shmSize = isd->shmSegSize;
 
 
   99            nextAllocPtr = (uint8_t*)shmPtr;
 
  103            std::pair<size_t, InternalSharedData*> aResult =
 
  104                reserveSpace<InternalSharedData>((1 + numBuffs) * 
sizeof(
size_t));
 
  105            isd                   = aResult.second;
 
  106            isd->expectedChildren = children;
 
  107            isd->shmSegSize       = shmSize;
 
  108            isd->numBuffers       = numBuffs;
 
  111            std::pair<size_t, ShareDataType*> bResult = reserveSpace<ShareDataType>(0);
 
  112            isd->offsets[0]                           = bResult.first;
 
  116            const size_t cbSize = 
sizeof(MsgType) * buffSize;
 
  117            for ( 
size_t c = 0; c < isd->numBuffers; c++ ) {
 
  118                CircBuff_t* cPtr = NULL;
 
  120                std::pair<size_t, CircBuff_t*> cResult = reserveSpace<CircBuff_t>(cbSize);
 
  121                isd->offsets[1 + c]                    = cResult.first;
 
  122                cPtr                                   = cResult.second;
 
  123                if ( !cPtr->setBufferSize(buffSize) ) exit(1); 
 
  124                circBuffs.push_back(cPtr);
 
  126            return isd->expectedChildren;
 
  130            shmSize = isd->shmSegSize;
 
  132            sharedData = (ShareDataType*)((uint8_t*)shmPtr + isd->offsets[0]);
 
  134            for ( 
size_t c = 0; c < isd->numBuffers; c++ ) {
 
  135                circBuffs.push_back((CircBuff_t*)((uint8_t*)shmPtr + isd->offsets[c + 1]));
 
  137            numBuffs = isd->numBuffers;
 
  139            return --(isd->expectedChildren);
 
 
  150            for ( 
size_t i = 0; i < circBuffs.size(); i++ ) {
 
  151                circBuffs[i]->~CircBuff_t();
 
 
  173    void writeMessage(
size_t buffer, 
const MsgType& command) { circBuffs[buffer]->write(command); }
 
  179    MsgType 
readMessage(
size_t buffer) { 
return circBuffs[buffer]->read(); }
 
  186    bool readMessageNB(
size_t buffer, MsgType* result) { 
return circBuffs[buffer]->readNB(result); }
 
  191    void clearBuffer(
size_t buffer) { circBuffs[buffer]->clearBuffer(); }
 
  202    template <
typename T>
 
  203    std::pair<size_t, T*> reserveSpace(
size_t extraSpace = 0)
 
  205        size_t space = 
sizeof(T) + extraSpace;
 
  206        if ( (
size_t)((nextAllocPtr + space) - (uint8_t*)shmPtr) > shmSize ) 
return std::make_pair<size_t, T*>(0, NULL);
 
  207        T* ptr = (T*)nextAllocPtr;
 
  208        nextAllocPtr += space;
 
  210        return std::make_pair((uint8_t*)ptr - (uint8_t*)shmPtr, ptr);
 
  214    static size_t calculateShmemSize(
size_t numBuffers, 
size_t bufferSize)
 
  216        long   pagesize = sysconf(_SC_PAGESIZE);
 
  218        size_t isd      = 1 + ((
sizeof(InternalSharedData) + (1 + numBuffers) * 
sizeof(size_t)) / pagesize);
 
  219        size_t buffer   = 1 + ((
sizeof(CircularBuffer<MsgType>) + bufferSize * 
sizeof(MsgType)) / pagesize);
 
  220        size_t shdata   = 1 + ((
sizeof(ShareDataType) + 
sizeof(InternalSharedData)) / pagesize);
 
  223        return (2 + isd + shdata + numBuffers * buffer) * pagesize;
 
  237    uint8_t* nextAllocPtr;
 
  247    std::vector<CircBuff_t*> circBuffs;
 
 
Definition circularBuffer.h:24
virtual ~TunnelDef()
Destructor.
Definition tunneldef.h:144
void writeMessage(size_t buffer, const MsgType &command)
Write data to buffer, blocks until space is available.
Definition tunneldef.h:173
MsgType readMessage(size_t buffer)
Read data from buffer, blocks until message received.
Definition tunneldef.h:179
bool isMaster()
return whether this is a master-side tunnel or a child
Definition tunneldef.h:194
TunnelDef(void *sPtr)
Access an existing tunnel Child creates the TunnelDef, reads the shmSize, and then resizes its map ac...
Definition tunneldef.h:81
TunnelDef(size_t numBuffers, size_t bufferSize, uint32_t expectedChildren)
Create a new tunnel.
Definition tunneldef.h:66
bool readMessageNB(size_t buffer, MsgType *result)
Read data from buffer, non-blocking.
Definition tunneldef.h:186
void shutdown()
Clean up a region.
Definition tunneldef.h:147
void clearBuffer(size_t buffer)
Empty the messages in a buffer.
Definition tunneldef.h:191
ShareDataType * getSharedData()
return a pointer to the ShareDataType region
Definition tunneldef.h:167
size_t getTunnelSize()
return size of tunnel
Definition tunneldef.h:164
int * sharedData
Definition tunneldef.h:228
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:94
size_t getNumBuffers()
Return the number of buffers.
Definition tunneldef.h:231
Definition tunneldef.h:35