Boost logo

Boost Users :

From: Frank G (freqrecords_at_[hidden])
Date: 2024-02-08 00:44:52


We need named IPC between Rosetta and native apps. In boost this seems not compatible, for example with Native app and we are unable to find the "MAP_FNAME" in find_and_construct on the Rosetta process.
Works fine when each process is on same arch.
 "
typedef boost::interprocess::managed_shared_memory shared_mem;shared_mem*  seg;seg = new shared_mem(boost::interprocess::open_or_create, SHARED_FILENAME, F_MAX_TOTALBUF_SIZE );Img = seg->find_or_construct<imgtype>(MAP_FNAME)();
"
Root cause seems to be MemoryAlgorithm and alignment.This has alignment of 16 for Rosetta and 8 for native.The 8 byte shift seems to be the root cause and I can see this when viewing memory.

Looking deeper over the last few days we can see this from the difference in frontend size (from MemoryAlgorithm):

"boost::interprocess::open_or_create 
This creates different sized frontend (iset_index 8 or 16)for Native vs Rosetta.

frontend is defined from: boost::interprocess::ipcdetail::basic_managed_memory_impl<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index, 16> *const
Then perform segment->find_or_construct<mtstruct>(MAP_FNAME)(); does not work across arch."

Ideally we prefer not to write a bunch of complex custom allocators etc to get this to work with open_or_create and find_or_construct, and hoping there is some simplest solution.
Questions:
how can we workaround this?
Can we force boost::interprocess::open_or_create to use same memory algo for both arch?
Or force alignment to 16 for both arch?



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net