59 IPCTunnel(uint32_t comp_id,
size_t numBuffers,
size_t bufferSize, uint32_t expectedChildren = 1) :
65 memset(key,
'\0',
sizeof(key));
67 snprintf(key,
sizeof(key),
"/sst_shmem_%u-%" PRIu32
"-%d", getpid(), comp_id, rand());
70 fd = shm_open(filename.c_str(), O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
78 }
while ( (fd < 0) && (errno == EEXIST) );
81 fprintf(stderr,
"Failed to create IPC region '%s': %s\n", filename.c_str(), strerror(errno));
85 shmSize = calculateShmemSize(numBuffers, bufferSize);
86 if ( ftruncate(fd, shmSize) ) {
88 fprintf(stderr,
"Resizing shared file '%s' failed: %s\n", filename.c_str(), strerror(errno));
92 shmPtr = mmap(
nullptr, shmSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
93 if ( shmPtr == MAP_FAILED ) {
95 fprintf(stderr,
"mmap failed: %s\n", strerror(errno));
98 nextAllocPtr = (uint8_t*)shmPtr;
99 memset(shmPtr,
'\0', shmSize);
102 auto resResult = reserveSpace<InternalSharedData>((1 + numBuffers) *
sizeof(
size_t));
103 isd = resResult.second;
104 isd->expectedChildren = expectedChildren;
105 isd->shmSegSize = shmSize;
106 isd->numBuffers = numBuffers;
109 auto shareResult = reserveSpace<ShareDataType>(0);
110 isd->offsets[0] = shareResult.first;
114 const size_t cbSize =
sizeof(MsgType) * bufferSize;
115 for (
size_t c = 0; c < isd->numBuffers; c++ ) {
116 CircBuff_t* cPtr =
nullptr;
118 auto resResult = reserveSpace<CircBuff_t>(cbSize);
119 isd->offsets[1 + c] = resResult.first;
120 cPtr = resResult.second;
121 if ( !cPtr->setBufferSize(bufferSize) ) exit(1);
122 circBuffs.push_back(cPtr);
135 fd = shm_open(region_name.c_str(), O_RDWR, S_IRUSR | S_IWUSR);
136 filename = region_name;
140 fprintf(stderr,
"Failed to open IPC region '%s': %s\n", filename.c_str(), strerror(errno));
144 shmPtr = mmap(
nullptr,
sizeof(InternalSharedData), PROT_READ, MAP_SHARED, fd, 0);
145 if ( shmPtr == MAP_FAILED ) {
147 fprintf(stderr,
"mmap 0 failed: %s\n", strerror(errno));
151 isd = (InternalSharedData*)shmPtr;
152 shmSize = isd->shmSegSize;
153 munmap(shmPtr,
sizeof(InternalSharedData));
155 shmPtr = mmap(
nullptr, shmSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
156 if ( shmPtr == MAP_FAILED ) {
158 fprintf(stderr,
"mmap 1 failed: %s\n", strerror(errno));
161 isd = (InternalSharedData*)shmPtr;
162 sharedData = (ShareDataType*)((uint8_t*)shmPtr + isd->offsets[0]);
164 for (
size_t c = 0; c < isd->numBuffers; c++ ) {
165 circBuffs.push_back((CircBuff_t*)((uint8_t*)shmPtr + isd->offsets[c + 1]));
169 if ( --isd->expectedChildren == 0 ) {
170 shm_unlink(filename.c_str());
222 if ( ((nextAllocPtr + space) - (uint8_t*)shmPtr) > shmSize )
return std::make_pair<size_t, T*>(0,
nullptr);