25 #ifndef INCLUDED_SharedMemory_h_GUID_4EAFB440_5023_439B_9413_0E54BC240DBD 26 #define INCLUDED_SharedMemory_h_GUID_4EAFB440_5023_439B_9413_0E54BC240DBD 30 #define BOOST_CB_DISABLE_DEBUG 33 #define BOOST_DATE_TIME_NO_LIB 37 #include <boost/version.hpp> 38 #if defined(__clang__) && (BOOST_VERSION < 105000) && \ 39 !defined(BOOST_NO_TEMPLATE_ALIASES) 40 #define OSVR_NEEDS_BOOST_CLANG_WORKAROUND 47 #ifdef OSVR_NEEDS_BOOST_CLANG_WORKAROUND 48 #define BOOST_NO_TEMPLATE_ALIASES 50 #include <boost/interprocess/mem_algo/rbtree_best_fit.hpp> 51 #ifdef OSVR_NEEDS_BOOST_CLANG_WORKAROUND 52 #undef BOOST_NO_TEMPLATE_ALIASES 55 #include <boost/interprocess/interprocess_fwd.hpp> 56 #include <boost/interprocess/offset_ptr.hpp> 62 #undef OSVR_USE_PLATFORM_SPECIALIZED_SHM 64 #if defined(BOOST_INTERPROCESS_WINDOWS) 67 #define OSVR_HAVE_WINDOWS_SHM 68 #include <boost/interprocess/managed_windows_shared_memory.hpp> 69 #elif defined(BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS) 71 #undef OSVR_HAVE_XSI_SHM 72 #ifdef OSVR_USE_PLATFORM_SPECIALIZED_SHM 73 #undef OSVR_USE_PLATFORM_SPECIALIZED_SHM 75 #include <boost/interprocess/managed_xsi_shared_memory.hpp> 77 #ifdef OSVR_USE_PLATFORM_SPECIALIZED_SHM 78 #undef OSVR_USE_PLATFORM_SPECIALIZED_SHM 82 #include <boost/interprocess/managed_shared_memory.hpp> 93 typedef int64_t my_ptrdiff;
94 typedef uint64_t my_uintptr;
96 sizeof(my_ptrdiff) ==
sizeof(my_uintptr),
97 "These types must be the same size - the largest " 98 "possible pointer size on a given platform that you want " 100 static_assert(
sizeof(my_ptrdiff) >=
sizeof(::ptrdiff_t),
101 "my_ptrdiff must be at least as big as ptrdiff_t!");
102 static_assert(
sizeof(my_uintptr) >=
sizeof(::uintptr_t),
103 "my_uintptr must be at least as big as uintptr_t!");
105 template <
typename T>
106 using my_offset_ptr =
107 boost::interprocess::offset_ptr<T, my_ptrdiff, my_uintptr>;
110 template <
typename T>
using ipc_offset_ptr = detail::my_offset_ptr<T>;
113 template <
typename T>
114 using ipc_offset_ptr = boost::interprocess::offset_ptr<T>;
117 template <
class MutexFamily>
118 using my_mem_alloc_algo =
119 boost::interprocess::rbtree_best_fit<MutexFamily,
120 ipc_offset_ptr<void> >;
122 template <
class IndexConfig>
123 using index_type = boost::interprocess::iset_index<IndexConfig>;
129 static void remove(
const char *name) {
130 typedef typename ManagedMemory::device_type
device_type;
131 device_type::remove(name);
135 typedef uint8_t SharedMemoryBackendType;
136 static const SharedMemoryBackendType BASIC_MANAGED_SHM_ID = 0;
137 static const SharedMemoryBackendType WINDOWS_MANAGED_SHM_ID = 1;
138 static const SharedMemoryBackendType SYSV_MANAGED_SHM_ID = 2;
140 using basic_managed_shm =
141 boost::interprocess::basic_managed_shared_memory<
142 char, my_mem_alloc_algo<boost::interprocess::mutex_family>,
145 #if defined(OSVR_HAVE_WINDOWS_SHM) 146 using windows_managed_shm =
147 boost::interprocess::basic_managed_windows_shared_memory<
148 char, my_mem_alloc_algo<boost::interprocess::mutex_family>,
150 template <>
struct device_type<windows_managed_shm> {
151 static void remove(
const char *) {}
155 #if defined(OSVR_HAVE_XSI_SHM) 157 using sysv_managed_shm =
158 boost::interprocess::basic_managed_xsi_shared_memory<
159 char, my_mem_alloc_algo<boost::interprocess::mutex_family>,
163 #ifdef OSVR_USE_PLATFORM_SPECIALIZED_SHM 164 #if defined(OSVR_HAVE_WINDOWS_SHM) 165 using default_managed_shm = windows_managed_shm;
166 static const SharedMemoryBackendType DEFAULT_MANAGED_SHM_ID =
167 WINDOWS_MANAGED_SHM_ID;
168 #elif defined(OSVR_HAVE_XSI_SHM) 169 using default_managed_shm = sysv_managed_shm;
170 static const SharedMemoryBackendType DEFAULT_MANAGED_SHM_ID =
174 "Unknown kind of platform-specialized shared memory - this set of conditionals must match the one with the includes above!" 176 #else // !OSVR_USE_PLATFORM_SPECIALIZED_SHM 177 using default_managed_shm = basic_managed_shm;
178 static const SharedMemoryBackendType DEFAULT_MANAGED_SHM_ID =
179 BASIC_MANAGED_SHM_ID;
180 #endif // OSVR_USE_PLATFORM_SPECIALIZED_SHM 184 static const char UNDERSCORE =
'_';
185 std::string ret{input};
188 if (ret.empty() || !std::isalpha(ret[0])) {
192 for (
auto &c : ret) {
193 if (std::isalpha(c) || std::isdigit(c) || UNDERSCORE == c) {
201 using ipc::ipc_offset_ptr;
205 #endif // INCLUDED_SharedMemory_h_GUID_4EAFB440_5023_439B_9413_0E54BC240DBD Handles spatial transformations.
Definition: SerializationTraitExample_Complicated.h:40
Helper function to be able to remove shared memory.
Definition: SharedMemory.h:128
Header wrapping the C99 standard stdint header.
The main namespace for all C++ elements of the framework, internal and external.
Definition: namespace_osvr.dox:3
Definition: newuoa.h:1888
std::string make_name_safe(std::string const &input)
Turns all "unsafe" characters in a name into underscores.
Definition: SharedMemory.h:183