1 //////////////////////////////////////////////////////////////////////////////
2 //
3 // (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the Boost
4 // Software License, Version 1.0. (See accompanying file
5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 // See http://www.boost.org/libs/interprocess for documentation.
8 //
9 //////////////////////////////////////////////////////////////////////////////
10 
11 #ifndef BOOST_INTERPROCESS_FWD_HPP
12 #define BOOST_INTERPROCESS_FWD_HPP
13 
14 #ifndef BOOST_CONFIG_HPP
15 #  include <boost/config.hpp>
16 #endif
17 #ifndef BOOST_CSTDINT_HPP
18 #  include <boost/cstdint.hpp>
19 #endif
20 #
21 #if defined(BOOST_HAS_PRAGMA_ONCE)
22 #  pragma once
23 #endif
24 
25 #include <boost/interprocess/detail/std_fwd.hpp>
26 
27 //! \file
28 //! This header file forward declares the basic interprocess types:
29 //!   - boost::interprocess::offset_ptr;
30 //!   - boost::interprocess::permissions;
31 //!   - boost::interprocess::mapped_region;
32 //!   - boost::interprocess::file_mapping;
33 //!   - boost::interprocess::shared_memory_object;
34 //!   - boost::interprocess::windows_shared_memory;
35 //!   - boost::interprocess::xsi_shared_memory;
36 //!
37 //! The following synchronization mechanisms and locks:
38 //!   - boost::interprocess::null_mutex;
39 //!   - boost::interprocess::interprocess_mutex;
40 //!   - boost::interprocess::interprocess_recursive_mutex;
41 //!   - boost::interprocess::interprocess_semaphore;
42 //!   - boost::interprocess::named_mutex;
43 //!   - boost::interprocess::named_recursive_mutex;
44 //!   - boost::interprocess::named_semaphore;
45 //!   - boost::interprocess::interprocess_sharable_mutex;
46 //!   - boost::interprocess::interprocess_condition;
47 //!   - boost::interprocess::scoped_lock;
48 //!   - boost::interprocess::sharable_lock;
49 //!   - boost::interprocess::upgradable_lock;
50 //!
51 //! The following mutex families:
52 //!   - boost::interprocess::mutex_family;
53 //!   - boost::interprocess::null_mutex_family;
54 //!
55 //! The following allocators:
56 //!   - boost::interprocess::allocator;
57 //!   - boost::interprocess::node_allocator;
58 //!   - boost::interprocess::private_node_allocator;
59 //!   - boost::interprocess::cached_node_allocator;
60 //!   - boost::interprocess::adaptive_pool;
61 //!   - boost::interprocess::private_adaptive_pool;
62 //!   - boost::interprocess::cached_adaptive_pool;
63 //!
64 //! The following allocation algorithms:
65 //!   - boost::interprocess::simple_seq_fit;
66 //!   - boost::interprocess::rbtree_best_fit;
67 //!
68 //! The following index types:
69 //!   - boost::interprocess::flat_map_index;
70 //!   - boost::interprocess::iset_index;
71 //!   - boost::interprocess::iunordered_set_index;
72 //!   - boost::interprocess::map_index;
73 //!   - boost::interprocess::null_index;
74 //!   - boost::interprocess::unordered_map_index;
75 //!
76 //! The following managed memory types:
77 //!   - boost::interprocess::segment_manager;
78 //!   - boost::interprocess::basic_managed_external_buffer
79 //!   - boost::interprocess::managed_external_buffer
80 //!   - boost::interprocess::wmanaged_external_buffer
81 //!   - boost::interprocess::basic_managed_shared_memory
82 //!   - boost::interprocess::managed_shared_memory
83 //!   - boost::interprocess::wmanaged_shared_memory
84 //!   - boost::interprocess::basic_managed_windows_shared_memory
85 //!   - boost::interprocess::managed_windows_shared_memory
86 //!   - boost::interprocess::wmanaged_windows_shared_memory
87 //!   - boost::interprocess::basic_managed_xsi_shared_memory
88 //!   - boost::interprocess::managed_xsi_shared_memory
89 //!   - boost::interprocess::wmanaged_xsi_shared_memory
90 //!   - boost::interprocess::fixed_managed_shared_memory
91 //!   - boost::interprocess::wfixed_managed_shared_memory
92 //!   - boost::interprocess::basic_managed_heap_memory
93 //!   - boost::interprocess::managed_heap_memory
94 //!   - boost::interprocess::wmanaged_heap_memory
95 //!   - boost::interprocess::basic_managed_mapped_file
96 //!   - boost::interprocess::managed_mapped_file
97 //!   - boost::interprocess::wmanaged_mapped_file
98 //!
99 //! The following exception types:
100 //!   - boost::interprocess::interprocess_exception
101 //!   - boost::interprocess::lock_exception
102 //!   - boost::interprocess::bad_alloc
103 //!
104 //! The following stream types:
105 //!   - boost::interprocess::basic_bufferbuf
106 //!   - boost::interprocess::basic_ibufferstream
107 //!   - boost::interprocess::basic_obufferstream
108 //!   - boost::interprocess::basic_bufferstream
109 //!   - boost::interprocess::basic_vectorbuf
110 //!   - boost::interprocess::basic_ivectorstream
111 //!   - boost::interprocess::basic_ovectorstream
112 //!   - boost::interprocess::basic_vectorstream
113 //!
114 //! The following smart pointer types:
115 //!   - boost::interprocess::scoped_ptr
116 //!   - boost::interprocess::intrusive_ptr
117 //!   - boost::interprocess::shared_ptr
118 //!   - boost::interprocess::weak_ptr
119 //!
120 //! The following interprocess communication types:
121 //!   - boost::interprocess::message_queue_t;
122 //!   - boost::interprocess::message_queue;
123 
124 #include <boost/interprocess/detail/config_begin.hpp>
125 #include <boost/interprocess/detail/workaround.hpp>
126 
127 #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
128 
129 #include <cstddef>
130 
131 //////////////////////////////////////////////////////////////////////////////
132 //                        Standard predeclarations
133 //////////////////////////////////////////////////////////////////////////////
134 
135 namespace boost{  namespace intrusive{ }  }
136 namespace boost{  namespace interprocess{ namespace bi = boost::intrusive; }  }
137 
138 namespace boost { namespace interprocess {
139 
140 //////////////////////////////////////////////////////////////////////////////
141 //                            permissions
142 //////////////////////////////////////////////////////////////////////////////
143 
144 class permissions;
145 
146 //////////////////////////////////////////////////////////////////////////////
147 //                            shared_memory
148 //////////////////////////////////////////////////////////////////////////////
149 
150 class shared_memory_object;
151 
152 #if defined (BOOST_INTERPROCESS_WINDOWS)
153 class windows_shared_memory;
154 #endif   //#if defined (BOOST_INTERPROCESS_WINDOWS)
155 
156 #if defined(BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS)
157 class xsi_shared_memory;
158 #endif   //#if defined (BOOST_INTERPROCESS_WINDOWS)
159 
160 //////////////////////////////////////////////////////////////////////////////
161 //              file mapping / mapped region
162 //////////////////////////////////////////////////////////////////////////////
163 
164 class file_mapping;
165 class mapped_region;
166 
167 //////////////////////////////////////////////////////////////////////////////
168 //                               Mutexes
169 //////////////////////////////////////////////////////////////////////////////
170 
171 class null_mutex;
172 
173 class interprocess_mutex;
174 class interprocess_recursive_mutex;
175 
176 class named_mutex;
177 class named_recursive_mutex;
178 
179 class interprocess_semaphore;
180 class named_semaphore;
181 
182 //////////////////////////////////////////////////////////////////////////////
183 //                         Mutex families
184 //////////////////////////////////////////////////////////////////////////////
185 
186 struct mutex_family;
187 struct null_mutex_family;
188 
189 //////////////////////////////////////////////////////////////////////////////
190 //                   Other synchronization classes
191 //////////////////////////////////////////////////////////////////////////////
192 
193 class interprocess_sharable_mutex;
194 class interprocess_condition;
195 
196 //////////////////////////////////////////////////////////////////////////////
197 //                              Locks
198 //////////////////////////////////////////////////////////////////////////////
199 
200 template <class Mutex>
201 class scoped_lock;
202 
203 template <class SharableMutex>
204 class sharable_lock;
205 
206 template <class UpgradableMutex>
207 class upgradable_lock;
208 
209 //////////////////////////////////////////////////////////////////////////////
210 //                      STL compatible allocators
211 //////////////////////////////////////////////////////////////////////////////
212 
213 template<class T, class SegmentManager>
214 class allocator;
215 
216 template<class T, class SegmentManager, std::size_t NodesPerBlock = 64>
217 class node_allocator;
218 
219 template<class T, class SegmentManager, std::size_t NodesPerBlock = 64>
220 class private_node_allocator;
221 
222 template<class T, class SegmentManager, std::size_t NodesPerBlock = 64>
223 class cached_node_allocator;
224 
225 template< class T, class SegmentManager, std::size_t NodesPerBlock = 64
226         , std::size_t MaxFreeBlocks = 2, unsigned char OverheadPercent = 5 >
227 class adaptive_pool;
228 
229 template< class T, class SegmentManager, std::size_t NodesPerBlock = 64
230         , std::size_t MaxFreeBlocks = 2, unsigned char OverheadPercent = 5 >
231 class private_adaptive_pool;
232 
233 template< class T, class SegmentManager, std::size_t NodesPerBlock = 64
234         , std::size_t MaxFreeBlocks = 2, unsigned char OverheadPercent = 5 >
235 class cached_adaptive_pool;
236 
237 
238 //////////////////////////////////////////////////////////////////////////////
239 //                            offset_ptr
240 //////////////////////////////////////////////////////////////////////////////
241 
242 static const std::size_t offset_type_alignment = 0;
243 
244 #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
245 #  ifdef BOOST_HAS_INTPTR_T
246       using ::boost::uintptr_t;
247 #  else
248       typedef std::size_t uintptr_t;
249 #  endif
250 #endif
251 
252 template < class T, class DifferenceType = std::ptrdiff_t
253          , class OffsetType = uintptr_t, std::size_t Alignment = offset_type_alignment>
254 class offset_ptr;
255 
256 //////////////////////////////////////////////////////////////////////////////
257 //                    Memory allocation algorithms
258 //////////////////////////////////////////////////////////////////////////////
259 
260 //Single segment memory allocation algorithms
261 template<class MutexFamily, class VoidMutex = offset_ptr<void> >
262 class simple_seq_fit;
263 
264 template<class MutexFamily, class VoidMutex = offset_ptr<void>, std::size_t MemAlignment = 0>
265 class rbtree_best_fit;
266 
267 //////////////////////////////////////////////////////////////////////////////
268 //                         Index Types
269 //////////////////////////////////////////////////////////////////////////////
270 
271 template<class IndexConfig> class flat_map_index;
272 template<class IndexConfig> class iset_index;
273 template<class IndexConfig> class iunordered_set_index;
274 template<class IndexConfig> class map_index;
275 template<class IndexConfig> class null_index;
276 template<class IndexConfig> class unordered_map_index;
277 
278 //////////////////////////////////////////////////////////////////////////////
279 //                         Segment manager
280 //////////////////////////////////////////////////////////////////////////////
281 
282 template <class CharType
283          ,class MemoryAlgorithm
284          ,template<class IndexConfig> class IndexType>
285 class segment_manager;
286 
287 //////////////////////////////////////////////////////////////////////////////
288 //                  External buffer managed memory classes
289 //////////////////////////////////////////////////////////////////////////////
290 
291 template <class CharType
292          ,class MemoryAlgorithm
293          ,template<class IndexConfig> class IndexType>
294 class basic_managed_external_buffer;
295 
296 typedef basic_managed_external_buffer
297    <char
298    ,rbtree_best_fit<null_mutex_family>
299    ,iset_index>
300 managed_external_buffer;
301 
302 typedef basic_managed_external_buffer
303    <wchar_t
304    ,rbtree_best_fit<null_mutex_family>
305    ,iset_index>
306 wmanaged_external_buffer;
307 
308 //////////////////////////////////////////////////////////////////////////////
309 //                      managed memory classes
310 //////////////////////////////////////////////////////////////////////////////
311 
312 template <class CharType
313          ,class MemoryAlgorithm
314          ,template<class IndexConfig> class IndexType>
315 class basic_managed_shared_memory;
316 
317 typedef basic_managed_shared_memory
318    <char
319    ,rbtree_best_fit<mutex_family>
320    ,iset_index>
321 managed_shared_memory;
322 
323 typedef basic_managed_shared_memory
324    <wchar_t
325    ,rbtree_best_fit<mutex_family>
326    ,iset_index>
327 wmanaged_shared_memory;
328 
329 
330 //////////////////////////////////////////////////////////////////////////////
331 //                      Windows shared memory managed memory classes
332 //////////////////////////////////////////////////////////////////////////////
333 
334 #if defined (BOOST_INTERPROCESS_WINDOWS)
335 
336 template <class CharType
337          ,class MemoryAlgorithm
338          ,template<class IndexConfig> class IndexType>
339 class basic_managed_windows_shared_memory;
340 
341 typedef basic_managed_windows_shared_memory
342    <char
343    ,rbtree_best_fit<mutex_family>
344    ,iset_index>
345 managed_windows_shared_memory;
346 
347 typedef basic_managed_windows_shared_memory
348    <wchar_t
349    ,rbtree_best_fit<mutex_family>
350    ,iset_index>
351 wmanaged_windows_shared_memory;
352 
353 #endif   //#if defined (BOOST_INTERPROCESS_WINDOWS)
354 
355 #if defined(BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS)
356 
357 template <class CharType
358          ,class MemoryAlgorithm
359          ,template<class IndexConfig> class IndexType>
360 class basic_managed_xsi_shared_memory;
361 
362 typedef basic_managed_xsi_shared_memory
363    <char
364    ,rbtree_best_fit<mutex_family>
365    ,iset_index>
366 managed_xsi_shared_memory;
367 
368 typedef basic_managed_xsi_shared_memory
369    <wchar_t
370    ,rbtree_best_fit<mutex_family>
371    ,iset_index>
372 wmanaged_xsi_shared_memory;
373 
374 #endif //#if defined(BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS)
375 
376 //////////////////////////////////////////////////////////////////////////////
377 //                      Fixed address shared memory
378 //////////////////////////////////////////////////////////////////////////////
379 
380 typedef basic_managed_shared_memory
381    <char
382    ,rbtree_best_fit<mutex_family, void*>
383    ,iset_index>
384 fixed_managed_shared_memory;
385 
386 typedef basic_managed_shared_memory
387    <wchar_t
388    ,rbtree_best_fit<mutex_family, void*>
389    ,iset_index>
390 wfixed_managed_shared_memory;
391 
392 //////////////////////////////////////////////////////////////////////////////
393 //                      Heap memory managed memory classes
394 //////////////////////////////////////////////////////////////////////////////
395 
396 template
397    <class CharType
398    ,class MemoryAlgorithm
399    ,template<class IndexConfig> class IndexType>
400 class basic_managed_heap_memory;
401 
402 typedef basic_managed_heap_memory
403    <char
404    ,rbtree_best_fit<null_mutex_family>
405    ,iset_index>
406 managed_heap_memory;
407 
408 typedef basic_managed_heap_memory
409    <wchar_t
410    ,rbtree_best_fit<null_mutex_family>
411    ,iset_index>
412 wmanaged_heap_memory;
413 
414 //////////////////////////////////////////////////////////////////////////////
415 //                         Mapped file managed memory classes
416 //////////////////////////////////////////////////////////////////////////////
417 
418 template
419    <class CharType
420    ,class MemoryAlgorithm
421    ,template<class IndexConfig> class IndexType>
422 class basic_managed_mapped_file;
423 
424 typedef basic_managed_mapped_file
425    <char
426    ,rbtree_best_fit<mutex_family>
427    ,iset_index>
428 managed_mapped_file;
429 
430 typedef basic_managed_mapped_file
431    <wchar_t
432    ,rbtree_best_fit<mutex_family>
433    ,iset_index>
434 wmanaged_mapped_file;
435 
436 //////////////////////////////////////////////////////////////////////////////
437 //                            Exceptions
438 //////////////////////////////////////////////////////////////////////////////
439 
440 class interprocess_exception;
441 class lock_exception;
442 class bad_alloc;
443 
444 //////////////////////////////////////////////////////////////////////////////
445 //                            Bufferstream
446 //////////////////////////////////////////////////////////////////////////////
447 
448 //bufferstream
449 template <class CharT
450          ,class CharTraits = std::char_traits<CharT> >
451 class basic_bufferbuf;
452 
453 template <class CharT
454          ,class CharTraits = std::char_traits<CharT> >
455 class basic_ibufferstream;
456 
457 template <class CharT
458          ,class CharTraits = std::char_traits<CharT> >
459 class basic_obufferstream;
460 
461 template <class CharT
462          ,class CharTraits = std::char_traits<CharT> >
463 class basic_bufferstream;
464 
465 //////////////////////////////////////////////////////////////////////////////
466 //                            Vectorstream
467 //////////////////////////////////////////////////////////////////////////////
468 
469 template <class CharVector
470          ,class CharTraits = std::char_traits<typename CharVector::value_type> >
471 class basic_vectorbuf;
472 
473 template <class CharVector
474          ,class CharTraits = std::char_traits<typename CharVector::value_type> >
475 class basic_ivectorstream;
476 
477 template <class CharVector
478          ,class CharTraits = std::char_traits<typename CharVector::value_type> >
479 class basic_ovectorstream;
480 
481 template <class CharVector
482          ,class CharTraits = std::char_traits<typename CharVector::value_type> >
483 class basic_vectorstream;
484 
485 //////////////////////////////////////////////////////////////////////////////
486 //                             Smart pointers
487 //////////////////////////////////////////////////////////////////////////////
488 
489 template<class T, class Deleter>
490 class scoped_ptr;
491 
492 template<class T, class VoidPointer>
493 class intrusive_ptr;
494 
495 template<class T, class VoidAllocator, class Deleter>
496 class shared_ptr;
497 
498 template<class T, class VoidAllocator, class Deleter>
499 class weak_ptr;
500 
501 //////////////////////////////////////////////////////////////////////////////
502 //                                  IPC
503 //////////////////////////////////////////////////////////////////////////////
504 
505 template<class VoidPointer>
506 class message_queue_t;
507 
508 typedef message_queue_t<offset_ptr<void> > message_queue;
509 
510 }}  //namespace boost { namespace interprocess {
511 
512 #endif   //#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
513 
514 #include <boost/interprocess/detail/config_end.hpp>
515 
516 #endif //#ifndef BOOST_INTERPROCESS_FWD_HPP
517