21#include <fairlogger/Logger.h>
26#include <boost/interprocess/managed_external_buffer.hpp>
27#include <boost/interprocess/allocators/allocator.hpp>
32using namespace boost::interprocess;
44ShmManager::ShmManager() =
default;
46void* ShmManager::tryAttach(
bool& success)
55 LOG(info) <<
"FOUND ID TO ATTACH " << mShmID;
64 addr_wanted = (
void*)atoll(addrstr);
69 LOG(info) <<
"TRYING ADDRESS " << addr_wanted;
70 auto addr = shmat(mShmID, addr_wanted, 0);
71 if (addr != (
void*)-1) {
73 assert(addr == addr_wanted);
81 addr = shmat(mShmID,
nullptr, 0);
82 if (addr == (
void*)(-1)) {
83 LOG(fatal) <<
"SHOULD NOT HAPPEN";
90 mSegInfoPtr =
nullptr;
100 LOG(info) <<
"ATTACHED WORKERS " << mSegInfoPtr->
counter;
101 LOG(info) <<
"CONNECTION FAILURES " << mSegInfoPtr->
failures;
103 LOG(info) <<
"no segment info to print";
112 LOG(warn) <<
"A SEGMENT IS ALREADY INITIALIZED";
118 LOG(warn) <<
"A SEGMET IS ALREADY PRESENT ON THE SYSTEM";
123 LOG(info) <<
"CREATING SIM SHARED MEM SEGMENT FOR " << nsegments <<
" WORKERS";
126 if ((mShmID = shmget(IPC_PRIVATE, totalsize, IPC_CREAT | 0666)) == -1) {
127 perror(
"shmget: shmget failed");
131 auto addr = shmat(mShmID,
nullptr, 0);
133 LOG(
debug) <<
"COMMON ADDRESS " << addr <<
" AS NUMBER " << (
unsigned long long)addr;
137 std::memcpy(addr, &info,
sizeof(info));
148 LOG(info) <<
"SHARED MEM INITIALIZED AT ID " << mShmID;
150 LOG(warn) <<
"COULD NOT CREATE SHARED MEMORY ... FALLING BACK TO SIMPLE MODE";
160 LOG(info) <<
"OCCUPYING A SEGMENT IN A SHARED REGION";
163 LOG(warn) <<
"NO INFORMATION ABOUT SHARED SEGMENT FOUND";
168 LOG(warn) <<
"REGION ALREADY OCCUPIED OR CREATED";
179 LOG(info) <<
"OCCUPYING A SEGMENT IN A SHARED REGION";
182 LOG(warn) <<
"NO INFORMATION ABOUT SHARED SEGMENT FOUND";
187 LOG(warn) <<
"REGION ALREADY OCCUPIED OR CREATED";
192 auto addr = tryAttach(
b);
196 const int segmentcounter = info->
counter.fetch_add(1);
197 LOG(info) <<
"SEGMENTCOUNT " << segmentcounter;
200 mBufferPtr = (
void*)(((
char*)addr) + offset_in_bytes);
202 assert((
unsigned long long)((
char*)mBufferPtr - (
char*)addr) + SHMPOOLSIZE <= info->allocedbytes);
204 boostmanagedbuffer =
new boost::interprocess::wmanaged_external_buffer(create_only, mBufferPtr,
SHMPOOLSIZE);
205 boostallocator =
new boost::interprocess::allocator<char, wmanaged_external_buffer::segment_manager>(
206 boostmanagedbuffer->get_segment_manager());
208 LOG(info) <<
"SHARED MEM OCCUPIED AT ID " << mShmID <<
" AND SEGMENT COUNTER " << segmentcounter;
210 LOG(info) <<
"ATTACH NOT SUCCESSFUL";
214ShmManager::~ShmManager()
223 void* addr =
nullptr;
225 addr = (
void*)boostallocator->allocate(
size).get();
226 }
catch (
const std::exception& e) {
227 LOG(fatal) <<
"THROW IN BOOST SHM ALLOCATION";
234 boostallocator->deallocate((
char*)
ptr, s);
241 LOG(
debug) <<
"REMOVING SHARED MEM SEGMENT ID " << mShmID;
243 shmctl(mShmID, IPC_RMID,
nullptr);
void * getmemblock(size_t size)
void printSegInfo() const
void freememblock(void *, std::size_t=1)
bool attachToGlobalSegment()
bool createGlobalSegment(int nsubsegments=1)
GLboolean GLboolean GLboolean b
constexpr size_t SHMPOOLSIZE
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
std::string to_string(gsl::span< T, Size > span)
Common utility functions.
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"