/Src/Dependencies/Boost/boost/interprocess/anonymous_shared_memory.hpp
http://hadesmem.googlecode.com/ · C++ Header · 119 lines · 78 code · 21 blank · 20 comment · 9 complexity · 26e62814f718a1409f09a280ac4fbb6a MD5 · raw file
- //////////////////////////////////////////////////////////////////////////////
- //
- // (C) Copyright Ion Gaztanaga 2005-2009. 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.
- //
- //////////////////////////////////////////////////////////////////////////////
- #ifndef BOOST_INTERPROCESS_ANONYMOUS_SHARED_MEMORY_HPP
- #define BOOST_INTERPROCESS_ANONYMOUS_SHARED_MEMORY_HPP
- #include <boost/interprocess/detail/config_begin.hpp>
- #include <boost/interprocess/detail/workaround.hpp>
- #include <boost/interprocess/creation_tags.hpp>
- #include <boost/interprocess/detail/move.hpp>
- #include <boost/interprocess/interprocess_fwd.hpp>
- #include <boost/interprocess/mapped_region.hpp>
- #include <cstddef>
- #if (!defined(BOOST_INTERPROCESS_WINDOWS))
- # include <fcntl.h> //open, O_CREAT, O_*...
- # include <sys/mman.h> //mmap
- # include <sys/stat.h> //mode_t, S_IRWXG, S_IRWXO, S_IRWXU,
- #else
- #include <boost/interprocess/windows_shared_memory.hpp>
- #endif
- //!\file
- //!Describes a function that creates anonymous shared memory that can be
- //!shared between forked processes
- namespace boost {
- namespace interprocess {
- /// @cond
- namespace detail{
- class raw_mapped_region_creator
- {
- public:
- static mapped_region
- create_posix_mapped_region(void *address, offset_t offset, std::size_t size)
- {
- mapped_region region;
- region.m_base = address;
- region.m_offset = offset;
- region.m_extra_offset = 0;
- region.m_size = size;
- return region;
- }
- };
- }
- /// @endcond
- //!A function that creates an anonymous shared memory segment of size "size".
- //!If "address" is passed the function will try to map the segment in that address.
- //!Otherwise the operating system will choose the mapping address.
- //!The function returns a mapped_region holding that segment or throws
- //!interprocess_exception if the function fails.
- //static mapped_region
- static mapped_region
- anonymous_shared_memory(std::size_t size, void *address = 0)
- #if (!defined(BOOST_INTERPROCESS_WINDOWS))
- {
- int flags;
- int fd = -1;
- #if defined(MAP_ANONYMOUS) //Use MAP_ANONYMOUS
- flags = MAP_ANONYMOUS | MAP_SHARED;
- #elif !defined(MAP_ANONYMOUS) && defined(MAP_ANON) //use MAP_ANON
- flags = MAP_ANON | MAP_SHARED;
- #else // Use "/dev/zero"
- fd = open("/dev/zero", O_RDWR);
- flags = MAP_SHARED;
- if(fd == -1){
- error_info err = system_error_code();
- throw interprocess_exception(err);
- }
- #endif
- address = mmap( address
- , size
- , PROT_READ|PROT_WRITE
- , flags
- , fd
- , 0);
- if(address == MAP_FAILED){
- if(fd != -1)
- close(fd);
- error_info err = system_error_code();
- throw interprocess_exception(err);
- }
- if(fd != -1)
- close(fd);
- return detail::raw_mapped_region_creator::create_posix_mapped_region(address, 0, size);
- }
- #else
- {
- windows_shared_memory anonymous_mapping(create_only, 0, read_write, size);
- return mapped_region(anonymous_mapping, read_write, 0, size, address);
- }
- #endif
- } //namespace interprocess {
- } //namespace boost {
- #include <boost/interprocess/detail/config_end.hpp>
- #endif //BOOST_INTERPROCESS_ANONYMOUS_SHARED_MEMORY_HPP