$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r65861 - in trunk/boost/interprocess: . detail
From: igaztanaga_at_[hidden]
Date: 2010-10-09 12:31:38
Author: igaztanaga
Date: 2010-10-09 12:31:36 EDT (Sat, 09 Oct 2010)
New Revision: 65861
URL: http://svn.boost.org/trac/boost/changeset/65861
Log:
Workaround for shared memory and FreeBsd jails
Text files modified: 
   trunk/boost/interprocess/detail/intermodule_singleton.hpp |    31 ++++++++++++++--------                  
   trunk/boost/interprocess/detail/workaround.hpp            |     2 +                                       
   trunk/boost/interprocess/shared_memory_object.hpp         |    55 +++++++++++++++++++++++++++++++++++---- 
   3 files changed, 71 insertions(+), 17 deletions(-)
Modified: trunk/boost/interprocess/detail/intermodule_singleton.hpp
==============================================================================
--- trunk/boost/interprocess/detail/intermodule_singleton.hpp	(original)
+++ trunk/boost/interprocess/detail/intermodule_singleton.hpp	2010-10-09 12:31:36 EDT (Sat, 09 Oct 2010)
@@ -37,7 +37,7 @@
 #include <sys/stat.h>
 #include <errno.h>
 
-#if (defined BOOST_INTERPROCESS_WINDOWS)
+#if defined (BOOST_INTERPROCESS_WINDOWS)
 #include <fcntl.h>
 #include <io.h>
 
@@ -433,7 +433,7 @@
 
    void operator()()
    {
-      locking_file_serial_id *pserial_id = shm_.find<locking_file_serial_id>("lock_file_fd").first;
+      locking_file_serial_id *pserial_id = shm_.template find<locking_file_serial_id>("lock_file_fd").first;
       if(pserial_id){
          pserial_id->fd = GMemMarkToBeRemoved;
       }
@@ -507,7 +507,7 @@
 
       //First find the file locking descriptor id
       locking_file_serial_id *pserial_id =
-         mshm.find<locking_file_serial_id>("lock_file_fd").first;
+         mshm.template find<locking_file_serial_id>("lock_file_fd").first;
 
       int fd;
       //If not found schedule a creation
@@ -570,7 +570,7 @@
    private:
    locking_file_serial_id * register_lock_file(int fd)
    {
-      locking_file_serial_id *pinfo = mshm.construct<locking_file_serial_id>("lock_file_fd")();
+      locking_file_serial_id *pinfo = mshm.template construct<locking_file_serial_id>("lock_file_fd")();
       fill_file_serial_id(fd, *pinfo);
       return pinfo;
    }
@@ -580,7 +580,9 @@
    bool retry_with_new_shm;
 };
 
-template <>
+#if defined (BOOST_INTERPROCESS_WINDOWS)
+
+template<>
 struct lock_file_logic<managed_windows_shared_memory>
 {
    lock_file_logic(managed_windows_shared_memory &)
@@ -591,6 +593,8 @@
    const bool retry_with_new_shm;
 };
 
+#endif
+
 }  //namespace intermodule_singleton_helpers {
 
 //This class contains common code for all singleton types, so that we instantiate this
@@ -632,7 +636,8 @@
       return *static_cast<ManagedShMem *>(static_cast<void *>(&shm_mem));
    }
 
-   static const std::size_t MemSize = ((sizeof(ManagedShMem)-1)/sizeof(max_align))+1u;
+   enum { MemSize = ((sizeof(ManagedShMem)-1)/sizeof(max_align))+1u };
+
    static void initialize_shm();
    static void destroy_shm();
    //Static data, zero-initalized without any dependencies
