| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 
 | #include <boost/interprocess/shared_memory_object.hpp>
 #include <boost/interprocess/mapped_region.hpp>
 #include <boost/interprocess/windows_shared_memory.hpp>
 
 #define  USE_WIN_SHARE_MEMORY 0
 
 
 bool ShareMemory::CreateShare(const std::string& key, const std::string& value)
 {
 using namespace boost::interprocess;
 try
 {
 #if USE_WIN_SHARE_MEMORY
 permissions ps;
 ps.set_unrestricted();
 m_impl->wsm = std::make_shared<windows_shared_memory>(boost::interprocess::open_or_create, key.c_str(), read_write, value.length() + 1, ps);
 boost::interprocess::mapped_region region(*m_impl->wsm, read_write);
 std::memset(region.get_address(), 0, region.get_size());
 std::memcpy(region.get_address(), value.c_str(), value.length());
 #else
 permissions ps;
 ps.set_unrestricted();
 shared_memory_object smo(boost::interprocess::open_or_create, key.c_str(), read_write, ps);
 smo.truncate(value.length() + 1);
 boost::interprocess::mapped_region region(smo, read_write);
 std::memset(region.get_address(), 0, region.get_size());
 std::memcpy(region.get_address(), value.c_str(), value.length());
 
 #endif
 return true;
 }
 catch (std::exception& e)
 {
 LOG_ERROR("open or create share memory error %s! %s, %s", e.what(), key.c_str(), value.c_str());
 return false;
 }
 return false;
 }
 
 bool ShareMemory::ReadShare(const std::string& key, std::string& value)
 {
 using namespace boost::interprocess;
 try
 {
 #if USE_WIN_SHARE_MEMORY
 m_impl->wsm = std::make_shared<windows_shared_memory>(open_only, key.c_str(), read_only);
 mapped_region region(*m_impl->wsm, read_only);
 char* port = static_cast<char*>(region.get_address());
 value = port;
 return true;
 #else
 boost::interprocess::shared_memory_object shm(boost::interprocess::open_only, key.c_str(), boost::interprocess::read_only);
 boost::interprocess::mapped_region region(shm, boost::interprocess::read_only);
 char* port = static_cast<char*>(region.get_address());
 value = port;
 
 #endif
 return true;
 }
 catch (std::exception& e)
 {
 LOG_ERROR("read share memory error %s! %s, %s", e.what(), key.c_str(), value.c_str());
 return false;
 }
 return false;
 }
 
 
 |