summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/interprocess/example/doc_ipc_message.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/interprocess/example/doc_ipc_message.cpp')
-rw-r--r--src/boost/libs/interprocess/example/doc_ipc_message.cpp106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/boost/libs/interprocess/example/doc_ipc_message.cpp b/src/boost/libs/interprocess/example/doc_ipc_message.cpp
new file mode 100644
index 00000000..9e52e9fb
--- /dev/null
+++ b/src/boost/libs/interprocess/example/doc_ipc_message.cpp
@@ -0,0 +1,106 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2006-2012. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/interprocess for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#include <boost/interprocess/detail/config_begin.hpp>
+#include <boost/interprocess/detail/workaround.hpp>
+//[doc_ipc_message
+#include <boost/interprocess/managed_shared_memory.hpp>
+#include <cstdlib> //std::system
+#include <sstream>
+//<-
+#include "../test/get_process_id_name.hpp"
+//->
+
+int main (int argc, char *argv[])
+{
+ using namespace boost::interprocess;
+ if(argc == 1){ //Parent process
+ //Remove shared memory on construction and destruction
+ struct shm_remove
+ {
+ //<-
+ #if 1
+ shm_remove() { shared_memory_object::remove(test::get_process_id_name()); }
+ ~shm_remove(){ shared_memory_object::remove(test::get_process_id_name()); }
+ #else
+ //->
+ shm_remove() { shared_memory_object::remove("MySharedMemory"); }
+ ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
+ //<-
+ #endif
+ //->
+ } remover;
+ //<-
+ (void)remover;
+ //->
+
+ //Create a managed shared memory segment
+ //<-
+ #if 1
+ managed_shared_memory segment(create_only, test::get_process_id_name(), 65536);
+ #else
+ //->
+ managed_shared_memory segment(create_only, "MySharedMemory", 65536);
+ //<-
+ #endif
+ //->
+
+ //Allocate a portion of the segment (raw memory)
+ managed_shared_memory::size_type free_memory = segment.get_free_memory();
+ void * shptr = segment.allocate(1024/*bytes to allocate*/);
+
+ //Check invariant
+ if(free_memory <= segment.get_free_memory())
+ return 1;
+
+ //An handle from the base address can identify any byte of the shared
+ //memory segment even if it is mapped in different base addresses
+ managed_shared_memory::handle_t handle = segment.get_handle_from_address(shptr);
+ std::stringstream s;
+ s << argv[0] << " " << handle;
+ //<-
+ s << " " << test::get_process_id_name();
+ //->
+ s << std::ends;
+ //Launch child process
+ if(0 != std::system(s.str().c_str()))
+ return 1;
+ //Check memory has been freed
+ if(free_memory != segment.get_free_memory())
+ return 1;
+ }
+ else{
+ //Open managed segment
+ //<-
+ #if 1
+ managed_shared_memory segment(open_only, argv[2]);
+ #else
+ //->
+ managed_shared_memory segment(open_only, "MySharedMemory");
+ //<-
+ #endif
+ //->
+
+ //An handle from the base address can identify any byte of the shared
+ //memory segment even if it is mapped in different base addresses
+ managed_shared_memory::handle_t handle = 0;
+
+ //Obtain handle value
+ std::stringstream s; s << argv[1]; s >> handle;
+
+ //Get buffer local address from handle
+ void *msg = segment.get_address_from_handle(handle);
+
+ //Deallocate previously allocated memory
+ segment.deallocate(msg);
+ }
+ return 0;
+}
+//]
+#include <boost/interprocess/detail/config_end.hpp>