@@ -709,7 +714,7 @@
    void operator()()
    {
       intermodule_singleton_helpers::locking_file_serial_id *pserial_id =
-         mshm_.find<intermodule_singleton_helpers::locking_file_serial_id>
+         mshm_.template find<intermodule_singleton_helpers::locking_file_serial_id>
             ("lock_file_fd").first;
       BOOST_ASSERT(0 != pserial_id);
       if(1 == atomic_dec32(&pserial_id->modules_attached_to_gmem_count)){
@@ -728,6 +733,8 @@
    ManagedShMem &mshm_;
 };
 
+#if defined (BOOST_INTERPROCESS_WINDOWS)
+
 template<>
 struct unlink_shmlogic<managed_windows_shared_memory>
 {
@@ -736,6 +743,8 @@
    void operator()(){}
 };
 
+#endif
+
 
 template<class ManagedShMem>
 void intermodule_singleton_common<ManagedShMem>::destroy_shm()
@@ -913,11 +922,11 @@
 
       void operator()()
       {
-         ref_count_ptr *rcount = mshm.find<ref_count_ptr>(unique_instance).first;
+         ref_count_ptr *rcount = mshm.template find<ref_count_ptr>(unique_instance).first;
          if(!rcount){
             C *p = new C();
             try{
-               rcount = mshm.construct<ref_count_ptr>(unique_instance)(p, 0u);
+               rcount = mshm.template construct<ref_count_ptr>(unique_instance)(p, 0u);
             }
             catch(...){
                delete p;
@@ -941,7 +950,7 @@
 
       void operator()()
       {
-         ref_count_ptr *rcount = mshm.find<ref_count_ptr>(unique_instance).first;
+         ref_count_ptr *rcount = mshm.template find<ref_count_ptr>(unique_instance).first;
             //The object must exist
          BOOST_ASSERT(rcount);
          //Check if last reference
@@ -950,7 +959,7 @@
             BOOST_ASSERT(rcount->ptr != 0);
             delete rcount->ptr;
             //Now destroy shm entry
-            bool destroyed = mshm.destroy<ref_count_ptr>(unique_instance);
+            bool destroyed = mshm.template destroy<ref_count_ptr>(unique_instance);
             (void)destroyed;  BOOST_ASSERT(destroyed == true);
          }
       }
Modified: trunk/boost/interprocess/detail/workaround.hpp
==============================================================================
--- trunk/boost/interprocess/detail/workaround.hpp	(original)
+++ trunk/boost/interprocess/detail/workaround.hpp	2010-10-09 12:31:36 EDT (Sat, 09 Oct 2010)
@@ -101,6 +101,8 @@
       //          hp-ux               tru64               vms               freebsd
       #if defined(__hpux) || defined(__osf__) || defined(__vms) || (defined(__FreeBSD__) && (__FreeBSD__ < 7)) 
       #define BOOST_INTERPROCESS_FILESYSTEM_BASED_POSIX_SHARED_MEMORY
+      #elif defined(__FreeBSD__)
+      #define BOOST_INTERPROCESS_RUNTIME_FILESYSTEM_BASED_POSIX_SHARED_MEMORY
       #endif
    #endif
 
Modified: trunk/boost/interprocess/shared_memory_object.hpp
==============================================================================
--- trunk/boost/interprocess/shared_memory_object.hpp	(original)
+++ trunk/boost/interprocess/shared_memory_object.hpp	2010-10-09 12:31:36 EDT (Sat, 09 Oct 2010)
@@ -32,6 +32,11 @@
 #  include <sys/mman.h>     //shm_xxx
 #  include <unistd.h>       //ftruncate, close
 #  include <sys/stat.h>     //mode_t, S_IRWXG, S_IRWXO, S_IRWXU,
+#  if defined(BOOST_INTERPROCESS_RUNTIME_FILESYSTEM_BASED_POSIX_SHARED_MEMORY)
+#     if defined(__FreeBSD__)
+#        include <sys/sysctl.h>
+#     endif
+#  endif
 #else
 //
 #endif
@@ -240,16 +245,46 @@
 
 #else //!defined(BOOST_INTERPROCESS_POSIX_SHARED_MEMORY_OBJECTS)
 
+namespace shared_memory_object_detail {
+
+#ifdef BOOST_INTERPROCESS_RUNTIME_FILESYSTEM_BASED_POSIX_SHARED_MEMORY
+
+#if defined(__FreeBSD__)
+
+inline bool use_filesistem_based_posix()
+{
+   int jailed = 0;
+   std::size_t len = sizeof(jailed);
+   ::sysctlbyname("security.jail.jailed", &jailed, &len, NULL, 0);
+   return jailed != 0;
+}
+
+#else
+#error "Not supported platform for BOOST_INTERPROCESS_RUNTIME_FILESYSTEM_BASED_POSIX_SHARED_MEMORY"
+#endif
+
+#endif
+
+}  //shared_memory_object_detail
+
 inline bool shared_memory_object::priv_open_or_create
    (detail::create_enum_t type, 
     const char *filename,
     mode_t mode, const permissions &perm)
 {
-   #ifndef BOOST_INTERPROCESS_FILESYSTEM_BASED_POSIX_SHARED_MEMORY
-   detail::add_leading_slash(filename, m_filename);
+   #if defined(BOOST_INTERPROCESS_FILESYSTEM_BASED_POSIX_SHARED_MEMORY)
+   const bool add_leading_slash = false;
+   #elif defined(BOOST_INTERPROCESS_RUNTIME_FILESYSTEM_BASED_POSIX_SHARED_MEMORY)
+   const bool add_leading_slash = !shared_memory_object_detail::use_filesistem_based_posix();
    #else
-   detail::create_tmp_and_clean_old_and_get_filename(filename, m_filename);
+   const bool add_leading_slash = true;
    #endif
+   if(add_leading_slash){
+      detail::add_leading_slash(filename, m_filename);
+   }
+   else{
+      detail::create_tmp_and_clean_old_and_get_filename(filename, m_filename);
+   }
 
    //Create new mapping
    int oflag = 0;
@@ -304,11 +339,19 @@
 {
    try{
       std::string file_str;
-      #ifndef BOOST_INTERPROCESS_FILESYSTEM_BASED_POSIX_SHARED_MEMORY
-      detail::add_leading_slash(filename, file_str);
+      #if defined(BOOST_INTERPROCESS_FILESYSTEM_BASED_POSIX_SHARED_MEMORY)
+      const bool add_leading_slash = false;
+      #elif defined(BOOST_INTERPROCESS_RUNTIME_FILESYSTEM_BASED_POSIX_SHARED_MEMORY)
+      const bool add_leading_slash = !shared_memory_object_detail::use_filesistem_based_posix();
       #else
-      detail::tmp_filename(filename, file_str);
+      const bool add_leading_slash = true;
       #endif
+      if(add_leading_slash){
+         detail::add_leading_slash(filename, file_str);
+      }
+      else{
+         detail::tmp_filename(filename, file_str);
+      }
       return 0 == shm_unlink(file_str.c_str());
    }
    catch(...){