|
Boost-Commit : |
From: igaztanaga_at_[hidden]
Date: 2007-09-26 13:53:06
Author: igaztanaga
Date: 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
New Revision: 39555
URL: http://svn.boost.org/trac/boost/changeset/39555
Log:
Changes introduced by the new intrusive version.
Added:
trunk/libs/interprocess/example/doc_shared_ptr.cpp (contents, props changed)
trunk/libs/interprocess/example/doc_shared_ptr_explicit.cpp (contents, props changed)
trunk/libs/interprocess/example/doc_unique_ptr.cpp (contents, props changed)
trunk/libs/interprocess/proj/to-do.txt (contents, props changed)
Removed:
trunk/libs/interprocess/example/alloc_example.cpp
trunk/libs/interprocess/example/doc_named_conditionA.cpp
trunk/libs/interprocess/example/doc_named_conditionB.cpp
trunk/libs/interprocess/example/named_alloc_example.cpp
trunk/libs/interprocess/example/print_container.hpp
trunk/libs/interprocess/example/printcontainer.hpp
trunk/libs/interprocess/example/process_a_example.cpp
trunk/libs/interprocess/example/process_a_fixed_example.cpp
trunk/libs/interprocess/example/process_b_example.cpp
trunk/libs/interprocess/example/process_b_fixed_example.cpp
trunk/libs/interprocess/proj/vc7ide/ProcessA.vcproj
trunk/libs/interprocess/proj/vc7ide/ProcessAFixed.vcproj
trunk/libs/interprocess/proj/vc7ide/ProcessB.vcproj
trunk/libs/interprocess/proj/vc7ide/ProcessBFixed.vcproj
trunk/libs/interprocess/proj/vc7ide/allocate_ex.vcproj
trunk/libs/interprocess/proj/vc7ide/file_lock_test.vcproj
trunk/libs/interprocess/proj/vc7ide/hash_table_ex.vcproj
trunk/libs/interprocess/proj/vc7ide/intersegment_ptr_test.vcproj
trunk/libs/interprocess/proj/vc7ide/named_allocate_ex.vcproj
trunk/libs/interprocess/proj/vc7ide/read_write_mutex_test.vcproj
trunk/libs/interprocess/proj/vc7ide/sharable_mutex.vcproj
trunk/libs/interprocess/proj/vc7ide/shared_memory_mapping_test.vcproj
trunk/libs/interprocess/test/allocation_test_template.hpp
trunk/libs/interprocess/test/get_compiler_name.hpp
trunk/libs/interprocess/test/printcontainer.hpp
Text files modified:
trunk/libs/interprocess/doc/Jamfile.v2 | 6
trunk/libs/interprocess/doc/interprocess.qbk | 2058 +++++++++++++++++++++------------------
trunk/libs/interprocess/example/doc_managed_multiple_allocation.cpp | 27
trunk/libs/interprocess/example/doc_offset_ptr.cpp | 2
trunk/libs/interprocess/example/doc_vectorstream.cpp | 2
trunk/libs/interprocess/proj/conceptgcc/MakeAll | 70
trunk/libs/interprocess/proj/cygwin/MakeAll | 78
trunk/libs/interprocess/proj/linux/MakeAll | 64
trunk/libs/interprocess/proj/mingw/MakeAll | 70
trunk/libs/interprocess/proj/qnx/MakeAll | 66
trunk/libs/interprocess/proj/vc7ide/Interprocess.sln | 1622 +++++++++++++++---------------
11 files changed, 2125 insertions(+), 1940 deletions(-)
Modified: trunk/libs/interprocess/doc/Jamfile.v2
==============================================================================
--- trunk/libs/interprocess/doc/Jamfile.v2 (original)
+++ trunk/libs/interprocess/doc/Jamfile.v2 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
@@ -26,6 +26,8 @@
<doxygen:param>HIDE_UNDOC_MEMBERS=YES
<doxygen:param>EXTRACT_PRIVATE=NO
<doxygen:param>EXPAND_ONLY_PREDEF=YES
+ <xsl:param>"boost.doxygen.reftitle=\"Boost.Interprocess Reference\""
+ <xsl:param>"boost.doxygen.refid=\"reference\""
;
xml interprocess : interprocess.qbk ;
@@ -36,7 +38,9 @@
:
<xsl:param>boost.root=../../../..
<xsl:param>boost.libraries=../../../../libs/libraries.htm
- <xsl:param>generate.section.toc.level=3
+ <xsl:param>toc.max.depth=1
+ <xsl:param>toc.section.depth=2
<xsl:param>chunk.first.sections=1
+ <xsl:param>chunk.section.depth=2
<dependency>autodoc
;
Modified: trunk/libs/interprocess/doc/interprocess.qbk
==============================================================================
--- trunk/libs/interprocess/doc/interprocess.qbk (original)
+++ trunk/libs/interprocess/doc/interprocess.qbk 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
@@ -48,10 +48,16 @@
[section:introduction_building_interprocess Building Boost.Interprocess]
-There is no need to compile anything to use [*Boost.Interprocess], since it's
+There is no need to compile [*Boost.Interprocess], since it's
a header only library. Just include your Boost header directory in your
compiler include path.
+[*Boost.Interprocess] depends on
+[@http://www.boost.org/libs/date_time/ [*Boost.DateTime]], which needs
+separate compilation. However, the subset used by [*Boost.Interprocess] does
+not need any separate compilation so the user can define `BOOST_DATE_TIME_NO_LIB`
+to avoid Boost from trying to automatically link the [*Boost.DateTime].
+
[endsect]
[section:tested_compilers Tested compilers]
@@ -225,6 +231,7 @@
[[Message queue] [Kernel or Filesystem]]
[[Named mutex] [Kernel or Filesystem]]
[[Named semaphore] [Kernel or Filesystem]]
+ [[Named condition] [Kernel or Filesystem]]
]
As you can see, [*Boost.Interprocess] defines some mechanisms with "Kernel or Filesystem"
@@ -256,8 +263,54 @@
[endsect]
+
+[section:constructors_destructors_and_resource_lifetime
+ Constructors, destructors and lifetime of Interprocess named resources]
+
+Named [*Boost.Interprocess] resources (shared memory, memory mapped files,
+named mutexes/conditions/semaphores) have kernel or filesystem persistency.
+This means that even if all processes that have opened those resources
+end, the resource will still be accesible to be opened again and the resource
+can only be destructed via an explicit to their static member `remove` function.
+This behavior can be easily understood, since it's the same mechanism used
+by functions controlling file opening/creation/erasure:
+
+[table Boost.Interprocess-Filesystem Analogy
+ [[Named Interprocess resource] [Corresponding std file] [Corresponding POSIX operation]]
+ [[Constructor] [std::fstream constructor][open]]
+ [[Destructor] [std::fstream destructor] [close]]
+ [[Member `remove`] [None. `std::remove`] [unlink]]
+]
+
+Now the correspondence between POSIX and Boost.Interprocess
+regarding shared memory and named semaphores:
+
+[table Boost.Interprocess-POSIX shared memory
+ [[`shared_memory_object` operation] [POSIX operation]]
+ [[Constructor] [shm_open]]
+ [[Destructor] [close]]
+ [[Member `remove`] [shm_unlink]]
+]
+
+[table Boost.Interprocess-POSIX named semaphore
+ [[`named_semaphore` operation] [POSIX operation]]
+ [[Constructor] [sem_open]]
+ [[Destructor] [close]]
+ [[Member `remove`] [sem_unlink]]
+]
+
+The most important property is that [*destructors of named resources
+don't remove the resource from the system], they only liberate resources
+allocated by the system for use by the process for the named resource.
+[*To remove the resource from the system the programmer must use
+`remove`].
+
+[endsect]
+
[endsect]
+[section:sharedmemorybetweenprocesses Sharing memory between processes]
+
[section:sharedmemory Shared memory]
[section:shared_memory_what_is What is shared memory?]
@@ -446,6 +499,59 @@
[endsect]
+[section:emulation Emulation for systems without shared memory objects]
+
+[*Boost.Interprocess] provides portable shared memory in terms of POSIX
+semantics. Some operating systems don't support shared memory as defined by
+POSIX:
+
+* Windows operating systems provide shared memory using memory backed by the
+ paging file but the lifetime semantics are different from the ones
+ defined by POSIX (see [link interprocess.sharedmemorybetweenprocesses.sharedmemory.windows_shared_memory
+ Native windows shared memory] section for more information).
+
+* Some UNIX systems don't support shared memory objects at all. MacOS is
+ one of these operating systems.
+
+In those platforms, shared memory is emulated with mapped files created
+in the temporary files directory. Because of this emulation, shared memory
+has filesystem lifetime in those systems.
+
+[endsect]
+
+[section:removing Removing shared memory]
+
+[classref boost::interprocess::shared_memory_object shared_memory_object]
+provides an static `remove` function to remove a shared memory objects.
+
+This function [*can] fail if the shared memory objects does not exist or
+it's opened by another process. Note that this function is similar to the
+standard C `int remove(const char *path)` function. In UNIX systems,
+`shared_memory_object::remove` calls `shm_unlink`:
+
+* The function will remove the name of the shared memory object
+named by the string pointed to by name.
+
+* If one or more references to the shared memory object exist when
+is unlinked, the name will be removed before the function returns, but the
+removal of the memory object contents will be postponed until all open and
+map references to the shared memory object have been removed.
+
+* Even if the object continues to exist after the last function call, reuse of
+the name will subsequently cause the creation of a
+[classref boost::interprocess::shared_memory_object] instance to behave as if no
+shared memory object of this name exists (that is, trying to open an object
+with that name will fail and an object of the same name can be created again).
+
+In Windows operating systems, the function fails if the object is being used,
+so a programmer can't consider the UNIX behavior as the portable behavior:
+
+`shared_memory_object::remove` [*can] fail if the shared memory is still in use,
+but this does not mean that it [*will] fail if it's in use. Just the same
+behavior as the standard C (stdio.h) `int remove(const char *path)` function.
+
+[endsect]
+
[section:windows_shared_memory Native windows shared memory]
Windows operating system also offers shared memory, but the lifetime of this
@@ -459,8 +565,8 @@
and Windows operating systems.
However, accessing native windows shared memory is a common request of
-[*Boost.Interprocess] users because they want to access using modern C++
-mechanisms to shared memory created with other process that don't use
+[*Boost.Interprocess] users because they want to access
+to shared memory created with other process that don't use
[*Boost.Interprocess]. In order to manage the native windows shared memory
[*Boost.Interprocess] offers the
[classref boost::interprocess::windows_shared_memory windows_shared_memory] class.
@@ -927,7 +1033,141 @@
[endsect]
-[section:synchronization_mechanisms Synchronization mechanisms overview]
+[endsect]
+
+[section:offset_ptr Mapping Address Independent Pointer: offset_ptr]
+
+When creating shared memory and memory mapped files to communicate two
+processes the memory segment can be mapped in a different address in each process:
+
+[c++]
+
+ #include<boost/interprocess/shared_memory_object.hpp>
+
+ // ...
+
+ using boost::interprocess;
+
+ //Open a shared memory segment
+ shared_memory_object shm_obj
+ (open_only //open or create
+ ,"shared_memory" //name
+ ,read_only //read-only mode
+ );
+
+ //Map the whole shared memory
+ mapped_region region
+ ( shm //Memory-mappable object
+ , read_write //Access mode
+ );
+
+ //This address can be different in each process
+ void *addr = region.get_address();
+
+This difficults the creation of complex objects in mapped regions: a C++
+class instance placed in a mapped region might have a pointer pointing to
+another object also placed in the mapped region. Since the pointer stores an
+absolute address, that address is only valid for the process that placed
+the object there unless all processes map the mapped region in the same
+address.
+
+To be able to simulate pointers in mapped regions, users must use [*offsets]
+(distance between objets) instead of absolute addresses. The offset between
+two objects in a mapped region is the same for any process that maps the
+mapped region, even if that region is placed in different base addreses.
+To facilitate the use of offsets, [*Boost.Interprocess] offers
+[classref boost::interprocess::offset_ptr offset_ptr].
+
+[classref boost::interprocess::offset_ptr offset_ptr]
+wraps all the background operations
+needed to offer a pointer-like interface. The class interface is
+inspired in Boost Smart Pointers and this smart pointer
+stores the offset (distance in bytes)
+between the pointee's address and it's own `this` pointer.
+Imagine an structure in a common
+32 bit processor:
+
+[c++]
+
+ struct structure
+ {
+ int integer1; //The compiler places this at offset 0 in the structure
+ offset_ptr<int> ptr; //The compiler places this at offset 4 in the structure
+ int integer2; //The compiler places this at offset 8 in the structure
+ };
+
+ //...
+
+ structure s;
+
+ //Assign the address of "integer1" to "ptr".
+ //"ptr" will store internally "-4":
+ // (char*)&s.integer1 - (char*)&s.ptr;
+ s.ptr = &s.integer1;
+
+ //Assign the address of "integer2" to "ptr".
+ //"ptr" will store internally "4":
+ // (char*)&s.integer2 - (char*)&s.ptr;
+ s.ptr = &s.integer2;
+
+
+One of the big problems of
+`offset_ptr` is the representation of the null pointer. The null pointer
+can't be safely represented like an offset, since the absolute address 0
+is always outside of the mapped region. Due to the fact that the segment can be mapped
+in a different base address in each process the distance between the address 0
+and `offset_ptr` is different for every process.
+
+Some implementations choose the offset 0 (that is, an `offset_ptr`
+pointing to itself) as the null pointer pointer representation
+but this is not valid for many use cases
+since many times structures like linked lists or nodes from STL containers
+point to themselves (the
+end node in an empty container, for example) and 0 offset value
+is needed. An alternative is to store, in addition to the offset, a boolean
+to indicate if the pointer is null. However, this increments the size of the
+pointer and hurts performance.
+
+In consequence,
+[classref boost::interprocess::offset_ptr offset_ptr] defines offset 1
+as the null pointer, meaning that this class [*can't] point to the byte
+after its own ['this] pointer:
+
+[c++]
+
+ using namespace boost::interprocess;
+
+ offset_ptr<char> ptr;
+
+ //Pointing to the next byte of it's own address
+ //marks the smart pointer as null.
+ ptr = (char*)&ptr + 1;
+
+ //ptr is equal to null
+ assert(!ptr);
+
+ //This is the same as assigning the null value...
+ ptr = 0;
+
+ //ptr is also equal to null
+ assert(!ptr);
+
+
+In practice, this limitation is not important, since a user almost never
+wants to point to this address.
+
+[classref boost::interprocess::offset_ptr offset_ptr]
+offers all pointer-like operations and
+random_access_iterator typedefs, so it can be used in STL
+algorithms requiring random access iterators and detected via traits.
+For more information about the members and operations of the class, see
+[classref boost::interprocess::offset_ptr offset_ptr reference].
+
+[endsect]
+
+[section:synchronization_mechanisms Synchronization mechanisms]
+
+[section:synchronization_mechanisms_overview Synchronization mechanisms overview]
As mentioned before, the ability to shared memory between processes through memory
mapped files or shared memory objects is not very useful if the access to that
@@ -1111,14 +1351,14 @@
#include <boost/interprocess/sync/named_mutex.hpp>
-* [classref boost::interprocess::interprocess_mutex named_mutex]: A non-recursive,
+* [classref boost::interprocess::named_mutex named_mutex]: A non-recursive,
named mutex.
[c++]
#include <boost/interprocess/sync/named_recursive_mutex.hpp>
-* [classref boost::interprocess::interprocess_mutex named_recursive_mutex]: A recursive,
+* [classref boost::interprocess::named_recursive_mutex named_recursive_mutex]: A recursive,
named mutex.
[endsect]
@@ -1657,7 +1897,6 @@
[endsect]
[section:upgradable_mutexes_operations_promotions Promotions]
-
[blurb ['[*void unlock_upgradable_and_lock()]]]
[*Precondition:] The thread must have upgradable ownership of the mutex.
@@ -1665,9 +1904,7 @@
[*Effects:] The thread atomically releases upgradable ownership and acquires exclusive
ownership. This operation will block until all threads with sharable ownership releas it.
-[*Throws:] An exception derived from *interprocess_exception* on error.
-
-[blurb ['[*bool try_unlock_upgradable_and_lock()]]]
+[*Throws:] An exception derived from *interprocess_exception* on error.[blurb ['[*bool try_unlock_upgradable_and_lock()]]]
[*Precondition:] The thread must have upgradable ownership of the mutex.
@@ -1678,9 +1915,7 @@
[*Returns:] If acquires exclusive ownership, returns true. Otherwise
returns false.
-[*Throws:] An exception derived from *interprocess_exception* on error.
-
-[blurb ['[*bool timed_unlock_upgradable_and_lock(const boost::posix_time::ptime &abs_time)]]]
+[*Throws:] An exception derived from *interprocess_exception* on error.[blurb ['[*bool timed_unlock_upgradable_and_lock(const boost::posix_time::ptime &abs_time)]]]
[*Precondition:] The thread must have upgradable ownership of the mutex.
@@ -1692,9 +1927,7 @@
[*Returns:] If acquires exclusive ownership, returns true. Otherwise
returns false.
-[*Throws:] An exception derived from *interprocess_exception* on error.
-
-[blurb ['[*bool try_unlock_sharable_and_lock()]]]
+[*Throws:] An exception derived from *interprocess_exception* on error.[blurb ['[*bool try_unlock_sharable_and_lock()]]]
[*Precondition:] The thread must have sharable ownership of the mutex.
@@ -1705,9 +1938,7 @@
[*Returns:] If acquires exclusive ownership, returns true. Otherwise
returns false.
-[*Throws:] An exception derived from *interprocess_exception* on error.
-
-[blurb ['[*bool try_unlock_sharable_and_lock_upgradable()]]]
+[*Throws:] An exception derived from *interprocess_exception* on error.[blurb ['[*bool try_unlock_sharable_and_lock_upgradable()]]]
[*Precondition:] The thread must have sharable ownership of the mutex.
@@ -1718,11 +1949,7 @@
[*Returns:] If acquires upgradable ownership, returns true. Otherwise
returns false.
-[*Throws:] An exception derived from *interprocess_exception* on error.
-
-[endsect]
-
-[endsect]
+[*Throws:] An exception derived from *interprocess_exception* on error.[endsect][endsect]
[section:upgradable_mutexes_mutex_interprocess_mutexes Boost.Interprocess Upgradable Mutex Types And Headers]
@@ -2200,166 +2427,53 @@
[endsect]
-[section:message_queue Message Queue]
+[section:file_lock File Locks]
-[section:message_queue_whats_a_mq What's A Message Queue?]
+[section:file_lock_whats_a_file_lock What's A File Lock?]
-A message queue is similar to a list of messages. Threads can put messages
-in the queue and they can also remove messages from the queue. Each message
-can have also a [*priority] so that higher priority messages are read before
-lower priority messages. Each message has some attributes:
+A file lock is an interprocess synchronization mechanism to protect concurrent
+writes and reads to files using a mutex ['embedded] in the file. This ['embedded mutex]
+has sharable and exclusive locking capabilities.
+With a file lock, an existing file can be used as a mutex without the need
+of creating additional synchronization objects to control concurrent file
+reads or writes.
-* A priority.
-* The length of the message.
-* The data (if length is bigger than 0).
+Generally speaking, we can have two file locking capabilities:
-A thread can send a message to or receive a message from the message
-queue using 3 methods:
+* [*Advisory locking:] The operating system kernel maintains a list of files that
+ have been locked. But does not prevent writing to those files even if a process
+ has acquired a sharable lock or does not prevent reading from the file when a process
+ has acquired the exclusive lock. Any process can ignore an advisory lock.
+ This means that advisory locks are for [*cooperating] processes,
+ processes that can trust each other. This is similar to a mutex protecting data
+ in a shared memory segment: any process connected to that memory can overwrite the
+ data but [*cooperative] processes use mutexes to protect the data first acquiring
+ the mutex lock.
-* [*Blocking]: If the message queue is full when sending or the message queue
- is empty when receiving, the thread is blocked until there
- is room for a new message or there is a new message.
-* [*Try]: If the message queue is full when sending or the message queue is empty
- when receiving, the thread returns immediately with an error.
-* [*Timed]: If the message queue is full when sending or the message queue is empty
- when receiving, the thread retries the operation until succeeds (returning
- successful state) or a timeout is reached (returning a failure).
+* [*Mandatory locking:] The OS kernel checks every read and write request to verify
+ that the operation can be performed according to the acquired lock. Reads and writes
+ block until the lock is released.
-A message queue [*just copies raw bytes between processes] and does not send
-objects. This means that if we want to send an object using a message queue
-[*the object must be binary serializable]. For example, we can send integers
-between processes but [*not] a `std::string`. You should use [*Boost.Serialization]
-or use advanced [*Boost.Interprocess] mechanisms to send complex data between
-processes.
+[*Boost.Interprocess] implements [*advisory blocking] because of portability reasons.
+This means that every process accessing to a file concurrently, must cooperate using
+file locks to synchronize the access.
-The [*Boost.Interprocess] message queue is a named interprocess communication: the
-message queue is created with a name and it's opened with a name, just like a file.
-When creating a message queue, the user must specify the maximum message size and
-the maximum message number that the message queue can store. These parameters will
-define the resources (for example the size of the shared memory used to implement
-the message queue if shared memory is used).
+In some systems file locking can be even further refined, leading to [*record locking],
+where a user can specify a [*byte range] within the file where the lock is applied.
+This allows concurrent write access by several processes if they need to access a
+different byte range in the file. [*Boost.Interprocess] does [*not] offer record
+locking for the moment, but might offer it in the future. To use a file lock just
+include:
[c++]
- using boost::interprocess;
- //Create a message_queue. If the queue
- //exists throws an exception
- message_queue mq
- (create_only //only create
- ,"message_queue" //name
- ,100 //max message number
- ,100 //max message size
- );
-
-[c++]
+ #include <boost/interprocess/sync/file_lock.hpp>
- using boost::interprocess;
- //Creates or opens a message_queue. If the queue
- //does not exist creates it, otherwise opens it.
- //Message number and size are ignored if the queue
- //is opened
- message_queue mq
- (open_or_create //open or create
- ,"message_queue" //name
- ,100 //max message number
- ,100 //max message size
- );
-
-[c++]
-
- using boost::interprocess;
- //Opens a message_queue. If the queue
- //does not exist throws an exception.
- message_queue mq
- (open_only //only open
- ,"message_queue" //name
- );
-
-The message queue is explicitly removed calling the static `remove` function:
-
-[c++]
-
- using boost::interprocess;
- message_queue::remove("message_queue");
-
-The funtion can fail if the message queue is still being used by any process.
-
-[endsect]
-
-[section:message_queue_example Using a message queue]
-
-To use a message queue you must include the following header:
-
-[c++]
-
- #include <boost/interprocess/ipc/message_queue.hpp>
-
-In the following example, the first process creates the message queue, and writes
-an array of integers on it. The other process just reads the array and checks that
-the sequence number is correct. This is the first process:
-
-[import ../example/doc_message_queueA.cpp]
-[doc_message_queueA]
-
-This is the second process:
-
-[import ../example/doc_message_queueB.cpp]
-[doc_message_queueB]
-
-To know more about this class and all its operations, please see the
-[classref boost::interprocess::message_queue] class reference.
-
-[endsect]
-
-[endsect]
-
-[section:file_lock File Locks]
-
-[section:file_lock_whats_a_file_lock What's A File Lock?]
-
-A file lock is an interprocess synchronization mechanism to protect concurrent
-writes and reads to files using a mutex ['embedded] in the file. This ['embedded mutex]
-has sharable and exclusive locking capabilities.
-With a file lock, an existing file can be used as a mutex without the need
-of creating additional synchronization objects to control concurrent file
-reads or writes.
-
-Generally speaking, we can have two file locking capabilities:
-
-* [*Advisory locking:] The operating system kernel maintains a list of files that
- have been locked. But does not prevent writing to those files even if a process
- has acquired a sharable lock or does not prevent reading from the file when a process
- has acquired the exclusive lock. Any process can ignore an advisory lock.
- This means that advisory locks are for [*cooperating] processes,
- processes that can trust each other. This is similar to a mutex protecting data
- in a shared memory segment: any process connected to that memory can overwrite the
- data but [*cooperative] processes use mutexes to protect the data first acquiring
- the mutex lock.
-
-* [*Mandatory locking:] The OS kernel checks every read and write request to verify
- that the operation can be performed according to the acquired lock. Reads and writes
- block until the lock is released.
-
-[*Boost.Interprocess] implements [*advisory blocking] because of portability reasons.
-This means that every process accessing to a file concurrently, must cooperate using
-file locks to synchronize the access.
-
-In some systems file locking can be even further refined, leading to [*record locking],
-where a user can specify a [*byte range] within the file where the lock is applied.
-This allows concurrent write access by several processes if they need to access a
-different byte range in the file. [*Boost.Interprocess] does [*not] offer record
-locking for the moment, but might offer it in the future. To use a file lock just
-include:
-
-[c++]
-
- #include <boost/interprocess/sync/file_lock.hpp>
-
-A file locking is a class that has [*process lifetime]. This means that if a process
-holding a file lock ends or crashes, the operating system will automatically unlock
-it. This feature is very useful in some situations where we want to assure
-automatic unlocking even when the process crashes and avoid leaving blocked resources
-in the system. A file lock is constructed using the name of the file as an argument:
+A file locking is a class that has [*process lifetime]. This means that if a process
+holding a file lock ends or crashes, the operating system will automatically unlock
+it. This feature is very useful in some situations where we want to assure
+automatic unlocking even when the process crashes and avoid leaving blocked resources
+in the system. A file lock is constructed using the name of the file as an argument:
[c++]
@@ -2615,136 +2729,124 @@
[endsect]
-[section:offset_ptr Mapping Address Independent Pointer: offset_ptr]
+[section:message_queue Message Queue]
-When creating shared memory and memory mapped files to communicate two
-processes. The memory segment can be mapped in different address in each process:
+[section:message_queue_whats_a_mq What's A Message Queue?]
-[c++]
+A message queue is similar to a list of messages. Threads can put messages
+in the queue and they can also remove messages from the queue. Each message
+can have also a [*priority] so that higher priority messages are read before
+lower priority messages. Each message has some attributes:
- #include<boost/interprocess/shared_memory_object.hpp>
+* A priority.
+* The length of the message.
+* The data (if length is bigger than 0).
- // ...
+A thread can send a message to or receive a message from the message
+queue using 3 methods:
- using boost::interprocess;
+* [*Blocking]: If the message queue is full when sending or the message queue
+ is empty when receiving, the thread is blocked until there
+ is room for a new message or there is a new message.
+* [*Try]: If the message queue is full when sending or the message queue is empty
+ when receiving, the thread returns immediately with an error.
+* [*Timed]: If the message queue is full when sending or the message queue is empty
+ when receiving, the thread retries the operation until succeeds (returning
+ successful state) or a timeout is reached (returning a failure).
- //Open a shared memory segment
- shared_memory_object shm_obj
- (open_only //open or create
- ,"shared_memory" //name
- ,read_only //read-only mode
- );
+A message queue [*just copies raw bytes between processes] and does not send
+objects. This means that if we want to send an object using a message queue
+[*the object must be binary serializable]. For example, we can send integers
+between processes but [*not] a `std::string`. You should use [*Boost.Serialization]
+or use advanced [*Boost.Interprocess] mechanisms to send complex data between
+processes.
- //Map the whole shared memory
- mapped_region region
- ( shm //Memory-mappable object
- , read_write //Access mode
- );
+The [*Boost.Interprocess] message queue is a named interprocess communication: the
+message queue is created with a name and it's opened with a name, just like a file.
+When creating a message queue, the user must specify the maximum message size and
+the maximum message number that the message queue can store. These parameters will
+define the resources (for example the size of the shared memory used to implement
+the message queue if shared memory is used).
- //This address can be different in each process
- void *addr = region.get_address();
+[c++]
-This difficults the creation of complex objects in mapped regions: a C++
-class instance placed in a mapped region might have a pointer pointing to
-another object also placed in the mapped region. Since the pointer stores an
-absolute address, that address is only valid for the process that placed
-the object there, unless all processes map the mapped region in the same
-address.
+ using boost::interprocess;
+ //Create a message_queue. If the queue
+ //exists throws an exception
+ message_queue mq
+ (create_only //only create
+ ,"message_queue" //name
+ ,100 //max message number
+ ,100 //max message size
+ );
-To be able to simulate pointers in mapped regions, users must use [*offsets]
-(distance between objets) instead of absolute address. The offset between
-two objects in a mapped region is the same for any process that maps the
-mapped region, even if that region is placed in different base addreses.
-To facilitate the use of offsets, [*Boost.Interprocess] offers
-[classref boost::interprocess::offset_ptr offset_ptr].
+[c++]
-[classref boost::interprocess::offset_ptr offset_ptr]
-wraps all the background operations
-needed to offer a pointer-like interface. The class interface is
-inspired in Boost Smart Pointers and stores the offset (distance in bytes)
-between the pointee's address and the
-[classref boost::interprocess::offset_ptr offset_ptr]'s "this" pointer
-(the address of the offset_ptr itself). Imagine an structure in a common
-32 bit processor:
+ using boost::interprocess;
+ //Creates or opens a message_queue. If the queue
+ //does not exist creates it, otherwise opens it.
+ //Message number and size are ignored if the queue
+ //is opened
+ message_queue mq
+ (open_or_create //open or create
+ ,"message_queue" //name
+ ,100 //max message number
+ ,100 //max message size
+ );
[c++]
- struct structure
- {
- int integer1; //This is placed at offset 0 in the structure
- offset_ptr<int> ptr; //This is placed at offset 4 in the structure
- int integer2; //This is placed at offset 8 in the structure
- };
+ using boost::interprocess;
+ //Opens a message_queue. If the queue
+ //does not exist throws an exception.
+ message_queue mq
+ (open_only //only open
+ ,"message_queue" //name
+ );
- //...
+The message queue is explicitly removed calling the static `remove` function:
- structure s;
-
- //Assign the address of "integer1" to "ptr".
- //"ptr" will store internally "-4":
- // (char*)&s.integer1 - (char*)&s.ptr;
- s.ptr = &s.integer1;
+[c++]
- //Assign the address of "integer2" to "ptr".
- //"ptr" will store internally "4":
- // (char*)&s.integer2 - (char*)&s.ptr;
- s.ptr = &s.integer2;
+ using boost::interprocess;
+ message_queue::remove("message_queue");
+The funtion can fail if the message queue is still being used by any process.
-One of the big problems of
-`offset_ptr` is the representation of the null pointer. The null pointer
-can't be safely represented like an offset, since the 0 absolute address
-is always out of the mapped region and the segment can be mapped
-in a different base address in each process, the distance between the address 0
-and `offset_ptr` is different for every process.
+[endsect]
-Some implementations choose
-0 offset as a null pointer but this is not valid for many uses,
-since many times structures like linked lists or nodes from STL containers
-point to themselves (the
-end node in an empty container, for example), and 0 offset value
-is needed. An alternative is to store, in addition to the offset, a boolean
-to indicate if the pointer is null. However, this increments the size of the
-pointer and hurts performance.
+[section:message_queue_example Using a message queue]
-In consequence,
-[classref boost::interprocess::offset_ptr offset_ptr] defines offset 1
-as the null pointer, meaning that this class [*can't] point to the byte
-after its own ['this] pointer:
+To use a message queue you must include the following header:
[c++]
- using namespace boost::interprocess;
+ #include <boost/interprocess/ipc/message_queue.hpp>
- offset_ptr<char> ptr;
-
- //Pointing to the next byte of it's own address
- //marks the smart pointer as null.
- ptr = (char*)&ptr + 1;
+In the following example, the first process creates the message queue, and writes
+an array of integers on it. The other process just reads the array and checks that
+the sequence number is correct. This is the first process:
- //ptr is equal to null
- assert(!ptr);
+[import ../example/doc_message_queueA.cpp]
+[doc_message_queueA]
- //This is the same as assigning the null value...
- ptr = 0;
+This is the second process:
- //ptr is also equal to null
- assert(!ptr);
+[import ../example/doc_message_queueB.cpp]
+[doc_message_queueB]
+To know more about this class and all its operations, please see the
+[classref boost::interprocess::message_queue] class reference.
-In practice, this limitation is not important, since a user almost never
-wants to point to this address.
+[endsect]
-[classref boost::interprocess::offset_ptr offset_ptr]
-offers all pointer-like operations and
-random_access_iterator typedefs, so it can be used in STL
-algorithms requiring random access and detected via traits.
-For more information about the members and operations of the class, see
-[classref boost::interprocess::offset_ptr offset_ptr reference].
+[endsect]
[endsect]
-[section:managed_memory_segments Managed Memory Segments: Making Interprocess Data Communication Easy]
+[section:managed_memory_segments Managed Memory Segments]
+
+[section:making_ipc_easy Making Interprocess Data Communication Easy]
[section:managed_memory_segments_intro Introduction]
@@ -2850,24 +2952,24 @@
[c++]
- /*!Defines a managed shared memory with c-strings as keys for named objects,
- the default memory algorithm (with process-shared mutexes,
- and offset_ptr as internal pointers) as memory allocation algorithm
- and the default index type as the index.
- This class allows the shared memory to be mapped in different base
- in different processes*/
+ //!Defines a managed shared memory with c-strings as keys for named objects,
+ //!the default memory algorithm (with process-shared mutexes,
+ //!and offset_ptr as internal pointers) as memory allocation algorithm
+ //!and the default index type as the index.
+ //!This class allows the shared memory to be mapped in different base
+ //!in different processes
typedef
basic_managed_shared_memory<char
,/*Default memory algorithm defining offset_ptr<void> as void_pointer*/
,/*Default index type*/>
managed_shared_memory;
- /*!Defines a managed shared memory with wide strings as keys for named objects,
- the default memory algorithm (with process-shared mutexes,
- and offset_ptr as internal pointers) as memory allocation algorithm
- and the default index type as the index.
- This class allows the shared memory to be mapped in different base
- in different processes*/
+ //!Defines a managed shared memory with wide strings as keys for named objects,
+ //!the default memory algorithm (with process-shared mutexes,
+ //!and offset_ptr as internal pointers) as memory allocation algorithm
+ //!and the default index type as the index.
+ //!This class allows the shared memory to be mapped in different base
+ //!in different processes
typedef
basic_managed_shared_memory<wchar_t
,/*Default memory algorithm defining offset_ptr<void> as void_pointer*/
@@ -2885,24 +2987,24 @@
[c++]
- /*!Defines a managed shared memory with c-strings as keys for named objects,
- the default memory algorithm (with process-shared mutexes,
- and offset_ptr as internal pointers) as memory allocation algorithm
- and the default index type as the index.
- This class allows the shared memory to be mapped in different base
- in different processes*/
+ //!Defines a managed shared memory with c-strings as keys for named objects,
+ //!the default memory algorithm (with process-shared mutexes,
+ //!and offset_ptr as internal pointers) as memory allocation algorithm
+ //!and the default index type as the index.
+ //!This class allows the shared memory to be mapped in different base
+ //!in different processes*/
typedef basic_managed_shared_memory
<char
,/*Default memory algorithm defining void * as void_pointer*/
,/*Default index type*/>
fixed_managed_shared_memory;
- /*!Defines a managed shared memory with wide strings as keys for named objects,
- the default memory algorithm (with process-shared mutexes,
- and offset_ptr as internal pointers) as memory allocation algorithm
- and the default index type as the index.
- This class allows the shared memory to be mapped in different base
- in different processes*/
+ //!Defines a managed shared memory with wide strings as keys for named objects,
+ //!the default memory algorithm (with process-shared mutexes,
+ //!and offset_ptr as internal pointers) as memory allocation algorithm
+ //!and the default index type as the index.
+ //!This class allows the shared memory to be mapped in different base
+ //!in different processes
typedef basic_managed_shared_memory
<wchar_t
,/*Default memory algorithm defining void * as void_pointer*/
@@ -2945,11 +3047,7 @@
// to implement managed features.
//!! If anything fails, throws interprocess_exception
//
- managed_shared_memory segment
- (create_only,
- "MySharedMemory", //Shared memory object name
- 65536); //Shared memory object size in bytes
-
+ managed_shared_memory segment (create_only, "MySharedMemory", //Shared memory object name 65536); //Shared memory object size in bytes
[c++]
//1. Opens a shared memory object
@@ -2960,22 +3058,14 @@
// to implement managed features.
//!! If anything fails, throws interprocess_exception
//
- managed_shared_memory segment
- (open_only,
- "MySharedMemory");//Shared memory object name
-
-[c++]
+ managed_shared_memory segment (open_only, "MySharedMemory");//Shared memory object name[c++]
//1. If the segment was previously created
// equivalent to "open_only".
//2. Otherwise, equivalent to "open_only" (size is ignored)
//!! If anything fails, throws interprocess_exception
//
- managed_shared_memory segment
- (open_or_create,
- "MySharedMemory", //Shared memory object name
- 65536); //Shared memory object size in bytes
-
+ managed_shared_memory segment (open_or_create, "MySharedMemory", //Shared memory object name 65536); //Shared memory object size in bytes
When the a `managed_shared_memory` object is destroyed, the shared memory
object is automatically unmapped, and all the resources are freed. To remove
the shared memory object from the system you must use the `shared_memory_object::remove`
@@ -2988,9 +3078,7 @@
[c++]
- fixed_managed_shared_memory segment
- (open_only
- ,"MyFixedAddressSharedMemory" //Shared memory object name
+ fixed_managed_shared_memory segment (open_only ,"MyFixedAddressSharedMemory" //Shared memory object name
,(void*)0x30000000 //Mapping address
[endsect]
@@ -3094,11 +3182,7 @@
// file to implement managed features.
//!! If anything fails, throws interprocess_exception
//
- managed_mapped_file mfile
- (create_only,
- "MyMappedFile", //Mapped file name
- 65536); //Mapped file size
-
+ managed_mapped_file mfile (create_only, "MyMappedFile", //Mapped file name 65536); //Mapped file size
[c++]
//1. Opens a file
@@ -3109,11 +3193,7 @@
// to implement managed features.
//!! If anything fails, throws interprocess_exception
//
- managed_mapped_file mfile
- (open_only,
- "MyMappedFile"); //Mapped file name
-
-[c++]
+ managed_mapped_file mfile (open_only, "MyMappedFile"); //Mapped file name[c++]
//1. If the file was previously created
// equivalent to "open_only".
@@ -3121,11 +3201,7 @@
//
//!! If anything fails, throws interprocess_exception
//
- managed_mapped_file mfile
- (open_or_create,
- "MyMappedFile", //Mapped file name
- 65536); //Mapped file size
-
+ managed_mapped_file mfile (open_or_create, "MyMappedFile", //Mapped file name 65536); //Mapped file size
When the a `managed_mapped_file` object is destroyed, the file is
automatically unmapped, and all the resources are freed. To remove
the file from the filesystem you can use standard C `std::remove`
@@ -3194,39 +3270,39 @@
[c++]
- /*!Allocates and constructs an object of type MyType (throwing version) */
+ //!Allocates and constructs an object of type MyType (throwing version)
MyType *ptr = managed_memory_segment.construct<MyType>("Name") (par1, par2...);
- /*!Allocates and constructs an array of objects of type MyType (throwing version)
- Each object receives the same parameters (par1, par2, ...)*/
+ //!Allocates and constructs an array of objects of type MyType (throwing version)
+ //!Each object receives the same parameters (par1, par2, ...)
MyType *ptr = managed_memory_segment.construct<MyType>("Name")[count](par1, par2...);
- /*!Tries to find a previously created object. If not present, allocates
- and constructs an object of type MyType (throwing version) */
+ //!Tries to find a previously created object. If not present, allocates
+ //!and constructs an object of type MyType (throwing version)
MyType *ptr = managed_memory_segment.find_or_construct<MyType>("Name") (par1, par2...);
- /*!Tries to find a previously created object. If not present, allocates and
- constructs an array of objects of type MyType (throwing version). Each object
- receives the same parameters (par1, par2, ...)*/
+ //!Tries to find a previously created object. If not present, allocates and
+ //!constructs an array of objects of type MyType (throwing version). Each object
+ //!receives the same parameters (par1, par2, ...)
MyType *ptr = managed_memory_segment.find_or_construct<MyType>("Name")[count](par1, par2...);
- /*!Allocates and constructs an array of objects of type MyType (throwing version)
- Each object receives parameters returned with the expression (*it1++, *it2++,... )*/
+ //!Allocates and constructs an array of objects of type MyType (throwing version)
+ //!Each object receives parameters returned with the expression (*it1++, *it2++,... )
MyType *ptr = managed_memory_segment.construct_it<MyType>("Name")[count](it1, it2...);
- /*!Tries to find a previously created object. If not present, allocates and constructs
- an array of objects of type MyType (throwing version). Each object receives
- parameters returned with the expression (*it1++, *it2++,... ) */
+ //!Tries to find a previously created object. If not present, allocates and constructs
+ //!an array of objects of type MyType (throwing version). Each object receives
+ //!parameters returned with the expression (*it1++, *it2++,... )
MyType *ptr = managed_memory_segment.find_or_construct_it<MyType>("Name")[count](it1, it2...);
- /*!Tries to find a previously created object. Returns a pointer to the object and the
- count (if it is not an array, returns 1). If not present, the returned pointer is 0*/
+ //!Tries to find a previously created object. Returns a pointer to the object and the
+ //!count (if it is not an array, returns 1). If not present, the returned pointer is 0
std::pair<MyType *,std::size_t> ret = managed_memory_segment.find<MyType>("Name");
- /*!Destroys the created object, returns false if not present*/
+ //!Destroys the created object, returns false if not present
bool destroyed = managed_memory_segment.destroy<MyType>("Name");
- /*!Destroys the created object via pointer*/
+ //!Destroys the created object via pointer
managed_memory_segment.destroy_ptr(ptr);
All these functions have a non-throwing version, that
@@ -3235,7 +3311,7 @@
[c++]
- /*!Allocates and constructs an object of type MyType (no throwing version) */
+ //!Allocates and constructs an object of type MyType (no throwing version)
MyType *ptr = managed_memory_segment.construct<MyType>("Name", std::nothrow) (par1, par2...);
[endsect]
@@ -3646,27 +3722,7 @@
/[import ../example/doc_managed_multiple_allocation.cpp]
/[doc_managed_multiple_allocation]
/
-/Allocating N buffers of the same size improves the performance of pools
-/and node containers (for example STL-like lists):
-/when inserting a range of forward iterators in a STL-like
-/list, the insertion function can detect the number of needed elements
-/and allocate in a single call. The nodes still can be deallocated.
-/
-/Allocating N buffers of different sizes can be used to speed up allocation in
-/cases where several objects must always be allocated at the same time but
-/deallocated at different times. For example, a class might perform several initial
-/allocations (some header data for a network packet, for example) in its
-/constructor but also allocations of buffers that might be reallocated in the future
-/(the data to be sent through the network). Instead of allocating all the data
-/independently, the constructor might use `allocate_many()` to speed up the
-/initialization, but it still can deallocate and expand the memory of the variable
-/size element.
-/
-/In general, `allocate_many` is useful with large values of N. Overuse
-/of `allocate_many` can increase the effective memory usage,
-/because it can't reuse existing non-contiguous memory fragments that
-/might be available for some of the elements.
-/
+/Allocating N buffers of the same size improves the performance of pools/and node containers (for example STL-like lists):/when inserting a range of forward iterators in a STL-like/list, the insertion function can detect the number of needed elements/and allocate in a single call. The nodes still can be deallocated.//Allocating N buffers of different sizes can be used to speed up allocation in/cases where several objects must always be allocated at the same time but/deallocated at different times. For example, a class might perform several initial/allocations (some header data for a network packet, for example) in its/constructor but also allocations of buffers that might be reallocated in the future/(the data to be sent through the network). Instead of allocating all the data/independently, the constructor might use `allocate_many()` to speed up the/initialization, but it still can deallocate and expand the memory of the variable/size element.//In general, `allocate_many` is useful with large values of N.
Overuse/of `allocate_many` can increase the effective memory usage,/because it can't reuse existing non-contiguous memory fragments that/might be available for some of the elements./
/[endsect]
]
@@ -3834,6 +3890,215 @@
[endsect]
+[section:managed_heap_memory_external_buffer Managed Heap Memory And Managed External Buffer]
+
+[*Boost.Interprocess] offers managed shared memory between processes using
+`managed_shared_memory` or `managed_mapped_file`. Two processes just map the same
+the memory mappable resoure and read from and write to that object.
+
+Many times, we don't want to use that shared memory approach and we prefer
+to send serialized data through network, local socket or message queues. Serialization
+can be done through [*Boost.Serialization] or similar library. However, if two processes
+share the same ABI (application binary interface), we could use the same object and
+container construction capabilities of `managed_shared_memory` or `managed_heap_memory`
+to build all the information in a single buffer that will be sent, for example,
+though message queues. The receiver would just copy the data to a local buffer, and it
+could read or modify it directly without deserializing the data . This approach can be
+much more efficient that a complex serialization mechanism.
+
+Applications for [*Boost.Interprocess] services using non-shared memory buffers:
+
+* Create and use STL compatible containers and allocators,
+ in systems where dynamic memory is not recommendable.
+
+* Build complex, easily serializable databases in a single buffer:
+
+ * To share data between threads
+
+ * To save and load information from/to files.
+
+* Duplicate information (containers, allocators, etc...) just copying the contents of
+ one buffer to another one.
+
+* Send complex information and objects/databases using serial/inter-process/network
+ communications.
+
+To help with this management, [*Boost.Interprocess] provides two useful classes,
+`basic_managed_heap_memory` and `basic_managed_external_buffer`:
+
+[section:managed_external_buffer Managed External Buffer: Constructing all Boost.Interprocess objects in a user provided buffer]
+
+Sometimes, the user wants to create simple objects, STL compatible containers, STL compatible
+strings and more, all in a single buffer. This buffer could be a big static buffer,
+a memory-mapped auxiliary device or any other user buffer.
+
+This would allow an easy serialization and we-ll just need to copy the buffer to duplicate
+all the objects created in the original buffer, including complex objects like
+maps, lists.... [*Boost.Interprocess] offers managed memory segment classes to handle user
+provided buffers that allow the same functionality as shared memory classes:
+
+[c++]
+
+ //Named object creation managed memory segment
+ //All objects are constructed in a a user provided buffer
+ template <
+ class CharType,
+ class MemoryAlgorithm,
+ template<class IndexConfig> class IndexType
+ >
+ class basic_managed_external_buffer;
+
+ //Named object creation managed memory segment
+ //All objects are constructed in a a user provided buffer
+ // Names are c-strings,
+ // Default memory management algorithm
+ // (rbtree_best_fit with no mutexes and relative pointers)
+ // Name-object mappings are stored in the default index type (flat_map)
+ typedef basic_managed_external_buffer <
+ char,
+ rbtree_best_fit<null_mutex_family, offset_ptr<void> >,
+ flat_map_index
+ > managed_external_buffer;
+
+ //Named object creation managed memory segment
+ //All objects are constructed in a a user provided buffer
+ // Names are wide-strings,
+ // Default memory management algorithm
+ // (rbtree_best_fit with no mutexes and relative pointers)
+ // Name-object mappings are stored in the default index type (flat_map)
+ typedef basic_managed_external_buffer<
+ wchar_t,
+ rbtree_best_fit<null_mutex_family, offset_ptr<void> >,
+ flat_map_index
+ > wmanaged_external_buffer;
+
+To use a managed external buffer, you must include the following header:
+
+[c++]
+
+ #include <boost/interprocess/managed_external_buffer.hpp>
+
+Let's see an example of the use of managed_external_buffer:
+
+[import ../example/doc_managed_external_buffer.cpp]
+[doc_managed_external_buffer]
+
+[*Boost.Interprocess] STL compatible allocators can also be used to place STL
+compatible containers in the user segment.
+
+[classref boost::interprocess::basic_managed_external_buffer basic_managed_external_buffer] can
+be also useful to build small databases for embedded systems limiting the size of
+the used memory to a predefined memory chunk, instead of letting the database
+fragment the heap memory.
+
+[endsect]
+
+[section:managed_heap_memory Managed Heap Memory: Boost.Interprocess machinery in heap memory]
+
+The use of heap memory (new/delete) to obtain a buffer where the user wants to store all
+his data is very common, so [*Boost.Interprocess] provides some specialized
+classes that work exclusively with heap memory.
+
+These are the classes:
+
+[c++]
+
+ //Named object creation managed memory segment
+ //All objects are constructed in a single buffer allocated via new[]
+ template <
+ class CharType,
+ class MemoryAlgorithm,
+ template<class IndexConfig> class IndexType
+ >
+ class basic_managed_heap_memory;
+
+ //Named object creation managed memory segment
+ //All objects are constructed in a single buffer allocated via new[]
+ // Names are c-strings,
+ // Default memory management algorithm
+ // (rbtree_best_fit with no mutexes and relative pointers)
+ // Name-object mappings are stored in the default index type (flat_map)
+ typedef basic_managed_heap_memory <
+ char,
+ rbtree_best_fit<null_mutex_family>,
+ flat_map_index
+ > managed_heap_memory;
+
+ //Named object creation managed memory segment
+ //All objects are constructed in a single buffer allocated via new[]
+ // Names are wide-strings,
+ // Default memory management algorithm
+ // (rbtree_best_fit with no mutexes and relative pointers)
+ // Name-object mappings are stored in the default index type (flat_map)
+ typedef basic_managed_heap_memory<
+ wchar_t,
+ rbtree_best_fit<null_mutex_family>,
+ flat_map_index
+ > wmanaged_heap_memory;
+
+To use a managed heap memory, you must include the following header:
+
+[c++]
+
+ #include <boost/interprocess/managed_heap_memory.hpp>
+
+The use is exactly the same as
+[classref boost::interprocess::basic_managed_external_buffer],
+except that memory is created by
+the managed memory segment itself using dynamic (new/delete) memory.
+
+[*basic_managed_heap_memory] also offers a `grow(std::size_t extra_bytes)` function that
+tries to resize internal heap memory so that we have room for more objects.
+But *be careful*, if memory is reallocated, the old buffer will be copied into
+the new one so all the objects will be binary-copied to the new buffer.
+To be able to use this function, all pointers constructed in the heap buffer that
+point to objects in the heap buffer must be relative pointers (for example `offset_ptr`).
+Otherwise, the result is undefined. Here is an example:
+
+[import ../example/doc_managed_heap_memory.cpp]
+[doc_managed_heap_memory]
+
+[endsect]
+
+[section:managed_heap_memory_external_buffer_diff Differences between managed memory segments]
+
+All managed memory segments have similar capabilities
+(memory allocation inside the memory segment, named object construction...),
+but there are some remarkable differences between [*managed_shared_memory],
+[*managed_mapped_file] and [*managed_heap_memory], [*managed_external_file].
+
+* Default specializations of managed shared memory and mapped file use process-shared
+ mutexes. Heap memory and external buffer have no internal synchronization by default.
+ The cause is that the first two are thought to be shared between processes (although
+ memory mapped files could be used just to obtain a persistent object data-base for a
+ process) whereas the last two are thought to be used inside one process to construct
+ a serialized named object data-base that can be sent though serial interprocess
+ communications (like message queues, localhost network...).
+
+* The first two create a system-global object (a shared memory object or a file) shared
+ by several processes, whereas the last two are objects that don't create system-wide
+ resources.
+
+[endsect]
+
+[section:shared_message_queue_ex Example: Serializing a database through the message queue]
+
+To see the utility of managed heap memory and managed external buffer classes,
+the following example shows how a message queue can be used to serialize a whole
+database constructed in a memory buffer using [*Boost.Interprocess], send the database
+through a message queue and duplicated in another buffer:
+
+[import ../test/message_queue_test.cpp]
+[message_queue_test_test_serialize_db]
+
+[endsect]
+
+[endsect]
+
+[endsect]
+
+[section:allocators_containers Allocators, containers and memory allocation algorithms]
+
[section:allocator_introduction Introduction to Interprocess allocators]
As seen, [*Boost.Interprocess] offers raw memory allocation and object construction
@@ -3997,7 +4262,7 @@
To know the details of the implementation of
of the segregated storage pools see the
-[link interprocess.architecture_2.implementation_segregated_storage_pools Implementation of [*Boost.Interprocess] segregated storage pools]
+[link interprocess.architecture.allocators_containers.implementation_segregated_storage_pools Implementation of [*Boost.Interprocess] segregated storage pools]
section.
[section:segregated_allocators_common Additional parameters and functions of segregated storage node allocators]
@@ -4006,7 +4271,7 @@
[classref boost::interprocess::private_node_allocator private_node_allocator] and
[classref boost::interprocess::cached_node_allocator cached_node_allocator] implement
the standard allocator interface and the functions explained in the
-[link interprocess.allocator_introduction.allocator_properties Properties of Boost.Interprocess allocators].
+[link interprocess.allocators_containers.allocator_introduction.allocator_properties Properties of Boost.Interprocess allocators].
All these allocators are templatized by 3 parameters:
@@ -4033,7 +4298,7 @@
a node allocator between processes. To achieve this sharing
[classref boost::interprocess::node_allocator node_allocator]
uses the segment manager's unique type allocation service
-(see [link interprocess.managed_memory_segment_features.unique Unique instance construction] section).
+(see [link interprocess.managed_memory_segments.managed_memory_segment_features.unique Unique instance construction] section).
In the initialization, a
[classref boost::interprocess::node_allocator node_allocator]
@@ -4228,7 +4493,7 @@
of nodes to the memory segment, so that they can be used by any other container or managed
object construction. To know the details of the implementation of
of "adaptive pools" see the
-[link interprocess.architecture_2.implementation_adaptive_pools Implementation of [*Boost.Intrusive] adaptive pools]
+[link interprocess.architecture.allocators_containers.implementation_adaptive_pools Implementation of [*Boost.Intrusive] adaptive pools]
section.
Like with segregated storage based node allocators, Boost.Interprocess offers
@@ -4242,7 +4507,7 @@
[classref boost::interprocess::private_adaptive_pool private_adaptive_pool] and
[classref boost::interprocess::cached_adaptive_pool cached_adaptive_pool] implement
the standard allocator interface and the functions explained in the
-[link interprocess.allocator_introduction.allocator_properties Properties of Boost.Interprocess allocators].
+[link interprocess.allocators_containers.allocator_introduction.allocator_properties Properties of Boost.Interprocess allocators].
All these allocators are templatized by 4 parameters:
@@ -4623,232 +4888,27 @@
[endsect]
-[section:managed_heap_memory_external_buffer Managed Heap Memory And Managed External Buffer]
-
-[*Boost.Interprocess] offers managed shared memory between processes using
-`managed_shared_memory` or `managed_mapped_file`. Two processes just map the same
-the memory mappable resoure and read from and write to that object.
-
-Many times, we don't want to use that shared memory approach and we prefer
-to send serialized data through network, local socket or message queues. Serialization
-can be done through [*Boost.Serialization] or similar library. However, if two processes
-share the same ABI (application binary interface), we could use the same object and
-container construction capabilities of `managed_shared_memory` or `managed_heap_memory`
-to build all the information in a single buffer that will be sent, for example,
-though message queues. The receiver would just copy the data to a local buffer, and it
-could read or modify it directly without deserializing the data . This approach can be
-much more efficient that a complex serialization mechanism.
-
-Applications for [*Boost.Interprocess] services using non-shared memory buffers:
-
-* Create and use STL compatible containers and allocators,
- in systems where dynamic memory is not suggested.
+[section:memory_algorithms Memory allocation algorithms]
-* Build complex, easily serializable databases in a single buffer:
+[section:simple_seq_fit simple_seq_fit: A simple shared memory management algorithm]
- * To share data between threads
+The algorithm is a variation of sequential fit using singly
+linked list of free memory buffers. The algorithm is based
+on the article about shared memory titled
+[@http://home.earthlink.net/~joshwalker1/writing/SharedMemory.html ['"Taming Shared Memory"] ].
+The algorithm is as follows:
- * To save and load information from/to files.
+The shared memory is divided in blocks of free shared memory,
+each one with some control data and several bytes of memory
+ready to be used. The control data contains a pointer (in
+our case offset_ptr) to the next free block and the size of
+the block. The allocator consists of a singly linked list
+of free blocks, ordered by address. The last block, points
+always to the first block:
-* Duplicate information (containers, allocators, etc...) just copying the contents of
- one buffer to another one.
+[c++]
-* Send complex information and objects/databases using serial/inter-process/network
- communications.
-
-To help with this management, [*Boost.Interprocess] provides two useful classes,
-`basic_managed_heap_memory` and `basic_managed_external_buffer`:
-
-[section:managed_external_buffer Managed External Buffer: Constructing all Boost.Interprocess objects in a user provided buffer]
-
-Sometimes, the user wants to create simple objects, STL compatible containers, STL compatible
-strings and more, all in a single buffer. This buffer could be a big static buffer,
-a memory-mapped auxiliary device or any other user buffer.
-
-This would allow an easy serialization and we-ll just need to copy the buffer to duplicate
-all the objects created in the original buffer, including complex objects like
-maps, lists.... [*Boost.Interprocess] offers managed memory segment classes to handle user
-provided buffers that allow the same functionality as shared memory classes:
-
-[c++]
-
- //Named object creation managed memory segment
- //All objects are constructed in a a user provided buffer
- template <
- class CharType,
- class MemoryAlgorithm,
- template<class IndexConfig> class IndexType
- >
- class basic_managed_external_buffer;
-
- //Named object creation managed memory segment
- //All objects are constructed in a a user provided buffer
- // Names are c-strings,
- // Default memory management algorithm
- // (rbtree_best_fit with no mutexes and relative pointers)
- // Name-object mappings are stored in the default index type (flat_map)
- typedef basic_managed_external_buffer <
- char,
- rbtree_best_fit<null_mutex_family, offset_ptr<void> >,
- flat_map_index
- > managed_external_buffer;
-
- //Named object creation managed memory segment
- //All objects are constructed in a a user provided buffer
- // Names are wide-strings,
- // Default memory management algorithm
- // (rbtree_best_fit with no mutexes and relative pointers)
- // Name-object mappings are stored in the default index type (flat_map)
- typedef basic_managed_external_buffer<
- wchar_t,
- rbtree_best_fit<null_mutex_family, offset_ptr<void> >,
- flat_map_index
- > wmanaged_external_buffer;
-
-To use a managed external buffer, you must include the following header:
-
-[c++]
-
- #include <boost/interprocess/managed_external_buffer.hpp>
-
-Let's see an example of the use of managed_external_buffer:
-
-[import ../example/doc_managed_external_buffer.cpp]
-[doc_managed_external_buffer]
-
-[*Boost.Interprocess] STL compatible allocators can also be used to place STL
-compatible containers in the user segment.
-
-[classref boost::interprocess::basic_managed_external_buffer basic_managed_external_buffer] can
-be also useful to build small databases for embedded systems limiting the size of
-the used memory to a predefined memory chunk, instead of letting the database
-fragment the heap memory.
-
-[endsect]
-
-[section:managed_heap_memory Managed Heap Memory: Boost.Interprocess machinery in heap memory]
-
-The use of heap memory (new/delete) to obtain a buffer where the user wants to store all
-his data is very common, so [*Boost.Interprocess] provides some specialized
-classes that work exclusively with heap memory.
-
-These are the classes:
-
-[c++]
-
- //Named object creation managed memory segment
- //All objects are constructed in a single buffer allocated via new[]
- template <
- class CharType,
- class MemoryAlgorithm,
- template<class IndexConfig> class IndexType
- >
- class basic_managed_heap_memory;
-
- //Named object creation managed memory segment
- //All objects are constructed in a single buffer allocated via new[]
- // Names are c-strings,
- // Default memory management algorithm
- // (rbtree_best_fit with no mutexes and relative pointers)
- // Name-object mappings are stored in the default index type (flat_map)
- typedef basic_managed_heap_memory <
- char,
- rbtree_best_fit<null_mutex_family>,
- flat_map_index
- > managed_heap_memory;
-
- //Named object creation managed memory segment
- //All objects are constructed in a single buffer allocated via new[]
- // Names are wide-strings,
- // Default memory management algorithm
- // (rbtree_best_fit with no mutexes and relative pointers)
- // Name-object mappings are stored in the default index type (flat_map)
- typedef basic_managed_heap_memory<
- wchar_t,
- rbtree_best_fit<null_mutex_family>,
- flat_map_index
- > wmanaged_heap_memory;
-
-To use a managed heap memory, you must include the following header:
-
-[c++]
-
- #include <boost/interprocess/managed_heap_memory.hpp>
-
-The use is exactly the same as
-[classref boost::interprocess::basic_managed_external_buffer],
-except that memory is created by
-the managed memory segment itself using dynamic (new/delete) memory.
-
-[*basic_managed_heap_memory] also offers a `grow(std::size_t extra_bytes)` function that
-tries to resize internal heap memory so that we have room for more objects.
-But *be careful*, if memory is reallocated, the old buffer will be copied into
-the new one so all the objects will be binary-copied to the new buffer.
-To be able to use this function, all pointers constructed in the heap buffer that
-point to objects in the heap buffer must be relative pointers (for example `offset_ptr`).
-Otherwise, the result is undefined. Here is an example:
-
-[import ../example/doc_managed_heap_memory.cpp]
-[doc_managed_heap_memory]
-
-[endsect]
-
-[section:managed_heap_memory_external_buffer_diff Differences between managed memory segments]
-
-All managed memory segments have similar capabilities
-(memory allocation inside the memory segment, named object construction...),
-but there are some remarkable differences between [*managed_shared_memory],
-[*managed_mapped_file] and [*managed_heap_memory], [*managed_external_file].
-
-* Default specializations of managed shared memory and mapped file use process-shared
- mutexes. Heap memory and external buffer have no internal synchronization by default.
- The cause is that the first two are thought to be shared between processes (although
- memory mapped files could be used just to obtain a persistent object data-base for a
- process) whereas the last two are thought to be used inside one process to construct
- a serialized named object data-base that can be sent though serial interprocess
- communications (like message queues, localhost network...).
-
-* The first two create a system-global object (a shared memory object or a file) shared
- by several processes, whereas the last two are objects that don't create system-wide
- resources.
-
-[endsect]
-
-[section:shared_message_queue_ex Example: Serializing a database through the message queue]
-
-To see the utility of managed heap memory and managed external buffer classes,
-the following example shows how a message queue can be used to serialize a whole
-database constructed in a memory buffer using [*Boost.Interprocess], send the database
-through a message queue and duplicated in another buffer:
-
-[import ../test/message_queue_test.cpp]
-[message_queue_test_test_serialize_db]
-
-[endsect]
-
-[endsect]
-
-[section:memory_algorithms Boost.Interprocess memory allocation algorithms]
-
-[section:simple_seq_fit simple_seq_fit: A simple shared memory management algorithm]
-
-The algorithm is a variation of sequential fit using singly
-linked list of free memory buffers. The algorithm is based
-on the article about shared memory titled
-[@http://home.earthlink.net/~joshwalker1/writing/SharedMemory.html ['"Taming Shared Memory"] ].
-The algorithm is as follows:
-
-The shared memory is divided in blocks of free shared memory,
-each one with some control data and several bytes of memory
-ready to be used. The control data contains a pointer (in
-our case offset_ptr) to the next free block and the size of
-the block. The allocator consists of a singly linked list
-of free blocks, ordered by address. The last block, points
-always to the first block:
-
-[c++]
-
- simple_seq_fit memory layout:
+ simple_seq_fit memory layout:
main extra allocated free_block_1 allocated free_block_2 allocated free_block_3
header header block ctrl usr block ctrl usr block ctrl usr
@@ -4945,6 +5005,8 @@
[endsect]
+[endsect]
+
[section:streams Direct iostream formatting: vectorstream and bufferstream]
Shared memory, memory-mapped files and all [*Boost.Interprocess] mechanisms are focused
@@ -5154,7 +5216,7 @@
[endsect]
-[section:interprocess_smart_ptr Boost.Interprocess ownership smart pointers]
+[section:interprocess_smart_ptr Ownership smart pointers]
C++ users know the importance of ownership smart pointers when dealing with resources.
Boost offers a wide range of such type of pointers: `intrusive_ptr<>`,
@@ -5174,90 +5236,28 @@
[section:intrusive_ptr Intrusive pointer]
[classref boost::interprocess::intrusive_ptr] is the generalization of `boost::intrusive_ptr<>`
-to allow non-raw pointers as intrusive pointer members. As the known
+to allow non-raw pointers as intrusive pointer members. As the well-known
`boost::intrusive_ptr` we must specify the pointee type but we also must also specify
the pointer type to be stored in the intrusive_ptr:
[c++]
- /*!The intrusive_ptr class template stores a pointer to an object
- with an embedded reference count. intrusive_ptr is parameterized on
- T (the type of the object pointed to) and VoidPointer(a void pointer type
- that defines the type of pointer that intrusive_ptr will store).
- intrusive_ptr<T, void *> defines a class with a T* member whereas
- intrusive_ptr<T, offset_ptr<void> > defines a class with a offset_ptr<T> member.
- Relies on unqualified calls to:
-
- void intrusive_ptr_add_ref(T * p);
- void intrusive_ptr_release(T * p);
-
- with (p != 0)
-
- The object is responsible for destroying itself.*/
+ //!The intrusive_ptr class template stores a pointer to an object
+ //!with an embedded reference count. intrusive_ptr is parameterized on
+ //!T (the type of the object pointed to) and VoidPointer(a void pointer type
+ //!that defines the type of pointer that intrusive_ptr will store).
+ //!intrusive_ptr<T, void *> defines a class with a T* member whereas
+ //!intrusive_ptr<T, offset_ptr<void> > defines a class with a offset_ptr<T> member.
+ //!Relies on unqualified calls to:
+ //!
+ //!void intrusive_ptr_add_ref(T * p);
+ //!void intrusive_ptr_release(T * p);
+ //!
+ //!with (p != 0)
+ //!
+ //!The object is responsible for destroying itself.
template<class T, class VoidPointer>
- class intrusive_ptr
- {
- public:
- /*!Provides the type of the internal stored pointer.*/
- typedef typename /*...*/ pointer;
- /*!Provides the type of the stored pointer.*/
- typedef T element_type;
-
- /*!Constructor. Initializes internal pointer to 0. Does not throw*/
- intrusive_ptr();
-
- /*!Constructor. Copies pointer and if "p" is not zero and
- "add_ref" is true calls intrusive_ptr_add_ref(get_pointer(p)).
- Does not throw*/
- intrusive_ptr(const pointer &p, bool add_ref = true);
-
- /*!Copy constructor. Copies the internal pointer and if "p" is not
- zero calls intrusive_ptr_add_ref(get_pointer(p)). Does not throw*/
- intrusive_ptr(intrusive_ptr const & rhs);
-
- /*!Constructor from related. Copies the internal pointer and if "p" is not
- zero calls intrusive_ptr_add_ref(get_pointer(p)). Does not throw*/
- template<class U> intrusive_ptr (intrusive_ptr<U, VP> const & rhs);
-
- /*!Destructor. If internal pointer is not 0, calls
- intrusive_ptr_release(get_pointer(m_ptr)). Does not throw*/
- ~intrusive_ptr();
-
- /*!Assignment operator. Equivalent to intrusive_ptr(r).swap(*this).
- Does not throw*/
- intrusive_ptr & operator=(intrusive_ptr const & rhs);
-
- /*!Assignment from related. Equivalent to intrusive_ptr(r).swap(*this).
- Does not throw*/
- template<class U> intrusive_ptr & operator= (intrusive_ptr<U, VP> const & rhs);
-
- /*!Assignment from pointer. Equivalent to intrusive_ptr(r).swap(*this).
- Does not throw*/
- intrusive_ptr & operator=(pointer rhs);
-
- /*!Returns a reference to the internal pointer. Does not throw*/
- pointer &get();
-
- /*!Returns a reference to the internal pointer. Does not throw*/
- const pointer &get() const;
-
- /*!Returns *get(). Does not throw*/
- T & operator*() const;
-
- /*!Returns *get(). Does not throw*/
- const pointer &operator->() const;
-
- /*!Returns get(). Does not throw*/
- pointer &operator->();
-
- operator unspecified_bool_type () const;
-
- /*!Not operator. Does not throw*/
- bool operator! () const;
-
- /*!Exchanges the contents of the two smart pointers. Does not throw*/
- void swap(intrusive_ptr & rhs);
- };
+ class intrusive_ptr;
So `boost::interprocess::intrusive_ptr<MyClass, void*>` is equivalent to
`boost::instrusive_ptr<MyClass>`. But if we want to place the intrusive_ptr in
@@ -5277,84 +5277,193 @@
[c++]
- /*!scoped_ptr stores a pointer to a dynamically allocated object.
- The object pointed to is guaranteed to be deleted, either on destruction
- of the scoped_ptr, or via an explicit reset. The user can avoid this
- deletion using release().
- scoped_ptr is parameterized on T (the type of the object pointed to) and
- Deleter (the functor to be executed to delete the internal pointer).
- The internal pointer will be of the same pointer type as typename
- Deleter::pointer type (that is, if typename Deleter::pointer is
- offset_ptr<void>, the internal pointer will be offset_ptr<T>).*/
+ //!scoped_ptr stores a pointer to a dynamically allocated object.
+ //!The object pointed to is guaranteed to be deleted, either on destruction
+ //!of the scoped_ptr, or via an explicit reset. The user can avoid this
+ //!deletion using release().
+ //!scoped_ptr is parameterized on T (the type of the object pointed to) and
+ //!Deleter (the functor to be executed to delete the internal pointer).
+ //!The internal pointer will be of the same pointer type as typename
+ //!Deleter::pointer type (that is, if typename Deleter::pointer is
+ //!offset_ptr<void>, the internal pointer will be offset_ptr<T>).
template<class T, class Deleter>
- class scoped_ptr
- {
- public:
+ class scoped_ptr;
+
+`scoped_ptr<>` comes handy to implement *rollbacks* with exceptions: if an exception
+is thrown or we call `return` in the scope of `scoped_ptr<>` the deleter is
+automatically called so that *the deleter can be considered as a rollback* function.
+If all goes well, we call `release()` member function to avoid rollback when
+the `scoped_ptr` goes out of scope.
- /*!Provides the type of the stored pointer.*/
- typedef T element_type;
+[import ../example/doc_scoped_ptr.cpp]
+[doc_scoped_ptr]
- /*!Provides the type of the internal stored pointer.*/
- typedef /*...*/ pointer;
+[endsect]
- /*!Constructs a scoped_ptr, storing a copy of p(which can be 0) and d.
- Does not throw.*/
- explicit scoped_ptr(const pointer &p = 0, const Deleter &d = Deleter());
+[section:shared_ptr Shared pointer and weak pointer]
- /*!If the stored pointer is not 0, destroys the object pointed to by the stored pointer.
- calling the operator() of the stored deleter.*/
- ~scoped_ptr();
+[*Boost.Interprocess] also offers the possibility of creating non-intrusive
+reference-counted objects in managed shared memory or mapped files.
- /*!Deletes the object pointed to by the stored pointer and then
- stores a copy of p. Never throws*/
- void reset(const pointer &p = 0);
+Unlike
+[@http://www.boost.org/libs/smart_ptr/shared_ptr.htm boost::shared_ptr],
+due to limitations of mapped segments [classref boost::interprocess::shared_ptr]
+can not take advantage of virtual functions to maintain the same shared pointer
+type while providing user-defined allocators and deleters. The allocator
+and the deleter are template parameters of the shared pointer.
- /*!Deletes the object pointed to by the stored pointer and then
- stores a copy of p and a copy of d.*/
- void reset(const pointer &p, const Deleter &d);
+Since the reference count and other auxiliary data needed by
+[classref boost::interprocess::shared_ptr shared_ptr] must be created also in
+the managed segment, and the deleter has to delete the object from
+the segment, the user must specify an allocator object and a deleter object
+when constructing a non-empty instance of
+[classref boost::interprocess::shared_ptr shared_ptr], just like
+[*Boost.Interprocess] containers need to pass allocators in their constructors.
- /*!Assigns internal pointer as 0 and returns previous pointer. This will
- avoid deletion on destructor*/
- pointer release():
+Here's is the declaration of [classref boost::interprocess::shared_ptr shared_ptr]:
- /*!Returns a reference to the object pointed to by the stored pointer.
- Never throws.*/
- reference operator*() const;
+[c++]
- /*!Returns the internal stored pointer. Never throws*/
- pointer &operator->();
+ template<class T, class VoidAllocator, class Deleter>
+ class shared_ptr;
- /*!Returns the internal stored pointer. Never throws.*/
- const pointer &operator->() const;
+* T is the type of the pointed type.
+* VoidAllocator is the allocator to be used to allocate auxiliary
+ elements such as the reference count, the deleter...
+ The internal `pointer` typedef of the allocator will determine
+ the type of pointer that shared_ptr will internally use, so
+ allocators defining `pointer` as `offset_ptr<void>` will
+ make all internal pointers used by `shared_ptr` to be
+ also relative pointers. See [classref boost::interprocess::allocator]
+ for a working allocator.
+* Deleter is the function object that will be used to destroy
+ the pointed object when the last reference to the object
+ is destroyed. The deleter functor will take a pointer to T
+ of the same category as the void pointer defined by
+ `VoidAllocator::pointer`. See [classref boost::interprocess::deleter]
+ for a generic deleter that erases a object from a managed segment.
- /*!Returns the stored pointer. Never throws.*/
- pointer & get();
+With correctly specified parameters, [*Boost.Interprocess] users
+can create objects in shared memory that hold shared pointers pointing
+to other objects also in shared memory, obtaining the benefits of
+reference counting. Let's see how to create a shared pointer in a managed shared memory:
- /*!Returns the stored pointer. Never throws.*/
- const pointer & get() const;
+[import ../example/doc_shared_ptr_explicit.cpp]
+[doc_shared_ptr_explicit]
- /*!Returns true if the stored pointer is 0. Never throws.*/
- bool operator! () const;
+[classref boost::interprocess::shared_ptr] is very flexible and
+configurable (we can specify the allocator and the deleter, for example),
+but as shown the creation of a shared pointer in managed segments
+need too much typing.
- /*!Exchanges the internal pointer and deleter with other scoped_ptr
- Never throws.*/
- void swap(scoped_ptr & b);
- };
-
-`scoped_ptr<>` comes handy to implement *rollbacks* with exceptions: if an exception
-is thrown or we call `return` in the scope of `scoped_ptr<>` the deleter is
-automatically called so that *the deleter can be considered as a rollback* function.
-If all goes well, we call `release()` member function to avoid rollback when
-the `scoped_ptr` goes out of scope.
+To simplify this usage, [classref boost::interprocess::shared_ptr] header
+offers a shared pointer definition helper class
+([classref boost::interprocess::managed_shared_ptr managed_shared_ptr]) and a function
+([funcref boost::interprocess::make_managed_shared_ptr make_managed_shared_ptr])
+to easily construct a shared pointer from a type allocated in a managed segment
+with an allocator that will allocate the reference count also in the managed
+segment and a deleter that will erase the object from the segment.
-[import ../example/doc_scoped_ptr.cpp]
-[doc_scoped_ptr]
+These utilities will use the a [*Boost.Interprocess] allocator
+([classref boost::interprocess::allocator])
+and deleter ([classref boost::interprocess::deleter]) to do their job.
+The definition of the previous shared pointer
+could be simplified to the following:
+
+[c++]
+
+ typedef managed_shared_ptr<MyType, managed_shared_memory>::type my_shared_ptr;
+
+And the creation of a shared pointer can be simplified to this:
+
+[c++]
+
+ my_shared_ptr sh_ptr = make_managed_shared_ptr
+ (segment.construct<MyType>("object to share")(), segment);
+
+[*Boost.Interprocess] also offers a weak pointer named
+[classref boost::interprocess::weak_ptr weak_ptr] (with its corresponding
+[classref boost::interprocess::managed_weak_ptr managed_weak_ptr] and
+[funcref boost::interprocess::make_managed_weak_ptr make_managed_weak_ptr] utilities)
+to implement non-owning observers of an object owned by
+[classref boost::interprocess::shared_ptr shared_ptr].
+
+Now let's see a detailed example of the use of
+[classref boost::interprocess::shared_ptr shared_ptr]:
+and
+[classref boost::interprocess::weak_ptr weak_ptr]
+
+[import ../example/doc_shared_ptr.cpp]
+[doc_shared_ptr]
+
+In general, using [*Boost.Interprocess]' [classref boost::interprocess::shared_ptr shared_ptr]
+and [classref boost::interprocess::weak_ptr weak_ptr] is very similar to their
+counterparts [@http://www.boost.org/libs/smart_ptr/shared_ptr.htm boost::shared_ptr]
+and [@http://www.boost.org/libs/smart_ptr/weak_ptr.htm boost::weak_ptr], but
+they need more template parameters and more run-time parameters in their constructors.
+
+Just like [@http://www.boost.org/libs/smart_ptr/shared_ptr.htm boost::shared_ptr]
+can be stored in a STL container, [classref boost::interprocess::shared_ptr shared_ptr]
+can also be stored in [*Boost.Interprocess] containers.
+
+If a programmer just uses [classref boost::interprocess::shared_ptr shared_ptr]
+to be able to insert objects dynamically constructed in the managed segment
+in a container, but does not need to share the ownership of that object with
+other objects [classref boost::interprocess::unique_ptr unique_ptr] is a much
+faster and easier to use alternative.
+
+[endsect]
+
+[section:unique_ptr Unique pointer]
+
+Unique ownership smart pointers are really useful to free programmers from
+manual resource liberation of non-shared objects. [*Boost.Interprocess]'
+[classref boost::interprocess::unique_ptr unique_ptr] is much like
+[classref boost::interprocess::scoped_ptr scoped_ptr] but it's [*moveable]
+and can be easily inserted in [*Boost.Interprocess] containers.
+Here is the declaration of the unique pointer class:
+
+[c++]
+
+ template <class T, class D>
+ class unique_ptr;
+
+* T is the type of the object pointed by [classref boost::interprocess::unique_ptr unique_ptr].
+* D is the deleter that will erase the object type of the object pointed by
+ [classref boost::interprocess::unique_ptr unique_ptr] when the unique pointer
+ is destroyed (and if still owns ownership of the object). If the deleter defines
+ an internal `pointer` typedef, [classref boost::interprocess::unique_ptr unique_ptr]
+ will use an internal pointer of the same type. So if `D::pointer` is `offset_ptr<T>`
+ the unique pointer will store a relative pointer instead of a raw one. This
+ allows placing [classref boost::interprocess::unique_ptr unique_ptr] in shared
+ memory and memory-mapped files.
+
+[classref boost::interprocess::unique_ptr unique_ptr] can release the ownership of
+the stored pointer so it's useful also to be used as a rollback function. One of the main
+properties of the class is that [*is not copyable, but only moveable]. When a unique
+pointer is moved to another one, the ownership of the pointer is transferred from
+the source unique pointer to the target unique pointer. If the target unique pointer
+owned an object, that object is first deleted before taking ownership of the new object.
+
+[classref boost::interprocess::unique_ptr unique_ptr] also offers auxiliary types to
+easily define and construct unique pointers that can be placed in managed segments
+and will correctly delete the owned object from the segment:
+[classref boost::interprocess::managed_unique_ptr managed_unique_ptr]
+and
+[funcref boost::interprocess::make_managed_unique_ptr make_managed_unique_ptr]
+utilities.
+
+Here we see an example of the use [classref boost::interprocess::unique_ptr unique_ptr]
+including creating containers of such objects:
+
+[import ../example/doc_unique_ptr.cpp]
+[doc_unique_ptr]
[endsect]
[endsect]
-[section:architecture Boost.Interprocess architecture and internals (I)]
+[section:architecture Architecture and internals]
[section:basic_guidelines Basic guidelines]
@@ -5391,6 +5500,8 @@
[endsect]
+[section:architecture_algorithm_to_managed From the memory algorithm to the managed segment]
+
[section:architecture_memory_algorithm The memory algorithm]
The [*memory algorithm] is an object that is placed in the first bytes of a
@@ -5560,9 +5671,9 @@
[endsect]
[endsect]
-[section:architecture_2 Boost.Interprocess architecture and internals (II)]
+[section:allocators_containers Allocators and containers]
-[section:architecture_allocators Boost.Interprocess allocators]
+[section:allocators Boost.Interprocess allocators]
The [*Boost.Interprocess] STL-like allocators are fairly simple and follow the usual C++
allocator approach. Normally, allocators for STL containers are based above new/delete
@@ -5674,7 +5785,140 @@
[endsect]
-[section:customizing_interprocess Customizing Boost.Interprocess]
+[section:performance Performance of Boost.Interprocess]
+
+This section tries to explain the performance characteristics of [*Boost.Interprocess],
+so that you can optimize [*Boost.Interprocess] usage if you need more performance.
+
+[section:performance_allocations Performance of raw memory allocations]
+
+You can have two types of raw memory allocations with [*Boost.Interprocess] classes:
+
+* [*Explicit]: The user calls `allocate()` and `deallocate()` functions of
+ managed_shared_memory/managed_mapped_file... managed memory segments. This call is
+ translated to a `MemoryAlgorithm::allocate()` function, which means that you
+ will need just the time that the memory algorithm associated with the managed memory segment
+ needs to allocate data.
+
+* [*Implicit]: For example, you are using `boost::interprocess::allocator<...>` with
+ [*Boost.Interprocess] containers. This allocator calls the same `MemoryAlgorithm::allocate()`
+ function than the explicit method, [*every] time a vector/string has to reallocate its
+ buffer or [*every] time you insert an object in a node container.
+
+If you see that memory allocation is a bottleneck in your application, you have
+these alternatives:
+
+* If you use map/set associative containers, try using `flat_map` family instead
+ of the map family if you mainly do searches and the insertion/removal is mainly done
+ in an initialization phase. The overhead is now when the ordered vector has to
+ reallocate its storage and move data. You can also call the `reserve()` method
+ of these containers when you know beforehand how much data you will insert.
+ However in these containers iterators are invalidated in insertions so this
+ substitution is only effective in some applications.
+
+* Use a [*Boost.Interprocess] pooled allocator for node containers, because pooled
+ allocators call `allocate()` only when the pool runs out of nodes. This is pretty
+ efficient (much more than the current default general-purpose algorithm) and this
+ can save a lot of memory. See
+ [link interprocess.allocators_containers.stl_allocators_segregated_storage Segregated storage node allocators] and
+ [link interprocess.allocators_containers.stl_allocators_adaptive Adaptive node allocators] for more information.
+
+* Write your own memory algorithm. If you have experience with memory allocation algorithms
+ and you think another algorithm is better suited than the default one for your application,
+ you can specify it in all [*Boost.Interprocess] managed memory segments. See the section
+ [link interprocess.customizing_interprocess.custom_interprocess_alloc Writing a new shared memory allocation algorithm]
+ to know how to do this. If you think its better than the default one for general-purpose
+ applications, be polite and donate it to [*Boost.Interprocess] to make it default!
+
+[endsect]
+
+[section:performance_named_allocation Performance of named allocations]
+
+[*Boost.Interprocess] allows the same paralelism as two threads writing to a common
+structure, except when the user creates/searches named/unique objects. The steps
+when creating a named object are these:
+
+* Lock a recursive mutex (so that you can make named allocations inside
+ the constructor of the object to be created).
+
+* Try to insert the [name pointer, object information] in the name/object index.
+ This lookup has to assure that the name has not been used before.
+ This is achieved calling `insert()` function in the index. So the time this
+ requires is dependent on the index type (ordered vector, tree, hash...).
+ This can require a call to the memory algorithm allocation function if
+ the index has to be reallocated, it's a node allocator, uses pooled allocations...
+
+* Allocate a single buffer to hold the name of the object, the object itself,
+ and meta-data for destruction (number of objects, etc...).
+
+* Call the constructors of the object being created. If it's an array, one
+ construtor per array element.
+
+* Unlock the recursive mutex.
+
+The steps when destroying a named object using the name of the object
+(`destroy<T>(name)`) are these:
+
+* Lock a recursive mutex .
+
+* Search in the index the entry associated to that name. Copy that information and
+ erase the index entry. This is done using `find(const key_type &)` and `erase(iterator)`
+ members of the index. This can require element reordering if the index is a
+ balanced tree, an ordered vector...
+
+* Call the destructor of the object (many if it's an array).
+
+* Deallocate the memory buffer containing the name, metadata and the object itself
+ using the allocation algorithm.
+
+* Unlock the recursive mutex.
+
+The steps when destroying a named object using the pointer of the object
+(`destroy_ptr(T *ptr)`) are these:
+
+* Lock a recursive mutex .
+
+* Depending on the index type, this can be different:
+
+ * If the index is a node index, (marked with `boost::interprocess::is_node_index`
+ specialization): Take the iterator stored near the object and call
+ `erase(iterator)`. This can require element reordering if the index is a
+ balanced tree, an ordered vector...
+
+ * If it's not an node index: Take the name stored near the object and erase
+ the index entry calling `erase(const key &). This can require element reordering
+ if the index is a balanced tree, an ordered vector...
+
+* Call the destructor of the object (many if it's an array).
+
+* Deallocate the memory buffer containing the name, metadata and the object itself
+ using the allocation algorithm.
+
+* Unlock the recursive mutex.
+
+If you see that the performance is not good enough you have these alternatives:
+
+* Maybe the problem is that the lock time is too big and it hurts paralelism.
+ Try to reduce the number of named objects in the global index and if your
+ application serves several clients try to build a new managed memory segment
+ for each one instead of using a common one.
+
+* Use another [*Boost.Interprocess] index type if you feel the default one is
+ not fast enough. If you are not still satisfied, write your own index type. See
+ [link interprocess.customizing_interprocess.custom_indexes Building custom indexes] for this.
+
+* Destruction via pointer is at least as fast as using the name of the object and
+ can be faster (in node containers, for example). So if your problem is that you
+ make at lot of named destructions, try to use the pointer. If the index is a
+ node index you can save some time.
+
+[endsect]
+
+[endsect]
+
+[endsect]
+
+[section:customizing_interprocess Customizing Boost.Interprocess]
[section:custom_interprocess_alloc Writing a new shared memory allocation algorithm]
@@ -5925,8 +6169,8 @@
[c++]
- /*!The key of the the named allocation information index. Stores a to
- a null string and the length of the string to speed up sorting*/
+ //!The key of the the named allocation information index. Stores a to
+ //!a null string and the length of the string to speed up sorting
template<...>
struct index_key
{
@@ -5939,13 +6183,13 @@
//Length of the name buffer (null NOT included)
std::size_t m_len;
- /*!Constructor of the key*/
+ //!Constructor of the key
index_key (const CharT *name, std::size_t length);
- /*!Less than function for index ordering*/
+ //!Less than function for index ordering
bool operator < (const index_key & right) const;
- /*!Equal to function for index ordering*/
+ //!Equal to function for index ordering
bool operator == (const index_key & right) const;
};
@@ -5986,9 +6230,9 @@
[c++]
- /*!Trait classes to detect if an index is a node
- index. This allows more efficient operations
- when deallocating named objects.*/
+ //!Trait classes to detect if an index is a node
+ //!index. This allows more efficient operations
+ //!when deallocating named objects.
template<class MapConfig>
struct is_node_index
<my_index<MapConfig> >
@@ -6008,10 +6252,10 @@
[c++]
- /*!Defines a managed shared memory with a c-strings as
- a keys, the red-black tree best fit algorithm (with process-shared mutexes
- and offset_ptr pointers) as raw shared memory management algorithm
- and a custom index*/
+ //!Defines a managed shared memory with a c-strings as
+ //!a keys, the red-black tree best fit algorithm (with process-shared mutexes
+ //!and offset_ptr pointers) as raw shared memory management algorithm
+ //!and a custom index
typedef
basic_managed_shared_memory <
char,
@@ -6024,207 +6268,8 @@
[endsect]
-[section:performance Performance of Boost.Interprocess]
-
-This section tries to explain the performance characteristics of [*Boost.Interprocess],
-so that you can optimize [*Boost.Interprocess] usage if you need more performance.
-
-[section:performance_allocations Performance of raw memory allocations]
-
-You can have two types of raw memory allocations with [*Boost.Interprocess] classes:
-
-* [*Explicit]: The user calls `allocate()` and `deallocate()` functions of
- managed_shared_memory/managed_mapped_file... managed memory segments. This call is
- translated to a `MemoryAlgorithm::allocate()` function, which means that you
- will need just the time that the memory algorithm associated with the managed memory segment
- needs to allocate data.
-
-* [*Implicit]: For example, you are using `boost::interprocess::allocator<...>` with
- [*Boost.Interprocess] containers. This allocator calls the same `MemoryAlgorithm::allocate()`
- function than the explicit method, [*every] time a vector/string has to reallocate its
- buffer or [*every] time you insert an object in a node container.
-
-If you see that memory allocation is a bottleneck in your application, you have
-these alternatives:
-
-* If you use map/set associative containers, try using `flat_map` family instead
- of the map family if you mainly do searches and the insertion/removal is mainly done
- in an initialization phase. The overhead is now when the ordered vector has to
- reallocate its storage and move data. You can also call the `reserve()` method
- of these containers when you know beforehand how much data you will insert.
- However in these containers iterators are invalidated in insertions so this
- substitution is only effective in some applications.
-
-* Use a [*Boost.Interprocess] pooled allocator for node containers, because pooled
- allocators call `allocate()` only when the pool runs out of nodes. This is pretty
- efficient (much more than the current default general-purpose algorithm) and this
- can save a lot of memory. See
- [link interprocess.stl_allocators_segregated_storage Segregated storage node allocators] and
- [link interprocess.stl_allocators_adaptive Adaptive node allocators] for more information.
-
-* Write your own memory algorithm. If you have experience with memory allocation algorithms
- and you think another algorithm is better suited than the default one for your application,
- you can specify it in all [*Boost.Interprocess] managed memory segments. See the section
- [link interprocess.customizing_interprocess.custom_interprocess_alloc Writing a new shared memory allocation algorithm]
- to know how to do this. If you think its better than the default one for general-purpose
- applications, be polite and donate it to [*Boost.Interprocess] to make it default!
-
-[endsect]
-
-[section:performance_named_allocation Performance of named allocations]
-[*Boost.Interprocess] allows the same paralelism as two threads writing to a common
-structure, except when the user creates/searches named/unique objects. The steps
-when creating a named object are these:
-
-* Lock a recursive mutex (so that you can make named allocations inside
- the constructor of the object to be created).
-
-* Try to insert the [name pointer, object information] in the name/object index.
- This lookup has to assure that the name has not been used before.
- This is achieved calling `insert()` function in the index. So the time this
- requires is dependent on the index type (ordered vector, tree, hash...).
- This can require a call to the memory algorithm allocation function if
- the index has to be reallocated, it's a node allocator, uses pooled allocations...
-
-* Allocate a single buffer to hold the name of the object, the object itself,
- and meta-data for destruction (number of objects, etc...).
-
-* Call the constructors of the object being created. If it's an array, one
- construtor per array element.
-
-* Unlock the recursive mutex.
-
-The steps when destroying a named object using the name of the object
-(`destroy<T>(name)`) are these:
-
-* Lock a recursive mutex .
-
-* Search in the index the entry associated to that name. Copy that information and
- erase the index entry. This is done using `find(const key_type &)` and `erase(iterator)`
- members of the index. This can require element reordering if the index is a
- balanced tree, an ordered vector...
-
-* Call the destructor of the object (many if it's an array).
-
-* Deallocate the memory buffer containing the name, metadata and the object itself
- using the allocation algorithm.
-
-* Unlock the recursive mutex.
-
-The steps when destroying a named object using the pointer of the object
-(`destroy_ptr(T *ptr)`) are these:
-
-* Lock a recursive mutex .
-
-* Depending on the index type, this can be different:
-
- * If the index is a node index, (marked with `boost::interprocess::is_node_index`
- specialization): Take the iterator stored near the object and call
- `erase(iterator)`. This can require element reordering if the index is a
- balanced tree, an ordered vector...
-
- * If it's not an node index: Take the name stored near the object and erase
- the index entry calling `erase(const key &). This can require element reordering
- if the index is a balanced tree, an ordered vector...
-
-* Call the destructor of the object (many if it's an array).
-
-* Deallocate the memory buffer containing the name, metadata and the object itself
- using the allocation algorithm.
-
-* Unlock the recursive mutex.
-
-If you see that the performance is not good enough you have these alternatives:
-
-* Maybe the problem is that the lock time is too big and it hurts paralelism.
- Try to reduce the number of named objects in the global index and if your
- application serves several clients try to build a new managed memory segment
- for each one instead of using a common one.
-
-* Use another [*Boost.Interprocess] index type if you feel the default one is
- not fast enough. If you are not still satisfied, write your own index type. See
- [link interprocess.customizing_interprocess.custom_indexes Building custom indexes] for this.
-
-* Destruction via pointer is at least as fast as using the name of the object and
- can be faster (in node containers, for example). So if your problem is that you
- make at lot of named destructions, try to use the pointer. If the index is a
- node index you can save some time.
-
-[endsect]
-
-[endsect]
-
-[section:future_improvements Future Improvements...]
-
-There are some Interprocess features that I would like to implement and some
-[*Boost.Interprocess] code that can be much better. Let's see some ideas:
-
-[section:win32_sync Win32 synchronization is too basic]
-
-Win32 version of shared mutexes and shared conditions are based on "spin and wait"
-atomic instructions. This leads to poor performance and does not manage any issues
-like priority inversions. We would need very serious help from threading experts on
-this. And I'm not sure that this can be achieved in user-level software. Posix based
-implementations use PTHREAD_PROCESS_SHARED attribute to place mutexes in shared memory,
-so there are no such problems. I'm not aware of any implementation that simulates
-PTHREAD_PROCESS_SHARED attribute for Win32. We should be able to construct these
-primitives in memory mapped files, so that we can get filesystem persistence just like
-with POSIX primitives.
-
-[endsect]
-
-[section:future_objectnames Use of wide character names on Boost.Interprocess basic resources]
-
-Currently Interprocess only allows *char* based names for basic named
-objects. However, several operating systems use *wchar_t* names for resources
-(mapped files, for example).
-In the future Interprocess should try to present a portable narrow/wide char interface.
-To do this, it would be useful to have a boost wstring <-> string conversion
-utilities to translate resource names (escaping needed characters
-that can conflict with OS names) in a portable way. It would be interesting also
-the use of [*boost::filesystem] paths to avoid operating system specific issues.
-
-[endsect]
-
-[section:future_security Security attributes]
-
-[*Boost.Interprocess] does not define security attributes for shared memory and
-synchronization objects. Standard C++ also ignores security attributes with files
-so adding security attributes would require some serious work.
-
-[endsect]
-
-[section:future_ipc Future inter-process communications]
-
-[*Boost.Interprocess] offers a process-shared message queue based on
-[*Boost.Interprocess] primitives like mutexes and conditions. I would want to
-develop more mechanisms, like stream-oriented named fifo so that we can use it
-with a iostream-interface wrapper (we can imitate Unix pipes).
-
-C++ needs more complex mechanisms and it would be nice to have a stream and
-datagram oriented PF_UNIX-like mechanism in C++. And for very fast inter-process
-remote calls Solaris doors is an interesting alternative to implement for C++.
-But the work to implement PF_UNIX-like sockets and doors would be huge
-(and it might be difficult in a user-level library). Any network expert volunteer?
-
-[endsect]
-
-[section:future_containers Unordered associative containers and other containers]
-
-We should be able to construct boost::unordered_xxx family in managed memory segments,
-so that there is no code duplication in boost. So [*Boost.Interprocess] should cooperate
-with boost container developers instead of duplicating effort writing it's own containers.
-
-A very interesting project is making [*boost::multi_index] compatible with
-[*Boost.Interprocess] ready for shared memory. This could be a good basis for memory
-mapped data-bases. The work to achieve this, however, can be huge. It would be
-interesting a collaboration with [*Intrusive] library to achieve shared memory
-intrusive containers.
-
-[endsect]
-
-[endsect]
+[section:acknowledgements_notes Acknowledgements, notes and links]
[section:thanks_to Thanks to...]
@@ -6313,8 +6358,38 @@
[section:release_notes_boost_1_35_00 Boost 1.35 Release]
+* Added auxiliary utilities to ease the definition and construction of
+ [classref boost::interprocess::shared_ptr shared_ptr],
+ [classref boost::interprocess::weak_ptr weak_ptr] and
+ [classref boost::interprocess::unique_ptr unique_ptr]. Added explanations
+ and examples of these smart pointers in the documenation.
+
+* Optimized vector:
+ * 1) Now works with raw pointers as much as possible when
+ using allocators defining `pointer` as an smart pointer. This increases
+ performance and improves compilation times.
+ * 2) A bit of metaprogramming
+ to avoid using move_iterator when the type has trivial copy constructor
+ or assignment and improve performance.
+ * 3) Changed custom algorithms
+ with standard ones to take advantage of optimized standard algorithms.
+ * 4) Removed unused code.
+
+* [*ABI breaking]: Containers don't derive from allocators, to avoid problems with allocators
+ that might define virtual functions with the same names as container
+ member functions. That would convert container functions in virtual functions
+ and might disallow some of them if the returned type does not lead to a covariant return.
+ Allocators are now stored as base clases of internal structs.
+
+* Implemented [classref boost::interprocess::named_mutex named_mutex] and
+ [classref boost::interprocess::named_semaphore named_semaphore] with POSIX
+ named semaphores in systems supporting that option.
+ [classref boost::interprocess::named_condition named_condition] has been
+ accordingly changed to support interoperability with
+ [classref boost::interprocess::named_mutex named_mutex].
+
* Reduced template bloat for node and adaptive allocators extracting node
- implementation to a class only depends on the memory algorithm, instead of
+ implementation to a class taht only depends on the memory algorithm, instead of
the segment manager + node size + node number...
* Fixed bug in `mapped_region` in UNIX when mapping address was provided but
@@ -6324,6 +6399,10 @@
* Improved documentation about managed memory segments.
+* [*Boost.Interprocess] containers are now documented in the Reference section.
+
+* Correction of typos and documentation errors.
+
* Added `get_instance_name`, `get_instance_length` and `get_instance_type` functions
to managed memory segments.
@@ -6338,8 +6417,6 @@
* Optimized [classref boost::interprocess::segment_manager segment_manager]
to avoid code bloat associated with templated instantiations.
-* Correction of typos and documentation errors.
-
* Fixed bug for UNIX: No slash ('/') was being added as the first character
for shared memory names, leading to errors in some UNIX systems.
@@ -6358,8 +6435,6 @@
* Improved (multi)map/(multi)set constructors taking iterators. Now those have
linear time if the iterator range is already sorted.
-* Documented Boost.Interprocess containers. Containers are now documented in the Reference section.
-
* [*ABI breaking]: (multi)map/(multi)set now reduce their node size. The color
bit is embedded in the parent pointer. Now, the size of a node is the size of
3 pointers in most systems. This optimization is activated for raw and `offset_ptr`
@@ -6411,21 +6486,17 @@
* Added adaptive pools.
* [*Source breaking]: Changed node allocators' template parameter order
- to make them more easy to use.
+ to make them easier to use.
* Added support for native windows shared memory.
* Added more tests.
-* Documentation improved and expanded.
-
* Corrected the presence of private functions in the reference section.
* Added function (`deallocate_free_chunks()`) to manually deallocate completely free
chunks from node allocators.
-* Minor bugfixes.
-
* Implemented N1780 proposal to LWG issue 233: ['Insertion hints in associative containers]
in interprocess [classref boost::interprocess::multiset multiset] and
[classref boost::interprocess::multimap multimap] classes.
@@ -6450,7 +6521,7 @@
* [*ABI breaking]: Reimplemented and optimized small string optimization. The narrow
string class has zero byte overhead with an internal 11 byte buffer in 32 systems!
-* Added move semantics to containers. Experimental and not documented yet. Improves
+* Added move semantics to containers. Improves
performance when using containers of containers.
* [*ABI breaking]: End nodes of node containers (list, slist, map/set) are now
@@ -6464,10 +6535,10 @@
[endsect]
-[section:references References and interesting links]
+[section:books_and_links Books and interesting links]
-Some useful references about C++ language, C++ internals, shared memory,
-allocators and containers, I've used to design Interprocess.
+Some useful references about the C++ programming language, C++ internals,
+shared memory, allocators and containers used to design [*Boost.Interprocess].
[section:references_books Books]
@@ -6489,7 +6560,7 @@
[section:references_links Links]
-* A framework to put STL in shared memory: [@http://allocator.sourceforge.net/ ['"A C++ Standard Allocator for the Standard Template Library"] ].
+* A framework to put the STL in shared memory: [@http://allocator.sourceforge.net/ ['"A C++ Standard Allocator for the Standard Template Library"] ].
* Instantiating C++ objects in shared memory: [@http://www.cs.ubc.ca/local/reading/proceedings/cascon94/htm/english/abs/hon.htm ['"Using objects in shared memory for C++ application"] ].
@@ -6499,4 +6570,77 @@
[endsect]
+[section:future_improvements Future improvements...]
+
+There are some Interprocess features that I would like to implement and some
+[*Boost.Interprocess] code that can be much better. Let's see some ideas:
+
+[section:win32_sync Win32 synchronization is too basic]
+
+Win32 version of shared mutexes and shared conditions are based on "spin and wait"
+atomic instructions. This leads to poor performance and does not manage any issues
+like priority inversions. We would need very serious help from threading experts on
+this. And I'm not sure that this can be achieved in user-level software. Posix based
+implementations use PTHREAD_PROCESS_SHARED attribute to place mutexes in shared memory,
+so there are no such problems. I'm not aware of any implementation that simulates
+PTHREAD_PROCESS_SHARED attribute for Win32. We should be able to construct these
+primitives in memory mapped files, so that we can get filesystem persistence just like
+with POSIX primitives.
+
+[endsect]
+
+[section:future_objectnames Use of wide character names on Boost.Interprocess basic resources]
+
+Currently Interprocess only allows *char* based names for basic named
+objects. However, several operating systems use *wchar_t* names for resources
+(mapped files, for example).
+In the future Interprocess should try to present a portable narrow/wide char interface.
+To do this, it would be useful to have a boost wstring <-> string conversion
+utilities to translate resource names (escaping needed characters
+that can conflict with OS names) in a portable way. It would be interesting also
+the use of [*boost::filesystem] paths to avoid operating system specific issues.
+
+[endsect]
+
+[section:future_security Security attributes]
+
+[*Boost.Interprocess] does not define security attributes for shared memory and
+synchronization objects. Standard C++ also ignores security attributes with files
+so adding security attributes would require some serious work.
+
+[endsect]
+
+[section:future_ipc Future inter-process communications]
+
+[*Boost.Interprocess] offers a process-shared message queue based on
+[*Boost.Interprocess] primitives like mutexes and conditions. I would want to
+develop more mechanisms, like stream-oriented named fifo so that we can use it
+with a iostream-interface wrapper (we can imitate Unix pipes).
+
+C++ needs more complex mechanisms and it would be nice to have a stream and
+datagram oriented PF_UNIX-like mechanism in C++. And for very fast inter-process
+remote calls Solaris doors is an interesting alternative to implement for C++.
+But the work to implement PF_UNIX-like sockets and doors would be huge
+(and it might be difficult in a user-level library). Any network expert volunteer?
+
+[endsect]
+
+[section:future_containers Unordered associative containers and other containers]
+
+We should be able to construct boost::unordered_xxx family in managed memory segments,
+so that there is no code duplication in boost. So [*Boost.Interprocess] should cooperate
+with boost container developers instead of duplicating effort writing it's own containers.
+
+A very interesting project is making [*boost::multi_index] compatible with
+[*Boost.Interprocess] ready for shared memory. This could be a good basis for memory
+mapped data-bases. The work to achieve this, however, can be huge. It would be
+interesting a collaboration with [*Intrusive] library to achieve shared memory
+intrusive containers.
+
+[endsect]
+
+[endsect]
+
+[endsect]
+
[xinclude autodoc.xml]
Deleted: trunk/libs/interprocess/example/alloc_example.cpp
==============================================================================
--- trunk/libs/interprocess/example/alloc_example.cpp 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,65 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztañaga 2004. 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>
-
-#include <boost/interprocess/managed_shared_memory.hpp>
-#include <cstddef>
-
-int main ()
-{
- using namespace boost::interprocess;
-
- shared_memory_object::remove("MySharedMemory");
-
- //Create managed shared memory
- managed_shared_memory segment(create_only,
- "MySharedMemory",//segment name
- 65536); //segment size in bytes;
-
- //Allocate a portion of the segment
- void * shptr = segment.allocate(1024);
- managed_shared_memory::handle_t handle = segment.get_handle_from_address(shptr);
- (void)handle;
-
- // Copy message to buffer
- // . . .
- // Send handle to other process
- // . . .
- // Wait response from other process
- // . . .
-
- {
- using namespace boost::interprocess;
-
- //Named allocate capable shared memory allocator
- managed_shared_memory segment(open_only, "MySharedMemory");
-
- managed_shared_memory::handle_t handle = 0;
- (void)handle;
-
- //Wait handle msg from other process and put it in
- //"handle" local variable
-
- //Get buffer local address from handle
- void *msg = segment.get_address_from_handle(handle);
- (void)msg;
-
- //Do anything with msg
- //. . .
- //Send ack to sender process
- }
-
- segment.deallocate(shptr);
- return 0;
-}
-
-#include <boost/interprocess/detail/config_end.hpp>
Modified: trunk/libs/interprocess/example/doc_managed_multiple_allocation.cpp
==============================================================================
--- trunk/libs/interprocess/example/doc_managed_multiple_allocation.cpp (original)
+++ trunk/libs/interprocess/example/doc_managed_multiple_allocation.cpp 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
@@ -12,6 +12,7 @@
#include <cassert>//assert
#include <cstring>//std::memset
#include <new> //std::nothrow
+#include <vector> //std::vector
int main()
{
@@ -23,24 +24,33 @@
try{
managed_shared_memory managed_shm(create_only, "MyManagedShm", 65536);
- std::size_t received_size;
+
//Allocate 16 elements of 100 bytes in a single call. Non-throwing version.
- multiallocation_iterator beg_it = managed_shm.allocate_many(100, 16, 16, received_size, std::nothrow);
+ multiallocation_iterator beg_it = managed_shm.allocate_many(100, 16, std::nothrow);
- //To check for an error, we can use a boolean expresssion
+ //To check for an error, we can use a boolean expression
//or compare it with a default constructed iterator
assert(!beg_it == (beg_it == multiallocation_iterator()));
//Check if the memory allocation was successful
if(!beg_it) return 1;
+ //Allocated buffers
+ std::vector<char*> allocated_buffers;
+
//Initialize our data
- for( multiallocation_iterator it = beg_it, end_it; it != end_it; )
+ for( multiallocation_iterator it = beg_it, end_it; it != end_it; ){
+ allocated_buffers.push_back(*it);
+ //The iterator must be incremented before overwriting memory
+ //because otherwise, the iterator is invalidated.
std::memset(*it++, 0, 100);
+ }
//Now deallocate
- for(multiallocation_iterator it = beg_it, end_it; it != end_it;)
- managed_shm.deallocate(*it++);
+ while(!allocated_buffers.empty()){
+ managed_shm.deallocate(allocated_buffers.back());
+ allocated_buffers.pop_back();
+ }
//Allocate 10 buffers of different sizes in a single call. Throwing version
std::size_t sizes[10];
@@ -51,8 +61,11 @@
//Iterate each allocated buffer and deallocate
//The "end" condition can be also checked with operator!
- for(multiallocation_iterator it = beg_it; it;)
+ for(multiallocation_iterator it = beg_it; it;){
+ //The iterator must be incremented before overwriting memory
+ //because otherwise, the iterator is invalidated.
managed_shm.deallocate(*it++);
+ }
}
catch(...){
shared_memory_object::remove("MyManagedShm");
Deleted: trunk/libs/interprocess/example/doc_named_conditionA.cpp
==============================================================================
--- trunk/libs/interprocess/example/doc_named_conditionA.cpp 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,76 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztanaga 2006-2007. 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/shared_memory_object.hpp>
-#include <boost/interprocess/mapped_region.hpp>
-#include <boost/interprocess/sync/scoped_lock.hpp>
-#include <iostream>
-#include <cstdio>
-#include "doc_anonymous_condition_shared_data.hpp"
-
-using namespace boost::interprocess;
-
-int main ()
-{
- try{
- //Erase previous shared memory
- shared_memory_object::remove("shared_memory");
-
- //Create a shared memory object.
- shared_memory_object shm
- (create_only //only create
- ,"shared_memory" //name
- ,read_write //read-write mode
- );
-
- //Set size
- shm.truncate(sizeof(trace_queue));
-
- //Map the whole shared memory in this process
- mapped_region region
- (shm //What to map
- ,read_write //Map it as read-write
- );
-
- //Get the address of the mapped region
- void * addr = region.get_address();
-
- //Construct the shared structure in memory
- trace_queue * data = new (addr) trace_queue;
-
- const int NumMsg = 100;
-
- for(int i = 0; i < NumMsg; ++i){
- scoped_lock<interprocess_mutex> lock(data->mutex);
- if(data->message_in){
- data->cond_full.wait(lock);
- }
- if(i == (NumMsg-1))
- std::sprintf(data->items, "%s", "last message");
- else
- std::sprintf(data->items, "%s_%d", "my_trace", i);
-
- //Notify to the other process that there is a message
- data->cond_empty.notify_one();
-
- //Mark message buffer as full
- data->message_in = true;
- }
- }
- catch(interprocess_exception &ex){
- shared_memory_object::remove("shared_memory");
- std::cout << ex.what() << std::endl;
- return 1;
- }
-
- //Erase shared memory
- shared_memory_object::remove("shared_memory");
-
- return 0;
-}
Deleted: trunk/libs/interprocess/example/doc_named_conditionB.cpp
==============================================================================
--- trunk/libs/interprocess/example/doc_named_conditionB.cpp 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,73 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztanaga 2006-2007. 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/shared_memory_object.hpp>
-#include <boost/interprocess/mapped_region.hpp>
-#include <boost/interprocess/sync/scoped_lock.hpp>
-#include <iostream>
-#include <cstring>
-#include "doc_anonymous_condition_shared_data.hpp"
-
-using namespace boost::interprocess;
-
-int main ()
-{
- try{
- //Erase previous shared memory
- shared_memory_object::remove("shared_memory");
-
- //Create a shared memory object.
- shared_memory_object shm
- (open_only //only create
- ,"shared_memory" //name
- ,read_write //read-write mode
- );
-
- //Map the whole shared memory in this process
- mapped_region region
- (shm //What to map
- ,read_write //Map it as read-write
- );
-
- //Get the address of the mapped region
- void * addr = region.get_address();
-
- //Obtain a pointer to the shared structure
- trace_queue * data = static_cast<trace_queue*>(addr);
-
- //Print messages until the other process marks the end
- bool end_loop = false;
- do{
- scoped_lock<interprocess_mutex> lock(data->mutex);
- if(!data->message_in){
- data->cond_empty.wait(lock);
- }
- if(std::strcmp(data->items, "last message") == 0){
- end_loop = true;
- }
- else{
- //Print the message
- std::cout << data->items << std::endl;
- //Notify the other process that the buffer is empty
- data->message_in = false;
- data->cond_full.notify_one();
- }
- }
- while(!end_loop);
- }
- catch(interprocess_exception &ex){
- shared_memory_object::remove("MySharedMemory");
- std::cout << ex.what() << std::endl;
- return 1;
- }
-
- //Erase shared memory
- shared_memory_object::remove("shared_memory");
- return 0;
-}
Modified: trunk/libs/interprocess/example/doc_offset_ptr.cpp
==============================================================================
--- trunk/libs/interprocess/example/doc_offset_ptr.cpp (original)
+++ trunk/libs/interprocess/example/doc_offset_ptr.cpp 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
@@ -31,7 +31,7 @@
try{
managed_shared_memory segment(
create_only,
- "MySharedMemory",//segment name
+ "MySharedMemory", //segment name
65536); //segment size in bytes
//Create linked list with 10 nodes in shared memory
Added: trunk/libs/interprocess/example/doc_shared_ptr.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/interprocess/example/doc_shared_ptr.cpp 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
@@ -0,0 +1,120 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2006-2007.
+// 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_shared_ptr
+#include <boost/interprocess/managed_mapped_file.hpp>
+#include <boost/interprocess/smart_ptr/shared_ptr.hpp>
+#include <boost/interprocess/smart_ptr/weak_ptr.hpp>
+#include <cassert>
+
+using namespace boost::interprocess;
+
+//This is type of the object we want to share
+struct type_to_share
+{};
+
+//This is the type of a shared pointer to the previous type
+//that will be built in the mapped file
+typedef managed_shared_ptr<type_to_share, managed_mapped_file>::type shared_ptr_type;
+typedef managed_weak_ptr<type_to_share, managed_mapped_file>::type weak_ptr_type;
+
+//This is a type holding a shared pointer
+struct shared_ptr_owner
+{
+ shared_ptr_owner(const shared_ptr_type &other_shared_ptr)
+ : shared_ptr_(other_shared_ptr)
+ {}
+
+ shared_ptr_owner(const shared_ptr_owner &other_owner)
+ : shared_ptr_(other_owner.shared_ptr_)
+ {}
+
+ shared_ptr_type shared_ptr_;
+ //...
+};
+
+int main ()
+{
+ //Destroy any previous file with the name to be used.
+ std::remove("MyMappedFile");
+ {
+ managed_mapped_file file(create_only, "MyMappedFile", 4096);
+
+ //Construct the shared type in the file and
+ //pass ownership to this local shared pointer
+ shared_ptr_type local_shared_ptr = make_managed_shared_ptr
+ (file.construct<type_to_share>("object to share")(), file);
+ assert(local_shared_ptr.use_count() == 1);
+
+ //Share ownership of the object between local_shared_ptr and a new "owner1"
+ shared_ptr_owner *owner1 =
+ file.construct<shared_ptr_owner>("owner1")(local_shared_ptr);
+ assert(local_shared_ptr.use_count() == 2);
+
+ //local_shared_ptr releases object ownership
+ local_shared_ptr.reset();
+ assert(local_shared_ptr.use_count() == 0);
+ assert(owner1->shared_ptr_.use_count() == 1);
+
+ //Share ownership of the object between "owner1" and a new "owner2"
+ shared_ptr_owner *owner2 =
+ file.construct<shared_ptr_owner>("owner2")(*owner1);
+ assert(owner1->shared_ptr_.use_count() == 2);
+ assert(owner2->shared_ptr_.use_count() == 2);
+ assert(owner1->shared_ptr_.get() == owner2->shared_ptr_.get());
+
+ //The mapped file is unmapped here. Objects have been flushed to disk
+ }
+ {
+ //Reopen the mapped file and find again all owners
+ managed_mapped_file file(open_only, "MyMappedFile");
+ shared_ptr_owner *owner1 = file.find<shared_ptr_owner>("owner1").first;
+ shared_ptr_owner *owner2 = file.find<shared_ptr_owner>("owner2").first;
+ assert(owner1 && owner2);
+
+ //Check everything is as expected
+ assert(file.find<type_to_share>("object to share").first != 0);
+ assert(owner1->shared_ptr_.use_count() == 2);
+ assert(owner2->shared_ptr_.use_count() == 2);
+ assert(owner1->shared_ptr_.get() == owner2->shared_ptr_.get());
+
+ //Now destroy one of the owners, the reference count drops.
+ file.destroy_ptr(owner1);
+ assert(owner2->shared_ptr_.use_count() == 1);
+
+ //Create a weak pointer
+ weak_ptr_type local_observer1(owner2->shared_ptr_);
+ assert(local_observer1.use_count() == owner2->shared_ptr_.use_count());
+
+ { //Create a local shared pointer from the weak pointer
+ shared_ptr_type local_shared_ptr = local_observer1.lock();
+ assert(local_observer1.use_count() == owner2->shared_ptr_.use_count());
+ assert(local_observer1.use_count() == 2);
+ }
+
+ //Now destroy the remaining owner. "object to share" will be destroyed
+ file.destroy_ptr(owner2);
+ assert(file.find<type_to_share>("object to share").first == 0);
+
+ //Test observer
+ assert(local_observer1.expired());
+ assert(local_observer1.use_count() == 0);
+
+ //The reference count will be deallocated when all weak pointers
+ //disappear. After that, the file is unmapped.
+ }
+ std::remove("MyMappedFile");
+ return 0;
+}
+//]
+#include <boost/interprocess/detail/config_end.hpp>
Added: trunk/libs/interprocess/example/doc_shared_ptr_explicit.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/interprocess/example/doc_shared_ptr_explicit.cpp 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
@@ -0,0 +1,56 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2006-2007.
+// 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_shared_ptr_explicit
+#include <boost/interprocess/managed_shared_memory.hpp>
+#include <boost/interprocess/smart_ptr/shared_ptr.hpp>
+#include <boost/interprocess/allocators/allocator.hpp>
+#include <boost/interprocess/smart_ptr/deleter.hpp>
+#include <cassert>
+
+using namespace boost::interprocess;
+
+//This is type of the object we want to share
+class MyType
+{};
+
+typedef managed_shared_memory::segment_manager segment_manager_type;
+typedef allocator<void, segment_manager_type> void_allocator_type;
+typedef deleter<MyType, segment_manager_type> deleter_type;
+typedef shared_ptr<MyType, void_allocator_type, deleter_type> my_shared_ptr;
+
+int main ()
+{
+ //Destroy any previous segment with the name to be used.
+ shared_memory_object::remove("MySharedMemory");
+ managed_shared_memory segment(create_only, "MySharedMemory", 4096);
+
+ //Create a shared pointer in shared memory
+ //pointing to a newly created object in the segment
+ my_shared_ptr &shared_ptr_instance =
+ *segment.construct<my_shared_ptr>("shared ptr")
+ //Arguments to construct the shared pointer
+ ( segment.construct<MyType>("object to share")() //object to own
+ , void_allocator_type(segment.get_segment_manager()) //allocator
+ , deleter_type(segment.get_segment_manager()) //deleter
+ );
+ assert(shared_ptr_instance.use_count() == 1);
+
+ //Destroy "shared ptr". "object to share" will be automatically destroyed
+ segment.destroy_ptr(&shared_ptr_instance);
+
+ shared_memory_object::remove("MySharedMemory");
+ return 0;
+}
+//]
+#include <boost/interprocess/detail/config_end.hpp>
Added: trunk/libs/interprocess/example/doc_unique_ptr.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/interprocess/example/doc_unique_ptr.cpp 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
@@ -0,0 +1,120 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2006-2007.
+// 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_unique_ptr
+#include <boost/interprocess/managed_mapped_file.hpp>
+#include <boost/interprocess/smart_ptr/unique_ptr.hpp>
+#include <boost/interprocess/containers/vector.hpp>
+#include <boost/interprocess/containers/list.hpp>
+#include <boost/interprocess/allocators/allocator.hpp>
+#include <cassert>
+
+using namespace boost::interprocess;
+
+//This is type of the object we'll allocate dynamically
+struct MyType
+{
+ MyType(int number = 0)
+ : number_(number)
+ {}
+ int number_;
+};
+
+//This is the type of a unique pointer to the previous type
+//that will be built in the mapped file
+typedef managed_unique_ptr<MyType, managed_mapped_file>::type unique_ptr_type;
+
+//Define containers of unique pointer. Unique pointer simplifies object management
+typedef vector
+ < unique_ptr_type
+ , allocator<unique_ptr_type, managed_mapped_file::segment_manager>
+ > unique_ptr_vector_t;
+
+typedef list
+ < unique_ptr_type
+ , allocator<unique_ptr_type, managed_mapped_file::segment_manager>
+ > unique_ptr_list_t;
+
+int main ()
+{
+ //Destroy any previous file with the name to be used.
+ std::remove("MyMappedFile");
+ {
+ managed_mapped_file file(create_only, "MyMappedFile", 65536);
+
+ //Construct an object in the file and
+ //pass ownership to this local unique pointer
+ unique_ptr_type local_unique_ptr (make_managed_unique_ptr
+ (file.construct<MyType>("unique object")(), file));
+ assert(local_unique_ptr.get() != 0);
+
+ //Reset the unique pointer. The object is automatically destroyed
+ local_unique_ptr.reset();
+ assert(file.find<MyType>("unique object").first == 0);
+
+ //Now create a vector of unique pointers
+ unique_ptr_vector_t *unique_vector =
+ file.construct<unique_ptr_vector_t>("unique vector")(file.get_segment_manager());
+
+ //Speed optimization
+ unique_vector->reserve(100);
+
+ //Now insert all values
+ for(int i = 0; i < 100; ++i){
+ unique_vector->push_back(
+ make_managed_unique_ptr(file.construct<MyType>(anonymous_instance)(i), file)
+ );
+ assert(unique_vector->back()->number_ == i);
+ }
+
+ //Now create a list of unique pointers
+ unique_ptr_list_t *unique_list =
+ file.construct<unique_ptr_list_t>("unique list")(file.get_segment_manager());
+
+ //Pass ownership of all values to the list
+ for(int i = 99; !unique_vector->empty(); --i){
+ unique_list->push_front(move(unique_vector->back()));
+ //The unique ptr of the vector is now empty...
+ assert(unique_vector->back() == 0);
+ unique_vector->pop_back();
+ //...and the list has taken ownership of the value
+ assert(unique_list->front() != 0);
+ assert(unique_list->front()->number_ == i);
+ }
+ assert(unique_list->size() == 100);
+
+ //Now destroy the empty vector.
+ file.destroy_ptr(unique_vector);
+ //The mapped file is unmapped here. Objects have been flushed to disk
+ }
+ {
+ //Reopen the mapped file and find again the list
+ managed_mapped_file file(open_only, "MyMappedFile");
+ unique_ptr_list_t *unique_list =
+ file.find<unique_ptr_list_t>("unique list").first;
+ assert(unique_list);
+ assert(unique_list->size() == 100);
+
+ unique_ptr_list_t::const_iterator list_it = unique_list->begin();
+ for(int i = 0; i < 100; ++i, ++list_it){
+ assert((*list_it)->number_ == i);
+ }
+
+ //Now destroy the list. All elements will be automatically deallocated.
+ file.destroy_ptr(unique_list);
+ }
+ std::remove("MyMappedFile");
+ return 0;
+}
+//]
+#include <boost/interprocess/detail/config_end.hpp>
Modified: trunk/libs/interprocess/example/doc_vectorstream.cpp
==============================================================================
--- trunk/libs/interprocess/example/doc_vectorstream.cpp (original)
+++ trunk/libs/interprocess/example/doc_vectorstream.cpp 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
@@ -35,7 +35,7 @@
try{
managed_shared_memory segment(
create_only,
- "MySharedMemory",//segment name
+ "MySharedMemory", //segment name
65536); //segment size in bytes
//Construct shared memory vector
Deleted: trunk/libs/interprocess/example/named_alloc_example.cpp
==============================================================================
--- trunk/libs/interprocess/example/named_alloc_example.cpp 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,96 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztañaga 2004-2006. 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>
-
-#include <boost/interprocess/managed_shared_memory.hpp>
-#include <cstddef>
-
-int main ()
-{
- using namespace boost::interprocess;
- typedef std::pair<double, int> MyType;
-
- //Named allocate capable shared mem allocator
- //Create shared memory
- shared_memory_object::remove("MySharedMemory");
- managed_shared_memory segment
- (create_only,
- "MySharedMemory",//segment name
- 65536); //segment size in bytes
-
- //Create an object of MyType initialized to {0, 0}
- segment.construct<MyType>
- ("MyType instance") /*name of the object*/
- (0 /*ctor first argument*/,
- 0 /*ctor second argument*/);
-
- //Create an array of 10 elements of MyType initialized to {0, 0}
- segment.construct<MyType>
- ("MyType array") /*name of the object*/
- [10] /*number of elements*/
- (0 /*ctor first argument*/,
- 0 /*ctor second argument*/);
-
-
- //Let's simulate other process
- {
- using namespace boost::interprocess;
- typedef std::pair<double, int> MyType;
-
- //Named allocate capable shared mem allocator
- //Create shared memory
- managed_shared_memory segment
- (open_only, "MySharedMemory"); //segment name
-
- //Find the array and object
- std::pair<MyType*, std::size_t> res;
- res = segment.find<MyType> ("MyType array");
-
- std::size_t array_len = res.second;
- //Length should be 1
- assert(array_len == 10);
-
- //Find the array and the object
- res = segment.find<MyType> ("MyType instance");
-
- std::size_t len = res.second;
-
- //Length should be 1
- assert(len == 1);
-
- //Change data
- // . . .
-
- //We're done, delete array from memory
- segment.destroy<MyType>("MyType array");
- //We're done, delete object from memory
- segment.destroy<MyType>("MyType instance");
- }
-
- MyType *anonymous = segment.construct<MyType>(anonymous_instance)
- [10] //number of elements
- (1, //ctor first argument
- 1); //ctor second argument
-
- segment.destroy_ptr(anonymous);
-
- segment.construct<MyType>(unique_instance)
- [10] //number of elements
- (1, //ctor first argument
- 1); //ctor second argument
-
- std::pair<MyType *,std::size_t> ret = segment.find<MyType>(unique_instance);
-
- segment.destroy<MyType>(unique_instance);
- return 0;
-}
-
-#include <boost/interprocess/detail/config_end.hpp>
Deleted: trunk/libs/interprocess/example/print_container.hpp
==============================================================================
--- trunk/libs/interprocess/example/print_container.hpp 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,38 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztañaga 2004-2006. 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_PRINTCONTAINER_HPP
-#define BOOST_PRINTCONTAINER_HPP
-#include <boost/interprocess/detail/config_begin.hpp>
-#include <boost/interprocess/detail/workaround.hpp>
-
-#include <functional>
-#include <iostream>
-#include <algorithm>
-
-struct PrintValues : public std::unary_function<int, void>
-{
- void operator() (int value) const
- {
- std::cout << value << " ";
- }
-};
-
-template<class Container>
-void PrintContents(const Container &cont, const char *contName)
-{
- std::cout<< "Printing contents of " << contName << std::endl;
- std::for_each(cont.begin(), cont.end(), PrintValues());
- std::cout<< std::endl << std::endl;
-}
-
-#include <boost/interprocess/detail/config_end.hpp>
-
-#endif //#ifndef BOOST_PRINTCONTAINER_HPP
Deleted: trunk/libs/interprocess/example/printcontainer.hpp
==============================================================================
--- trunk/libs/interprocess/example/printcontainer.hpp 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,38 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztañaga 2004-2006. 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_PRINTCONTAINER_HPP
-#define BOOST_PRINTCONTAINER_HPP
-#include <boost/interprocess/detail/config_begin.hpp>
-#include <boost/interprocess/detail/workaround.hpp>
-
-#include <functional>
-#include <iostream>
-#include <algorithm>
-
-struct PrintValues : public std::unary_function<int, void>
-{
- void operator() (int value) const
- {
- std::cout << value << " ";
- }
-};
-
-template<class Container>
-void PrintContents(const Container &cont, const char *contName)
-{
- std::cout<< "Printing contents of " << contName << std::endl;
- std::for_each(cont.begin(), cont.end(), PrintValues());
- std::cout<< std::endl << std::endl;
-}
-
-#include <boost/interprocess/detail/config_end.hpp>
-
-#endif //#ifndef BOOST_PRINTCONTAINER_HPP
Deleted: trunk/libs/interprocess/example/process_a_example.cpp
==============================================================================
--- trunk/libs/interprocess/example/process_a_example.cpp 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,81 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztañaga 2004-2006. 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>
-
-#include <boost/interprocess/offset_ptr.hpp>
-#include <boost/interprocess/allocators/allocator.hpp>
-#include <boost/interprocess/managed_shared_memory.hpp>
-#include "print_container.hpp"
-#include <algorithm>
-#include <boost/interprocess/sync/named_semaphore.hpp>
-#include <boost/interprocess/containers/vector.hpp>
-#include <boost/interprocess/sync/interprocess_condition.hpp>
-
-using namespace boost::interprocess;
-
-int main ()
-{
- //Shared memory attributes
- const int memsize = 65536;
- const char *const shMemName = "MySharedMemory";
-
- //Create sems for synchronization
- named_semaphore semA(open_or_create, "processAsem", 0);
- named_semaphore semB(open_or_create, "processBsem", 0);
-
- //Create shared memory
- managed_shared_memory segment(open_or_create, shMemName, memsize);
-
- //STL compatible allocator object, uses allocate(), deallocate() functions
- typedef allocator<int, managed_shared_memory::segment_manager>
- shmem_allocator_int_t;
-
- const int num_elements = 100;
-
- //Type of shared memory vector
- typedef vector<int, shmem_allocator_int_t > MyVect;
-
- const shmem_allocator_int_t &alloc_ref (segment.get_segment_manager());
-
- //Creating the vector in shared memory
- std::cout << "Named New of ShmVect\n\n";
- MyVect *shmem_vect = segment.construct<MyVect> ("ShmVect")(alloc_ref);
-
- offset_ptr<MyVect> shmptr_vect = 0;
- offset_ptr<MyVect> other_shmptr_vect = 0;
-
- //Fill the vector
- std::cout << "Filling ShmVect\n\n";
- int i;
- for(i = 0; i < num_elements; ++i){
- shmem_vect->push_back(i);
- }
-
- //Printing contents before waiting to second process
- PrintContents(*shmem_vect, "ShmVect");
-
- //Wake up other process and sleeping until notified
- semB.post();
- std::cout << "Waking up processB and waiting sorting\n\n";
- semA.wait();
-
- //Notification received, let's see the changes
- std::cout << "processB sorting complete\n\n";
- PrintContents(*shmem_vect, "ShmVect");
-
- //Let's delete the vector from memory
- std::cout << "Deleting the vector with destroy\n\n";
- segment.destroy<MyVect> ("ShmVect");
- std::cout << "vector deleted\n\n";
- return 0;
-}
-
-#include <boost/interprocess/detail/config_end.hpp>
Deleted: trunk/libs/interprocess/example/process_a_fixed_example.cpp
==============================================================================
--- trunk/libs/interprocess/example/process_a_fixed_example.cpp 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,82 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztañaga 2004-2006. 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>
-
-#include <boost/interprocess/offset_ptr.hpp>
-#include <boost/interprocess/allocators/allocator.hpp>
-#include <boost/interprocess/managed_shared_memory.hpp>
-#include <boost/interprocess/mem_algo/simple_seq_fit.hpp>
-#include "print_container.hpp"
-#include <boost/interprocess/sync/named_semaphore.hpp>
-#include <boost/interprocess/sync/interprocess_condition.hpp>
-#include <algorithm>
-#include <vector>
-
-using namespace boost::interprocess;
-
-int main ()
-{
- //Shared memory attributes
- const int memsize = 65536;
- const char *const shMemName = "MySharedMemory";
- const void *const map_addr = reinterpret_cast<const void*>(0x30000000);
-
- //Create sems for synchronization
- named_semaphore semA(open_or_create, "processAsem", 0);
- named_semaphore semB(open_or_create, "processBsem", 0);
-
- //Create shared memory
- fixed_managed_shared_memory segment(create_only, shMemName, memsize, map_addr);
-
- //STL compatible allocator object, uses allocate(), deallocate() functions
- typedef allocator<int, fixed_managed_shared_memory::segment_manager>
- shmem_allocator_int_t;
- const int num_elements = 100;
-
- //Type of shared memory vector
- typedef std::vector<int, shmem_allocator_int_t > MyVect;
-
- const shmem_allocator_int_t alloc_inst (segment.get_segment_manager());
-
- //Creating the vector in shared memory
- std::cout << "Named New of ShmVect\n\n";
- MyVect *shmem_vect = segment.construct<MyVect> ("ShmVect")(alloc_inst);
-
- offset_ptr<MyVect> shmptr_vect = 0;
- offset_ptr<MyVect> other_shmptr_vect = 0;
-
- //Fill the vector
- std::cout << "Filling ShmVect\n\n";
- int i;
- for(i = 0; i < num_elements; ++i){
- shmem_vect->push_back(i);
- }
-
- //Printing contents before waiting to second process
- PrintContents(*shmem_vect, "ShmVect");
-
- //Wake up other process and sleeping until notified
- semB.post();
- std::cout << "Waking up processB and waiting sorting\n\n";
- semA.wait();
-
- //Notification received, let's see the changes
- std::cout << "processB sorting complete\n\n";
- PrintContents(*shmem_vect, "ShmVect");
-
- //Let's delete the vector from memory
- std::cout << "Deleting the vector with destroy\n\n";
- segment.destroy<MyVect> ("ShmVect");
- std::cout << "vector deleted\n\n";
- return 0;
-}
-
-#include <boost/interprocess/detail/config_end.hpp>
Deleted: trunk/libs/interprocess/example/process_b_example.cpp
==============================================================================
--- trunk/libs/interprocess/example/process_b_example.cpp 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,71 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztañaga 2004-2006. 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>
-
-#include <boost/interprocess/allocators/allocator.hpp>
-#include <boost/interprocess/managed_shared_memory.hpp>
-#include <boost/interprocess/containers/vector.hpp>
-#include <boost/interprocess/sync/named_semaphore.hpp>
-
-#include "print_container.hpp"
-#include <algorithm>
-
-using namespace boost::interprocess;
-
-int main ()
-{
- //Shared memory attributes
- const char *const shMemName = "MySharedMemory";
-
- //Create sems for synchronization
- named_semaphore semA(open_or_create, "processAsem", 0);
- named_semaphore semB(open_or_create, "processBsem", 0);
-
- //Wait until the shared memory is ready
- semB.wait();
-
- //Create shared memory
- managed_shared_memory segment(open_or_create, shMemName, 65536);
-
- //STL compatible allocator object, uses allocate(), deallocate() functions
- typedef allocator<int, managed_shared_memory::segment_manager>
- shmem_allocator_int_t;
-
- //This is the shared memory vector type
- typedef vector<int, shmem_allocator_int_t > MyVect;
-
- //Finding vector in shared memory and printing contents
- std::cout << "Connecting to object ShmVect\n\n";
- MyVect *shmem_vect = segment.find<MyVect>("ShmVect").first;
- PrintContents(*shmem_vect, "ShmVect");
-
- //Reverse sorting the vector with std::sort
- std::cout << "Reverse sorting ShmVect\n\n";
- MyVect::reverse_iterator rbeg =
- shmem_vect->rbegin(), rend = shmem_vect->rend();
- std::sort(shmem_vect->rbegin(), shmem_vect->rend());
- std::sort(rbeg, rend);
-
- //Printing values after sorting
- std::cout << "Sorting complete\n\n";
- PrintContents(*shmem_vect, "ShmVect");
-
- //Waking up process A
- std::cout << "Waking up processA\n\n";
- semA.post();
-
- //We're done, closing shared memory
- std::cout << "Closing shmem segment\n\n";
-
- return 0;
-}
-
-#include <boost/interprocess/detail/config_end.hpp>
Deleted: trunk/libs/interprocess/example/process_b_fixed_example.cpp
==============================================================================
--- trunk/libs/interprocess/example/process_b_fixed_example.cpp 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,69 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztañaga 2004-2006. 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>
-
-#include <boost/interprocess/allocators/allocator.hpp>
-#include <boost/interprocess/managed_shared_memory.hpp>
-#include <boost/interprocess/sync/named_semaphore.hpp>
-
-#include "print_container.hpp"
-#include <vector>
-#include <algorithm>
-
-using namespace boost::interprocess;
-
-int main ()
-{
- //Shared memory attributes
- const char *const shMemName = "MySharedMemory";
- const void *const map_addr = reinterpret_cast<const void*>(0x30000000);
-
- //Create sems for synchronization
- named_semaphore semA(open_or_create, "processAsem", 1);
- named_semaphore semB(open_or_create, "processBsem", 1);
-
- //Wait until the shared memory is ready
- semB.wait();
-
- //Create shared memory
- fixed_managed_shared_memory segment(open_only, shMemName, map_addr);
-
- //STL compatible allocator object, uses allocate(), deallocate() functions
- typedef allocator<int,fixed_managed_shared_memory::segment_manager>
- shmem_allocator_int_t;
-
- //This is the shared memory vector type
- typedef std::vector<int, shmem_allocator_int_t > MyVect;
-
- //Finding vector in shared memory and printing contents
- std::cout << "Connecting to object ShmVect\n\n";
- MyVect *shmem_vect = segment.find<MyVect>("ShmVect").first;
- PrintContents(*shmem_vect, "ShmVect");
-
- //Reverse sorting the vector with std::sort
- std::cout << "Reverse sorting ShmVect\n\n";
- std::sort(shmem_vect->rbegin(), shmem_vect->rend());
-
- //Printing values after sorting
- std::cout << "Sorting complete\n\n";
- PrintContents(*shmem_vect, "ShmVect");
-
- //Waking up process A
- std::cout << "Waking up processA\n\n";
- semA.post();
-
- //We're done, closing shared memory
- std::cout << "Closing shmem segment\n\n";
- return 0;
-}
-
-#include <boost/interprocess/detail/config_end.hpp>
-
Modified: trunk/libs/interprocess/proj/conceptgcc/MakeAll
==============================================================================
--- trunk/libs/interprocess/proj/conceptgcc/MakeAll (original)
+++ trunk/libs/interprocess/proj/conceptgcc/MakeAll 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
@@ -1,35 +1,35 @@
-
-#ifndef CC
-CC=i686-pc-cygwin-conceptg++.exe
-#endif
-
-BOOST_ROOT=../../../..
-
-INTERPROCESS_CPP := $(wildcard ../../src/*.cpp)
-INTERPROCESS_OBJ := $(patsubst ../../src/%.cpp, lib_%.o, $(INTERPROCESS_CPP))
-
-INTERPROCESSTEST_CPP := $(wildcard ../../test/*.cpp)
-INTERPROCESSTEST_OUT := $(patsubst ../../test/%.cpp, ../../bin/conceptgcc/test_%.out, $(INTERPROCESSTEST_CPP))
-
-INTERPROCESSDOC_CPP := $(wildcard ../../example/*.cpp)
-INTERPROCESSDOC_OUT := $(patsubst ../../example/%.cpp, ../../bin/conceptgcc/ex_%.out, $(INTERPROCESSDOC_CPP))
-
-LIBDIR:= ../../../../stage/lib
-
-.PHONY: createdir clean
-
-all: createdir $(INTERPROCESSTEST_OUT) $(INTERPROCESSDOC_OUT)
- @cd .
-
-createdir:
- @mkdir -p ../../bin/conceptgcc
-
-../../bin/conceptgcc/test_%.out: ../../test/%.cpp
- $(CC) $< -Wall -DBOOST_DATE_TIME_NO_LIB -L$(LIBDIR) -lboost_thread-mgw-mt -I$(BOOST_ROOT) -lstdc++ -o $@
-
-../../bin/conceptgcc/ex_%.out: ../../example/%.cpp
- $(CC) $< -Wall -DBOOST_DATE_TIME_NO_LIB -L$(LIBDIR)-lboost_thread-mgw-mt -I$(BOOST_ROOT) -lstdc++ -o $@
-
-clean:
- rm -f *.o
- rm -f ../../bin/conceptgcc/*
+
+#ifndef CC
+CC=i686-pc-cygwin-conceptg++.exe
+#endif
+
+BOOST_ROOT=../../../..
+
+INTERPROCESS_CPP := $(wildcard ../../src/*.cpp)
+INTERPROCESS_OBJ := $(patsubst ../../src/%.cpp, lib_%.o, $(INTERPROCESS_CPP))
+
+INTERPROCESSTEST_CPP := $(wildcard ../../test/*.cpp)
+INTERPROCESSTEST_OUT := $(patsubst ../../test/%.cpp, ../../bin/conceptgcc/test_%.out, $(INTERPROCESSTEST_CPP))
+
+INTERPROCESSDOC_CPP := $(wildcard ../../example/*.cpp)
+INTERPROCESSDOC_OUT := $(patsubst ../../example/%.cpp, ../../bin/conceptgcc/ex_%.out, $(INTERPROCESSDOC_CPP))
+
+LIBDIR:= ../../../../stage/lib
+
+.PHONY: createdir clean
+
+all: createdir $(INTERPROCESSTEST_OUT) $(INTERPROCESSDOC_OUT)
+ @cd .
+
+createdir:
+ @mkdir -p ../../bin/conceptgcc
+
+../../bin/conceptgcc/test_%.out: ../../test/%.cpp
+ $(CC) $< -Wall -DBOOST_DATE_TIME_NO_LIB -L$(LIBDIR) -lboost_thread-mgw-mt -I$(BOOST_ROOT) -lstdc++ -o $@
+
+../../bin/conceptgcc/ex_%.out: ../../example/%.cpp
+ $(CC) $< -Wall -DBOOST_DATE_TIME_NO_LIB -L$(LIBDIR)-lboost_thread-mgw-mt -I$(BOOST_ROOT) -lstdc++ -o $@
+
+clean:
+ rm -f *.o
+ rm -f ../../bin/conceptgcc/*
Modified: trunk/libs/interprocess/proj/cygwin/MakeAll
==============================================================================
--- trunk/libs/interprocess/proj/cygwin/MakeAll (original)
+++ trunk/libs/interprocess/proj/cygwin/MakeAll 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
@@ -1,39 +1,39 @@
-
-ifndef CC
-CC=g++
-endif
-
-BOOST_ROOT=../../../..
-
-INTERPROCESS_CPP := $(wildcard ../../src/*.cpp)
-INTERPROCESS_OBJ := $(patsubst ../../src/%.cpp, lib_%.o, $(INTERPROCESS_CPP))
-
-INTERPROCESSTEST_CPP := $(wildcard ../../test/*.cpp)
-INTERPROCESSTEST_OUT := $(patsubst ../../test/%.cpp, ../../bin/cygwin/test_%.out, $(INTERPROCESSTEST_CPP))
-
-INTERPROCESSEXAMPLE_CPP := $(wildcard ../../example/*.cpp)
-INTERPROCESSEXAMPLE_OUT := $(patsubst ../../example/%.cpp, ../../bin/cygwin/ex_%.out, $(INTERPROCESSEXAMPLE_CPP))
-
-INTERPROCESSEXAMPLE_CPP := $(wildcard ../../example/*.cpp)
-INTERPROCESSEXAMPLE_OUT := $(patsubst ../../example/%.cpp, ../../bin/cygwin/ex__%.out, $(INTERPROCESSEXAMPLE_CPP))
-
-LIBDIR:= ../../../../stage/lib
-
-.PHONY: createdir clean
-
-all: createdir $(INTERPROCESSEXAMPLE_OUT) $(INTERPROCESSTEST_OUT) $(INTERPROCESSEXAMPLE_OUT)
- @cd .
-
-createdir:
- @mkdir -p ../../bin/cygwin
-
-../../bin/cygwin/test_%.out: ../../test/%.cpp
- $(CC) -g $< -Wall -DBOOST_DATE_TIME_NO_LIB -L$(LIBDIR) -lboost_thread-gcc-mt -I$(BOOST_ROOT) -lstdc++ -o $@
-
-../../bin/cygwin/ex_%.out: ../../example/%.cpp
- $(CC) -g $< -Wall -DBOOST_DATE_TIME_NO_LIB -L$(LIBDIR)-lboost_thread-gcc-mt -I$(BOOST_ROOT) -lstdc++ -o $@
-
-
-clean:
- rm -f *.o
- rm -f ../../bin/cygwin/*
+
+ifndef CC
+CC=g++
+endif
+
+BOOST_ROOT=../../../..
+
+INTERPROCESS_CPP := $(wildcard ../../src/*.cpp)
+INTERPROCESS_OBJ := $(patsubst ../../src/%.cpp, lib_%.o, $(INTERPROCESS_CPP))
+
+INTERPROCESSTEST_CPP := $(wildcard ../../test/*.cpp)
+INTERPROCESSTEST_OUT := $(patsubst ../../test/%.cpp, ../../bin/cygwin/test_%.out, $(INTERPROCESSTEST_CPP))
+
+INTERPROCESSEXAMPLE_CPP := $(wildcard ../../example/*.cpp)
+INTERPROCESSEXAMPLE_OUT := $(patsubst ../../example/%.cpp, ../../bin/cygwin/ex_%.out, $(INTERPROCESSEXAMPLE_CPP))
+
+INTERPROCESSEXAMPLE_CPP := $(wildcard ../../example/*.cpp)
+INTERPROCESSEXAMPLE_OUT := $(patsubst ../../example/%.cpp, ../../bin/cygwin/ex__%.out, $(INTERPROCESSEXAMPLE_CPP))
+
+LIBDIR:= ../../../../stage/lib
+
+.PHONY: createdir clean
+
+all: createdir $(INTERPROCESSEXAMPLE_OUT) $(INTERPROCESSTEST_OUT) $(INTERPROCESSEXAMPLE_OUT)
+ @cd .
+
+createdir:
+ @mkdir -p ../../bin/cygwin
+
+../../bin/cygwin/test_%.out: ../../test/%.cpp
+ $(CC) -g $< -Wall -DBOOST_DATE_TIME_NO_LIB -L$(LIBDIR) -lboost_thread-gcc-mt -I$(BOOST_ROOT) -lstdc++ -o $@
+
+../../bin/cygwin/ex_%.out: ../../example/%.cpp
+ $(CC) -g $< -Wall -DBOOST_DATE_TIME_NO_LIB -L$(LIBDIR)-lboost_thread-gcc-mt -I$(BOOST_ROOT) -lstdc++ -o $@
+
+
+clean:
+ rm -f *.o
+ rm -f ../../bin/cygwin/*
Modified: trunk/libs/interprocess/proj/linux/MakeAll
==============================================================================
--- trunk/libs/interprocess/proj/linux/MakeAll (original)
+++ trunk/libs/interprocess/proj/linux/MakeAll 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
@@ -1,32 +1,32 @@
-
-ifndef CC
-CC=g++
-endif
-
-BOOST_ROOT=../../../..
-BOOST_LIBS=/usr/local/lib
-
-
-INTERPROCESS_CPP := $(wildcard ../../test/*.cpp)
-INTERPROCESS_OUT := $(patsubst ../../test/%.cpp, ../../bin/linux/test_%.out, $(INTERPROCESS_CPP))
-
-INTERPROCESSEXAMPLE_CPP := $(wildcard ../../example/*.cpp)
-INTERPROCESSEXAMPLE_OUT := $(patsubst ../../example/%.cpp, ../../bin/linux/ex_%.out, $(INTERPROCESSEXAMPLE_CPP))
-
-.PHONY: createdir clean
-
-all: createdir $(INTERPROCESS_OUT) $(INTERPROCESSEXAMPLE_OUT)
- @cd .
-
-createdir:
- @mkdir -p ../../bin/linux
-
-../../bin/linux/test_%.out: ../../test/%.cpp
- $(CC) $< -Wall -pedantic -g -pthread -DBOOST_DATE_TIME_NO_LIB -lstdc++ -lrt -lboost_thread-gcc-mt -I$(BOOST_ROOT) -L$(BOOST_LIBS) -o $@
-
-../../bin/linux/ex_%.out: ../../example/%.cpp
- $(CC) $< -Wall -pedantic -g -pthread -DBOOST_DATE_TIME_NO_LIB -lstdc++ -lrt -lboost_thread-gcc-mt -I$(BOOST_ROOT) -L$(BOOST_LIBS) -o $@
-
-clean:
- rm -f *.o
- rm -f ../../bin/linux/*
+
+ifndef CC
+CC=g++
+endif
+
+BOOST_ROOT=../../../..
+BOOST_LIBS=/usr/local/lib
+
+
+INTERPROCESS_CPP := $(wildcard ../../test/*.cpp)
+INTERPROCESS_OUT := $(patsubst ../../test/%.cpp, ../../bin/linux/test_%.out, $(INTERPROCESS_CPP))
+
+INTERPROCESSEXAMPLE_CPP := $(wildcard ../../example/*.cpp)
+INTERPROCESSEXAMPLE_OUT := $(patsubst ../../example/%.cpp, ../../bin/linux/ex_%.out, $(INTERPROCESSEXAMPLE_CPP))
+
+.PHONY: createdir clean
+
+all: createdir $(INTERPROCESS_OUT) $(INTERPROCESSEXAMPLE_OUT)
+ @cd .
+
+createdir:
+ @mkdir -p ../../bin/linux
+
+../../bin/linux/test_%.out: ../../test/%.cpp
+ $(CC) $< -Wall -pedantic -g -pthread -DBOOST_DATE_TIME_NO_LIB -lstdc++ -lrt -lboost_thread-gcc-mt -I$(BOOST_ROOT) -L$(BOOST_LIBS) -o $@
+
+../../bin/linux/ex_%.out: ../../example/%.cpp
+ $(CC) $< -Wall -pedantic -g -pthread -DBOOST_DATE_TIME_NO_LIB -lstdc++ -lrt -lboost_thread-gcc-mt -I$(BOOST_ROOT) -L$(BOOST_LIBS) -o $@
+
+clean:
+ rm -f *.o
+ rm -f ../../bin/linux/*
Modified: trunk/libs/interprocess/proj/mingw/MakeAll
==============================================================================
--- trunk/libs/interprocess/proj/mingw/MakeAll (original)
+++ trunk/libs/interprocess/proj/mingw/MakeAll 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
@@ -1,35 +1,35 @@
-
-ifndef CC
-CC=g++
-endif
-
-BOOST_ROOT=../../../..
-
-INTERPROCESS_CPP := $(wildcard ../../src/*.cpp)
-INTERPROCESS_OBJ := $(patsubst ../../src/%.cpp, lib_%.o, $(INTERPROCESS_CPP))
-
-INTERPROCESSTEST_CPP := $(wildcard ../../test/*.cpp)
-INTERPROCESSTEST_OUT := $(patsubst ../../test/%.cpp, ../../bin/mingw/test_%.out, $(INTERPROCESSTEST_CPP))
-
-INTERPROCESSEXAMPLE_CPP := $(wildcard ../../example/*.cpp)
-INTERPROCESSEXAMPLE_OUT := $(patsubst ../../example/%.cpp, ../../bin/mingw/ex_%.out, $(INTERPROCESSEXAMPLE_CPP))
-
-LIBDIR:= ../../../../stage/lib
-
-.PHONY: createdir clean
-
-all: createdir $(INTERPROCESSTEST_OUT) $(INTERPROCESSEXAMPLE_OUT)
- @cd .
-
-createdir:
- @mkdir -p ../../bin/mingw
-
-../../bin/mingw/test_%.out: ../../test/%.cpp
- $(CC) $< -Wall -DBOOST_DATE_TIME_NO_LIB -L$(LIBDIR) -lboost_thread-mgw-mt -I$(BOOST_ROOT) -lstdc++ -o $@
-
-../../bin/mingw/ex_%.out: ../../example/%.cpp
- $(CC) $< -Wall -DBOOST_DATE_TIME_NO_LIB -L$(LIBDIR)-lboost_thread-mgw-mt -I$(BOOST_ROOT) -lstdc++ -o $@
-
-clean:
- rm -f *.o
- rm -f ../../bin/mingw/*
+
+ifndef CC
+CC=g++
+endif
+
+BOOST_ROOT=../../../..
+
+INTERPROCESS_CPP := $(wildcard ../../src/*.cpp)
+INTERPROCESS_OBJ := $(patsubst ../../src/%.cpp, lib_%.o, $(INTERPROCESS_CPP))
+
+INTERPROCESSTEST_CPP := $(wildcard ../../test/*.cpp)
+INTERPROCESSTEST_OUT := $(patsubst ../../test/%.cpp, ../../bin/mingw/test_%.out, $(INTERPROCESSTEST_CPP))
+
+INTERPROCESSEXAMPLE_CPP := $(wildcard ../../example/*.cpp)
+INTERPROCESSEXAMPLE_OUT := $(patsubst ../../example/%.cpp, ../../bin/mingw/ex_%.out, $(INTERPROCESSEXAMPLE_CPP))
+
+LIBDIR:= ../../../../stage/lib
+
+.PHONY: createdir clean
+
+all: createdir $(INTERPROCESSTEST_OUT) $(INTERPROCESSEXAMPLE_OUT)
+ @cd .
+
+createdir:
+ @mkdir -p ../../bin/mingw
+
+../../bin/mingw/test_%.out: ../../test/%.cpp
+ $(CC) $< -Wall -DBOOST_DATE_TIME_NO_LIB -L$(LIBDIR) -lboost_thread-mgw-mt -I$(BOOST_ROOT) -lstdc++ -o $@
+
+../../bin/mingw/ex_%.out: ../../example/%.cpp
+ $(CC) $< -Wall -DBOOST_DATE_TIME_NO_LIB -L$(LIBDIR)-lboost_thread-mgw-mt -I$(BOOST_ROOT) -lstdc++ -o $@
+
+clean:
+ rm -f *.o
+ rm -f ../../bin/mingw/*
Modified: trunk/libs/interprocess/proj/qnx/MakeAll
==============================================================================
--- trunk/libs/interprocess/proj/qnx/MakeAll (original)
+++ trunk/libs/interprocess/proj/qnx/MakeAll 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
@@ -1,33 +1,33 @@
-
-ifndef CC
-CC=g++
-endif
-
-BOOST_ROOT=../../../..
-
-INTERPROCESS_CPP := $(wildcard ../../src/*.cpp)
-INTERPROCESS_OBJ := $(patsubst ../../src/%.cpp, lib_%.o, $(INTERPROCESS_CPP))
-
-INTERPROCESSTEST_CPP := $(wildcard ../../test/*.cpp)
-INTERPROCESSTEST_OUT := $(patsubst ../../test/%.cpp, ../../bin/qnx/test_%.out, $(INTERPROCESSTEST_CPP))
-
-INTERPROCESSEXAMPLE_CPP := $(wildcard ../../example/*.cpp)
-INTERPROCESSEXAMPLE_OUT := $(patsubst ../../example/%.cpp, ../../bin/qnx/ex_%.out, $(INTERPROCESSEXAMPLE_CPP))
-
-.PHONY: createdir clean
-
-all: createdir $(INTERPROCESSTEST_OUT) $(INTERPROCESSEXAMPLE_OUT)
- @cd .
-
-createdir:
- @mkdir -p ../../bin/qnx
-
-../../bin/qnx/test_%.out: ../../test/%.cpp
- $(CC) $< -Wall -DBOOST_DATE_TIME_NO_LIB -lboost_thread-gcc-mt-s -I$(BOOST_ROOT) -o $@
-
-../../bin/qnx/ex_%.out: ../../example/%.cpp
- $(CC) $< -Wall -DBOOST_DATE_TIME_NO_LIB -lboost_thread-gcc-mt-s -I$(BOOST_ROOT) -o $@
-
-clean:
- rm -f *.o
- rm -f ../../bin/qnx/*
+
+ifndef CC
+CC=g++
+endif
+
+BOOST_ROOT=../../../..
+
+INTERPROCESS_CPP := $(wildcard ../../src/*.cpp)
+INTERPROCESS_OBJ := $(patsubst ../../src/%.cpp, lib_%.o, $(INTERPROCESS_CPP))
+
+INTERPROCESSTEST_CPP := $(wildcard ../../test/*.cpp)
+INTERPROCESSTEST_OUT := $(patsubst ../../test/%.cpp, ../../bin/qnx/test_%.out, $(INTERPROCESSTEST_CPP))
+
+INTERPROCESSEXAMPLE_CPP := $(wildcard ../../example/*.cpp)
+INTERPROCESSEXAMPLE_OUT := $(patsubst ../../example/%.cpp, ../../bin/qnx/ex_%.out, $(INTERPROCESSEXAMPLE_CPP))
+
+.PHONY: createdir clean
+
+all: createdir $(INTERPROCESSTEST_OUT) $(INTERPROCESSEXAMPLE_OUT)
+ @cd .
+
+createdir:
+ @mkdir -p ../../bin/qnx
+
+../../bin/qnx/test_%.out: ../../test/%.cpp
+ $(CC) $< -Wall -DBOOST_DATE_TIME_NO_LIB -lboost_thread-gcc-mt-s -I$(BOOST_ROOT) -o $@
+
+../../bin/qnx/ex_%.out: ../../example/%.cpp
+ $(CC) $< -Wall -DBOOST_DATE_TIME_NO_LIB -lboost_thread-gcc-mt-s -I$(BOOST_ROOT) -o $@
+
+clean:
+ rm -f *.o
+ rm -f ../../bin/qnx/*
Added: trunk/libs/interprocess/proj/to-do.txt
==============================================================================
--- (empty file)
+++ trunk/libs/interprocess/proj/to-do.txt 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
@@ -0,0 +1,73 @@
+-> Implement zero_memory flag for allocation_command
+
+-> Add explanations about system libraries (-lrt) or options (-pthread) to be added
+ to the command line.
+
+-> The general allocation funtion can be improved with some fixed size allocation bins.
+
+-> Update the documentation about memory algorithms with explanations about new functions.
+
+-> Adapt error reporting to TR1 system exceptions
+
+-> Improve exception messages
+
+-> Movability of containers should depend on the no-throw guarantee of allocators copy constructor
+
+-> Check self-assignment for vectors
+
+-> Detect POD data in vector/deque to use memcpy and minimize code.
+
+-> Update writing a new memory allocator explaining new functions (like alignment)
+
+-> private node allocators could take the number of nodes as a runtime parameter.
+
+-> Explain how to build intrusive indexes.
+
+-> Add intrusive index types as available indexes.
+
+-> Add maximum alignment allocation limit in PageSize bytes. Otherwise, we can't
+ guarantee alignment for process-shared allocations.
+
+-> Add default algorithm and index types. The user does not need to know how are
+ they implemented.
+
+-> Add private mapping to managed classes.
+
+-> Add unique_ptr documentation.
+
+-> Pass max size check in allocation to node pools
+
+-> Add atomic_func explanation in docs
+
+-> Once shrink to fit indexes is implemented test all memory has been deallocated
+ in tests to detect leaks/implementation failures.
+
+-> Improve allocate_many functions to allocate all the nodes forming a singly
+ linked list of nodes.
+
+-> rbtree_algorithms can be improved wrt the balanced tree. When erasing the old
+ node and inserting the new (expanded or shrunk) check if the position should
+ be the same. If so, avoid erase() + insert() and just update the size.
+
+-> Use in-place expansion capabilities to shrink_to_fit and reserve functions
+ from iunordered_index.
+
+-> Refactor pool allocators to extract common operations
+
+-> Shrink in place interface is not adequate for with objects that don't have
+ a trivial destructor: how many destructors can we call before deallocating
+ the memory? Options:
+ 1. Call destructors in the low-level shrink function (but this might lead to
+ deadlock)
+ 2. Offer a function to know how much can we shrink (but destructor + shrinking
+ would not be atomic so we must guarantee that shrinking will succeed).
+
+-> Optimize copy_n with std::copy in vector. Revise other functions to improve optimizations
+
+-> Keep an eye on container iterator constness issue to bring Interprocess containers up-to-date.
+
+-> change unique_ptr to avoid using compressed_pair
+
+-> Improve unique_ptr test to test move assignment and other goodies like assigment from null
+
+-> barrier_test fails on MacOS X on PowerPC.
\ No newline at end of file
Modified: trunk/libs/interprocess/proj/vc7ide/Interprocess.sln
==============================================================================
--- trunk/libs/interprocess/proj/vc7ide/Interprocess.sln (original)
+++ trunk/libs/interprocess/proj/vc7ide/Interprocess.sln 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
@@ -1,799 +1,823 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shared_memory_mapping_test", "shared_memory_mappable_test.vcproj", "{5CE18C83-6025-36FE-A4F7-BA09176D3A11}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shared_memory_test", "shared_memory_test.vcproj", "{5E2838CC-0916-8F4E-A4F7-93506BA0D310}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shared_ptr_test", "shared_ptr_test.vcproj", "{5371C383-6092-1238-A877-BAEB37867609}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "slist_test", "slist_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792608}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "string_test", "string_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D4A792607}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tree_test", "tree_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792606}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "upgradable_mutex_test", "upgradable_mutex.vcproj", "{4E88C1C2-0961-F7A4-F48E-A6A7D3B06004}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "user_buffer_test", "user_buffer_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792603}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vectorstream_test", "vectorstream_test.vcproj", "{58CCE183-6032-12FE-A4F7-BA893A767601}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vector_test", "vector_test.vcproj", "{5CE11C83-096A-84FE-4FA2-D3A6BA792002}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "named_condition_test", "named_condition_test.vcproj", "{58CC2563-6092-48FE-FAF7-BA046A792658}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_anonymous_mutexA", "doc_anonymous_mutexA.vcproj", "{58C1B183-9026-4E63-12F2-005412200054}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_anonymous_mutexB", "doc_anonymous_mutexB.vcproj", "{58C1B183-9026-4E63-12F2-005202441254}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_named_mutex", "doc_named_mutex.vcproj", "{58C181B3-9516-463E-2F12-122155400054}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_anonymous_conditionA", "doc_anonymous_conditionA.vcproj", "{5C1B8183-0296-4F83-1F22-001005220544}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_anonymous_conditionB", "doc_anonymous_conditionB.vcproj", "{58C1FE83-2906-E643-2F12-024410052254}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_named_conditionA", "doc_named_conditionA.vcproj", "{58EB1CB3-1354-364E-12F2-154356612054}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_named_conditionB", "doc_named_conditionB.vcproj", "{58181CB3-5134-634E-12F2-155435622054}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_anonymous_semaphoreA", "doc_anonymous_semaphoreA.vcproj", "{5CB81183-29FB-F843-24FF-022050100544}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_anonymous_semaphoreB", "doc_anonymous_semaphoreB.vcproj", "{58FBE8C3-9026-FAB2-E643-000522441254}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "named_upgradable_mutex_test", "named_upgradable_mutex.vcproj", "{48C1FBE8-F7A4-0961-48FE-7D93A63B0A04}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_anonymous_upgradable_mutexA", "doc_anonymous_upgradable_mutexA.vcproj", "{5C18831B-F162-FA96-E6C3-FA5122040054}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_anonymous_upgradable_mutexB", "doc_anonymous_upgradable_mutexB.vcproj", "{5C1B1043-1EFF-2793-4E63-245241283054}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_message_queueA", "doc_message_queueA.vcproj", "{51B189C3-4E63-9026-12F2-12200AF54054}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_message_queueB", "doc_message_queueB.vcproj", "{5C1B1813-12C2-0296-4E63-244549126520}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_cont", "doc_cont.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792653}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_contA", "doc_contA.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792652}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_contB", "doc_contB.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792651}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_shared_memory", "doc_shared_memory.vcproj", "{58CCE183-6032-12FE-4FC7-83A79F760B61}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unique_ptr_test", "unique_ptr_test.vcproj", "{571C3383-6092-A877-1238-B3786BAE7605}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_move_containers", "doc_move_containers.vcproj", "{58C1B183-0296-EA42-EF04-005120054104}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "map_index_allocation_test", "map_index_allocation_test.vcproj", "{588CCD13-2962-83FE-F4B7-92230DB73629}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "flat_map_index_allocation_test", "flat_map_index_allocation_test.vcproj", "{51D8E9C3-2D65-48FE-3AA7-7922C0E36329}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iset_index_allocation_test", "iset_index_allocation_test.vcproj", "{58BD1CC3-6972-F3F7-84BE-0DB736035922}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iunordered_set_index_allocation_test", "iunordered_set_index_allocation_test.vcproj", "{5BD1C7C3-3F7F-6972-84BE-B731D9236035}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_shared_memory2", "doc_shared_memory2.vcproj", "{58CE1D83-F31E-4FD7-6132-8A79F6307B61}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_file_mapping2", "doc_file_mapping2.vcproj", "{5CE19883-F413-7EFD-6342-B79639F7B611}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_file_mapping", "doc_file_mapping.vcproj", "{58DE18C3-3261-2F3E-FD47-83760B9FA761}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_map", "doc_map.vcproj", "{59CEC183-8192-8F6D-4FB7-BA260A79D352}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "windows_shared_memory_test", "windows_shared_memory_test.vcproj", "{E385C28C-0691-4FA7-F48E-935BA0D06310}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "windows_shared_memory_mapping_test", "windows_shared_memory_mapping_test.vcproj", "{518CE8C3-6512-FA75-46EF-B917A3A116D1}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "managed_windows_shared_memory_test", "managed_windows_shared_memory.vcproj", "{5D18CE83-1926-7AE4-FE94-B606D9B23131}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "adaptive_pool_test", "adaptive_pool_test.vcproj", "{58CE1D84-1962-4FE9-BA0D-A4F7973A4652}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cached_adaptive_pool_test", "cached_adaptive_pool_test.vcproj", "{5188E3CE-2964-F43E-FB87-B037AC692D59}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "private_adaptive_pool_test", "private_adaptive_pool_test.vcproj", "{5CE14C83-4962-8F5E-4FA7-B0D3A7B93635}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_allocator", "doc_allocator.vcproj", "{581B1C83-4E12-9526-020F-012482540054}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_node_allocator", "doc_node_allocator.vcproj", "{51B17C83-E172-5396-0FA2-825472008554}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_private_node_allocator", "doc_private_node_allocator.vcproj", "{2B75C833-17D2-4956-A23F-820854254175}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_cached_node_allocator", "doc_cached_node_allocator.vcproj", "{283AD375-7D12-5866-23BF-854308651275}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_adaptive_pool", "doc_adaptive_pool.vcproj", "{57C832B1-17D2-9537-FA12-827220448554}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_cached_adaptive_pool", "doc_cached_adaptive_pool.vcproj", "{536C8251-7E12-9537-A1E2-822073258554}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_private_adaptive_pool", "doc_private_adaptive_pool.vcproj", "{83258CB1-127E-9375-F872-8324A1054454}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_managed_raw_allocation", "doc_managed_raw_allocation.vcproj", "{5198EFC3-2731-F34E-4FD8-1859AC94F761}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_managed_aligned_allocation", "doc_managed_aligned_allocation.vcproj", "{58DE18C3-3261-2F3E-FD47-83760B9FA761}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_interprocesslib", "interprocesslib.vcproj", "{FFAA56F1-32EC-4B22-B6BD-95A311A67C35}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_windows_shared_memory", "doc_windows_shared_memory.vcproj", "{5E17C9C3-1362-2E1E-C84F-8A76B6739F21}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_windows_shared_memory2", "doc_windows_shared_memory2.vcproj", "{5E1D6C83-31DE-4F6F-6132-87A9FB663041}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "adaptive_node_pool_test", "adaptive_node_pool_test.vcproj", "{CD57C283-1862-42FE-BF87-B96D3A2A7912}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "node_pool_test", "node_pool_test.vcproj", "{8A519DC3-6092-A4FE-F748-BA91328D6522}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "deque_test", "deque_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792655}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "barrier_test", "barrier_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792661}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bufferstream_test", "bufferstream_test.vcproj", "{58C183CE-6203-FE12-A237-BA8976695960}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cached_node_allocator_test", "cached_node_allocator_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792659}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "private_node_allocator_test", "private_node_allocator_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792620}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "node_allocator_test", "node_allocator_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792622}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "named_mutex_test", "named_mutex_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792625}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "named_recursive_mutex_test", "named_recursive_mutex_test.vcproj", "{5C83CE18-4F48-A7FE-6092-B7920AD3A624}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "named_semaphore_test", "named_semaphore_test.vcproj", "{58CCE283-1609-48FE-A4F7-BA0D3A793523}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_managed_heap_memory", "doc_managed_heap_memory.vcproj", "{58CCE183-6092-48FE-A4FC-BA0D3A792647}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "allocexcept_test", "allocexcept_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792662}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "condition_test", "condition_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792658}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "data_test", "data_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792657}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_bufferstream", "doc_bufferstream.vcproj", "{58C1B183-9026-4E12-00F2-001200540054}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_intrusive", "doc_intrusive.vcproj", "{5E18CC83-6092-48FE-A677-B832A0D3A650}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_ipc_messageA", "doc_ipc_messageA.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792649}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_ipc_messageB", "doc_ipc_messageB.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792648}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_managed_mapped_file", "doc_managed_mapped_file.vcproj", "{58CCE183-5091-48FE-A4FC-BA0D3A792446}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_named_allocA", "doc_named_allocA.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792645}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_named_allocB", "doc_named_allocB.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792644}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_offset_ptr", "doc_offset_ptr.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792643}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_scoped_ptr", "doc_scoped_ptr.vcproj", "{58CC8E13-0962-8F4E-77A6-BD3A6832A042}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_vectorstream", "doc_vectorstream.vcproj", "{58C1B183-9260-4E8F-F200-000000000041}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_where_allocate", "doc_where_allocate.vcproj", "{58CCE183-6092-48FE-A677-BA0D3A832640}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "file_mapping_test", "file_mapping_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792638}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "flat_tree_test", "flat_tree_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792637}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "intrusive_ptr_test", "intrusive_ptr_test.vcproj", "{5821C383-6092-12FE-A877-BA0D33467633}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "list_test", "list_ex.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792632}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "managed_mapped_file_test", "managed_mapped_file_test.vcproj", "{5CCE1883-0926-F7A4-8FE4-BA0606D92331}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mapped_file_test", "mapped_file_test.vcproj", "{5C6D9CE1-2609-F7A4-8FE4-BA0883602330}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "memory_algorithm_test", "memory_algorithm_test.vcproj", "{58E18CC3-6092-8F4E-A3E7-A792230D3629}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "message_queue_test", "message_queue.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792628}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mutex_test", "mutex_test.vcproj", "{83581CCE-487E-3292-A4E7-BA07926D3A27}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "null_index_test", "null_index_test.vcproj", "{0000058C-0000-0000-0000-000000000021}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "recursive_mutex_test", "recursive_mutex_test.vcproj", "{83581CCE-487E-3292-A4E7-BA07926D3A14}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "semaphore_test", "semaphore_test.vcproj", "{5CE28C83-48FE-1676-4FA7-B50D3A76A013}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_managed_multiple_allocation", "doc_managed_multiple_allocation.vcproj", "{818C43EE-3561-F3AE-4FD7-8A2076E76A31}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_managed_allocation_command", "doc_managed_allocation_command.vcproj", "{5189DEA3-3261-F33E-47ED-83BC69F66061}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_managed_construction_info", "doc_managed_construction_info.vcproj", "{5C82D1D3-3861-3AF1-03EF-89AED4716761}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- Debug = Debug
- Release = Release
- EndGlobalSection
- GlobalSection(ProjectDependencies) = postSolution
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {5CE18C83-6025-36FE-A4F7-BA09176D3A11}.Debug.ActiveCfg = Debug|Win32
- {5CE18C83-6025-36FE-A4F7-BA09176D3A11}.Debug.Build.0 = Debug|Win32
- {5CE18C83-6025-36FE-A4F7-BA09176D3A11}.Release.ActiveCfg = Release|Win32
- {5CE18C83-6025-36FE-A4F7-BA09176D3A11}.Release.Build.0 = Release|Win32
- {5E2838CC-0916-8F4E-A4F7-93506BA0D310}.Debug.ActiveCfg = Debug|Win32
- {5E2838CC-0916-8F4E-A4F7-93506BA0D310}.Debug.Build.0 = Debug|Win32
- {5E2838CC-0916-8F4E-A4F7-93506BA0D310}.Release.ActiveCfg = Release|Win32
- {5E2838CC-0916-8F4E-A4F7-93506BA0D310}.Release.Build.0 = Release|Win32
- {5371C383-6092-1238-A877-BAEB37867609}.Debug.ActiveCfg = Debug|Win32
- {5371C383-6092-1238-A877-BAEB37867609}.Debug.Build.0 = Debug|Win32
- {5371C383-6092-1238-A877-BAEB37867609}.Release.ActiveCfg = Release|Win32
- {5371C383-6092-1238-A877-BAEB37867609}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792608}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792608}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792608}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792608}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D4A792607}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D4A792607}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D4A792607}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D4A792607}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Release.Build.0 = Release|Win32
- {4E88C1C2-0961-F7A4-F48E-A6A7D3B06004}.Debug.ActiveCfg = Debug|Win32
- {4E88C1C2-0961-F7A4-F48E-A6A7D3B06004}.Debug.Build.0 = Debug|Win32
- {4E88C1C2-0961-F7A4-F48E-A6A7D3B06004}.Release.ActiveCfg = Release|Win32
- {4E88C1C2-0961-F7A4-F48E-A6A7D3B06004}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792603}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792603}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792603}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792603}.Release.Build.0 = Release|Win32
- {58CCE183-6032-12FE-A4F7-BA893A767601}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6032-12FE-A4F7-BA893A767601}.Debug.Build.0 = Debug|Win32
- {58CCE183-6032-12FE-A4F7-BA893A767601}.Release.ActiveCfg = Release|Win32
- {58CCE183-6032-12FE-A4F7-BA893A767601}.Release.Build.0 = Release|Win32
- {5CE11C83-096A-84FE-4FA2-D3A6BA792002}.Debug.ActiveCfg = Debug|Win32
- {5CE11C83-096A-84FE-4FA2-D3A6BA792002}.Debug.Build.0 = Debug|Win32
- {5CE11C83-096A-84FE-4FA2-D3A6BA792002}.Release.ActiveCfg = Release|Win32
- {5CE11C83-096A-84FE-4FA2-D3A6BA792002}.Release.Build.0 = Release|Win32
- {58CC2563-6092-48FE-FAF7-BA046A792658}.Debug.ActiveCfg = Debug|Win32
- {58CC2563-6092-48FE-FAF7-BA046A792658}.Debug.Build.0 = Debug|Win32
- {58CC2563-6092-48FE-FAF7-BA046A792658}.Release.ActiveCfg = Release|Win32
- {58CC2563-6092-48FE-FAF7-BA046A792658}.Release.Build.0 = Release|Win32
- {58C1B183-9026-4E63-12F2-005412200054}.Debug.ActiveCfg = Debug|Win32
- {58C1B183-9026-4E63-12F2-005412200054}.Debug.Build.0 = Debug|Win32
- {58C1B183-9026-4E63-12F2-005412200054}.Release.ActiveCfg = Release|Win32
- {58C1B183-9026-4E63-12F2-005412200054}.Release.Build.0 = Release|Win32
- {58C1B183-9026-4E63-12F2-005202441254}.Debug.ActiveCfg = Debug|Win32
- {58C1B183-9026-4E63-12F2-005202441254}.Debug.Build.0 = Debug|Win32
- {58C1B183-9026-4E63-12F2-005202441254}.Release.ActiveCfg = Release|Win32
- {58C1B183-9026-4E63-12F2-005202441254}.Release.Build.0 = Release|Win32
- {58C181B3-9516-463E-2F12-122155400054}.Debug.ActiveCfg = Debug|Win32
- {58C181B3-9516-463E-2F12-122155400054}.Debug.Build.0 = Debug|Win32
- {58C181B3-9516-463E-2F12-122155400054}.Release.ActiveCfg = Release|Win32
- {58C181B3-9516-463E-2F12-122155400054}.Release.Build.0 = Release|Win32
- {5C1B8183-0296-4F83-1F22-001005220544}.Debug.ActiveCfg = Debug|Win32
- {5C1B8183-0296-4F83-1F22-001005220544}.Debug.Build.0 = Debug|Win32
- {5C1B8183-0296-4F83-1F22-001005220544}.Release.ActiveCfg = Release|Win32
- {5C1B8183-0296-4F83-1F22-001005220544}.Release.Build.0 = Release|Win32
- {58C1FE83-2906-E643-2F12-024410052254}.Debug.ActiveCfg = Debug|Win32
- {58C1FE83-2906-E643-2F12-024410052254}.Debug.Build.0 = Debug|Win32
- {58C1FE83-2906-E643-2F12-024410052254}.Release.ActiveCfg = Release|Win32
- {58C1FE83-2906-E643-2F12-024410052254}.Release.Build.0 = Release|Win32
- {58EB1CB3-1354-364E-12F2-154356612054}.Debug.ActiveCfg = Debug|Win32
- {58EB1CB3-1354-364E-12F2-154356612054}.Debug.Build.0 = Debug|Win32
- {58EB1CB3-1354-364E-12F2-154356612054}.Release.ActiveCfg = Release|Win32
- {58EB1CB3-1354-364E-12F2-154356612054}.Release.Build.0 = Release|Win32
- {58181CB3-5134-634E-12F2-155435622054}.Debug.ActiveCfg = Debug|Win32
- {58181CB3-5134-634E-12F2-155435622054}.Debug.Build.0 = Debug|Win32
- {58181CB3-5134-634E-12F2-155435622054}.Release.ActiveCfg = Release|Win32
- {58181CB3-5134-634E-12F2-155435622054}.Release.Build.0 = Release|Win32
- {5CB81183-29FB-F843-24FF-022050100544}.Debug.ActiveCfg = Debug|Win32
- {5CB81183-29FB-F843-24FF-022050100544}.Debug.Build.0 = Debug|Win32
- {5CB81183-29FB-F843-24FF-022050100544}.Release.ActiveCfg = Release|Win32
- {5CB81183-29FB-F843-24FF-022050100544}.Release.Build.0 = Release|Win32
- {58FBE8C3-9026-FAB2-E643-000522441254}.Debug.ActiveCfg = Debug|Win32
- {58FBE8C3-9026-FAB2-E643-000522441254}.Debug.Build.0 = Debug|Win32
- {58FBE8C3-9026-FAB2-E643-000522441254}.Release.ActiveCfg = Release|Win32
- {58FBE8C3-9026-FAB2-E643-000522441254}.Release.Build.0 = Release|Win32
- {48C1FBE8-F7A4-0961-48FE-7D93A63B0A04}.Debug.ActiveCfg = Debug|Win32
- {48C1FBE8-F7A4-0961-48FE-7D93A63B0A04}.Debug.Build.0 = Debug|Win32
- {48C1FBE8-F7A4-0961-48FE-7D93A63B0A04}.Release.ActiveCfg = Release|Win32
- {48C1FBE8-F7A4-0961-48FE-7D93A63B0A04}.Release.Build.0 = Release|Win32
- {5C18831B-F162-FA96-E6C3-FA5122040054}.Debug.ActiveCfg = Debug|Win32
- {5C18831B-F162-FA96-E6C3-FA5122040054}.Debug.Build.0 = Debug|Win32
- {5C18831B-F162-FA96-E6C3-FA5122040054}.Release.ActiveCfg = Release|Win32
- {5C18831B-F162-FA96-E6C3-FA5122040054}.Release.Build.0 = Release|Win32
- {5C1B1043-1EFF-2793-4E63-245241283054}.Debug.ActiveCfg = Debug|Win32
- {5C1B1043-1EFF-2793-4E63-245241283054}.Debug.Build.0 = Debug|Win32
- {5C1B1043-1EFF-2793-4E63-245241283054}.Release.ActiveCfg = Release|Win32
- {5C1B1043-1EFF-2793-4E63-245241283054}.Release.Build.0 = Release|Win32
- {51B189C3-4E63-9026-12F2-12200AF54054}.Debug.ActiveCfg = Debug|Win32
- {51B189C3-4E63-9026-12F2-12200AF54054}.Debug.Build.0 = Debug|Win32
- {51B189C3-4E63-9026-12F2-12200AF54054}.Release.ActiveCfg = Release|Win32
- {51B189C3-4E63-9026-12F2-12200AF54054}.Release.Build.0 = Release|Win32
- {5C1B1813-12C2-0296-4E63-244549126520}.Debug.ActiveCfg = Debug|Win32
- {5C1B1813-12C2-0296-4E63-244549126520}.Debug.Build.0 = Debug|Win32
- {5C1B1813-12C2-0296-4E63-244549126520}.Release.ActiveCfg = Release|Win32
- {5C1B1813-12C2-0296-4E63-244549126520}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792653}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792653}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792653}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792653}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792652}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792652}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792652}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792652}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792651}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792651}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792651}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792651}.Release.Build.0 = Release|Win32
- {58CCE183-6032-12FE-4FC7-83A79F760B61}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6032-12FE-4FC7-83A79F760B61}.Debug.Build.0 = Debug|Win32
- {58CCE183-6032-12FE-4FC7-83A79F760B61}.Release.ActiveCfg = Release|Win32
- {58CCE183-6032-12FE-4FC7-83A79F760B61}.Release.Build.0 = Release|Win32
- {571C3383-6092-A877-1238-B3786BAE7605}.Debug.ActiveCfg = Debug|Win32
- {571C3383-6092-A877-1238-B3786BAE7605}.Debug.Build.0 = Debug|Win32
- {571C3383-6092-A877-1238-B3786BAE7605}.Release.ActiveCfg = Release|Win32
- {571C3383-6092-A877-1238-B3786BAE7605}.Release.Build.0 = Release|Win32
- {58C1B183-0296-EA42-EF04-005120054104}.Debug.ActiveCfg = Debug|Win32
- {58C1B183-0296-EA42-EF04-005120054104}.Debug.Build.0 = Debug|Win32
- {58C1B183-0296-EA42-EF04-005120054104}.Release.ActiveCfg = Release|Win32
- {58C1B183-0296-EA42-EF04-005120054104}.Release.Build.0 = Release|Win32
- {588CCD13-2962-83FE-F4B7-92230DB73629}.Debug.ActiveCfg = Debug|Win32
- {588CCD13-2962-83FE-F4B7-92230DB73629}.Debug.Build.0 = Debug|Win32
- {588CCD13-2962-83FE-F4B7-92230DB73629}.Release.ActiveCfg = Release|Win32
- {588CCD13-2962-83FE-F4B7-92230DB73629}.Release.Build.0 = Release|Win32
- {51D8E9C3-2D65-48FE-3AA7-7922C0E36329}.Debug.ActiveCfg = Debug|Win32
- {51D8E9C3-2D65-48FE-3AA7-7922C0E36329}.Debug.Build.0 = Debug|Win32
- {51D8E9C3-2D65-48FE-3AA7-7922C0E36329}.Release.ActiveCfg = Release|Win32
- {51D8E9C3-2D65-48FE-3AA7-7922C0E36329}.Release.Build.0 = Release|Win32
- {58BD1CC3-6972-F3F7-84BE-0DB736035922}.Debug.ActiveCfg = Debug|Win32
- {58BD1CC3-6972-F3F7-84BE-0DB736035922}.Debug.Build.0 = Debug|Win32
- {58BD1CC3-6972-F3F7-84BE-0DB736035922}.Release.ActiveCfg = Release|Win32
- {58BD1CC3-6972-F3F7-84BE-0DB736035922}.Release.Build.0 = Release|Win32
- {5BD1C7C3-3F7F-6972-84BE-B731D9236035}.Debug.ActiveCfg = Debug|Win32
- {5BD1C7C3-3F7F-6972-84BE-B731D9236035}.Debug.Build.0 = Debug|Win32
- {5BD1C7C3-3F7F-6972-84BE-B731D9236035}.Release.ActiveCfg = Release|Win32
- {5BD1C7C3-3F7F-6972-84BE-B731D9236035}.Release.Build.0 = Release|Win32
- {58CE1D83-F31E-4FD7-6132-8A79F6307B61}.Debug.ActiveCfg = Debug|Win32
- {58CE1D83-F31E-4FD7-6132-8A79F6307B61}.Debug.Build.0 = Debug|Win32
- {58CE1D83-F31E-4FD7-6132-8A79F6307B61}.Release.ActiveCfg = Release|Win32
- {58CE1D83-F31E-4FD7-6132-8A79F6307B61}.Release.Build.0 = Release|Win32
- {5CE19883-F413-7EFD-6342-B79639F7B611}.Debug.ActiveCfg = Debug|Win32
- {5CE19883-F413-7EFD-6342-B79639F7B611}.Debug.Build.0 = Debug|Win32
- {5CE19883-F413-7EFD-6342-B79639F7B611}.Release.ActiveCfg = Release|Win32
- {5CE19883-F413-7EFD-6342-B79639F7B611}.Release.Build.0 = Release|Win32
- {58DE18C3-3261-2F3E-FD47-83760B9FA761}.Debug.ActiveCfg = Debug|Win32
- {58DE18C3-3261-2F3E-FD47-83760B9FA761}.Debug.Build.0 = Debug|Win32
- {58DE18C3-3261-2F3E-FD47-83760B9FA761}.Release.ActiveCfg = Release|Win32
- {58DE18C3-3261-2F3E-FD47-83760B9FA761}.Release.Build.0 = Release|Win32
- {59CEC183-8192-8F6D-4FB7-BA260A79D352}.Debug.ActiveCfg = Debug|Win32
- {59CEC183-8192-8F6D-4FB7-BA260A79D352}.Debug.Build.0 = Debug|Win32
- {59CEC183-8192-8F6D-4FB7-BA260A79D352}.Release.ActiveCfg = Release|Win32
- {59CEC183-8192-8F6D-4FB7-BA260A79D352}.Release.Build.0 = Release|Win32
- {E385C28C-0691-4FA7-F48E-935BA0D06310}.Debug.ActiveCfg = Debug|Win32
- {E385C28C-0691-4FA7-F48E-935BA0D06310}.Debug.Build.0 = Debug|Win32
- {E385C28C-0691-4FA7-F48E-935BA0D06310}.Release.ActiveCfg = Release|Win32
- {E385C28C-0691-4FA7-F48E-935BA0D06310}.Release.Build.0 = Release|Win32
- {518CE8C3-6512-FA75-46EF-B917A3A116D1}.Debug.ActiveCfg = Debug|Win32
- {518CE8C3-6512-FA75-46EF-B917A3A116D1}.Debug.Build.0 = Debug|Win32
- {518CE8C3-6512-FA75-46EF-B917A3A116D1}.Release.ActiveCfg = Release|Win32
- {518CE8C3-6512-FA75-46EF-B917A3A116D1}.Release.Build.0 = Release|Win32
- {5D18CE83-1926-7AE4-FE94-B606D9B23131}.Debug.ActiveCfg = Debug|Win32
- {5D18CE83-1926-7AE4-FE94-B606D9B23131}.Debug.Build.0 = Debug|Win32
- {5D18CE83-1926-7AE4-FE94-B606D9B23131}.Release.ActiveCfg = Release|Win32
- {5D18CE83-1926-7AE4-FE94-B606D9B23131}.Release.Build.0 = Release|Win32
- {58CE1D84-1962-4FE9-BA0D-A4F7973A4652}.Debug.ActiveCfg = Debug|Win32
- {58CE1D84-1962-4FE9-BA0D-A4F7973A4652}.Debug.Build.0 = Debug|Win32
- {58CE1D84-1962-4FE9-BA0D-A4F7973A4652}.Release.ActiveCfg = Release|Win32
- {58CE1D84-1962-4FE9-BA0D-A4F7973A4652}.Release.Build.0 = Release|Win32
- {5188E3CE-2964-F43E-FB87-B037AC692D59}.Debug.ActiveCfg = Debug|Win32
- {5188E3CE-2964-F43E-FB87-B037AC692D59}.Debug.Build.0 = Debug|Win32
- {5188E3CE-2964-F43E-FB87-B037AC692D59}.Release.ActiveCfg = Release|Win32
- {5188E3CE-2964-F43E-FB87-B037AC692D59}.Release.Build.0 = Release|Win32
- {5CE14C83-4962-8F5E-4FA7-B0D3A7B93635}.Debug.ActiveCfg = Debug|Win32
- {5CE14C83-4962-8F5E-4FA7-B0D3A7B93635}.Debug.Build.0 = Debug|Win32
- {5CE14C83-4962-8F5E-4FA7-B0D3A7B93635}.Release.ActiveCfg = Release|Win32
- {5CE14C83-4962-8F5E-4FA7-B0D3A7B93635}.Release.Build.0 = Release|Win32
- {581B1C83-4E12-9526-020F-012482540054}.Debug.ActiveCfg = Debug|Win32
- {581B1C83-4E12-9526-020F-012482540054}.Debug.Build.0 = Debug|Win32
- {581B1C83-4E12-9526-020F-012482540054}.Release.ActiveCfg = Release|Win32
- {581B1C83-4E12-9526-020F-012482540054}.Release.Build.0 = Release|Win32
- {51B17C83-E172-5396-0FA2-825472008554}.Debug.ActiveCfg = Debug|Win32
- {51B17C83-E172-5396-0FA2-825472008554}.Debug.Build.0 = Debug|Win32
- {51B17C83-E172-5396-0FA2-825472008554}.Release.ActiveCfg = Release|Win32
- {51B17C83-E172-5396-0FA2-825472008554}.Release.Build.0 = Release|Win32
- {2B75C833-17D2-4956-A23F-820854254175}.Debug.ActiveCfg = Debug|Win32
- {2B75C833-17D2-4956-A23F-820854254175}.Debug.Build.0 = Debug|Win32
- {2B75C833-17D2-4956-A23F-820854254175}.Release.ActiveCfg = Release|Win32
- {2B75C833-17D2-4956-A23F-820854254175}.Release.Build.0 = Release|Win32
- {283AD375-7D12-5866-23BF-854308651275}.Debug.ActiveCfg = Debug|Win32
- {283AD375-7D12-5866-23BF-854308651275}.Debug.Build.0 = Debug|Win32
- {283AD375-7D12-5866-23BF-854308651275}.Release.ActiveCfg = Release|Win32
- {283AD375-7D12-5866-23BF-854308651275}.Release.Build.0 = Release|Win32
- {57C832B1-17D2-9537-FA12-827220448554}.Debug.ActiveCfg = Debug|Win32
- {57C832B1-17D2-9537-FA12-827220448554}.Debug.Build.0 = Debug|Win32
- {57C832B1-17D2-9537-FA12-827220448554}.Release.ActiveCfg = Release|Win32
- {57C832B1-17D2-9537-FA12-827220448554}.Release.Build.0 = Release|Win32
- {536C8251-7E12-9537-A1E2-822073258554}.Debug.ActiveCfg = Debug|Win32
- {536C8251-7E12-9537-A1E2-822073258554}.Debug.Build.0 = Debug|Win32
- {536C8251-7E12-9537-A1E2-822073258554}.Release.ActiveCfg = Release|Win32
- {536C8251-7E12-9537-A1E2-822073258554}.Release.Build.0 = Release|Win32
- {83258CB1-127E-9375-F872-8324A1054454}.Debug.ActiveCfg = Debug|Win32
- {83258CB1-127E-9375-F872-8324A1054454}.Debug.Build.0 = Debug|Win32
- {83258CB1-127E-9375-F872-8324A1054454}.Release.ActiveCfg = Release|Win32
- {83258CB1-127E-9375-F872-8324A1054454}.Release.Build.0 = Release|Win32
- {5198EFC3-2731-F34E-4FD8-1859AC94F761}.Debug.ActiveCfg = Debug|Win32
- {5198EFC3-2731-F34E-4FD8-1859AC94F761}.Debug.Build.0 = Debug|Win32
- {5198EFC3-2731-F34E-4FD8-1859AC94F761}.Release.ActiveCfg = Release|Win32
- {5198EFC3-2731-F34E-4FD8-1859AC94F761}.Release.Build.0 = Release|Win32
- {58DE18C3-3261-2F3E-FD47-83760B9FA761}.Debug.ActiveCfg = Debug|Win32
- {58DE18C3-3261-2F3E-FD47-83760B9FA761}.Debug.Build.0 = Debug|Win32
- {58DE18C3-3261-2F3E-FD47-83760B9FA761}.Release.ActiveCfg = Release|Win32
- {58DE18C3-3261-2F3E-FD47-83760B9FA761}.Release.Build.0 = Release|Win32
- {FFAA56F1-32EC-4B22-B6BD-95A311A67C35}.Debug.ActiveCfg = Debug|Win32
- {FFAA56F1-32EC-4B22-B6BD-95A311A67C35}.Debug.Build.0 = Debug|Win32
- {FFAA56F1-32EC-4B22-B6BD-95A311A67C35}.Release.ActiveCfg = Release|Win32
- {FFAA56F1-32EC-4B22-B6BD-95A311A67C35}.Release.Build.0 = Release|Win32
- {5E17C9C3-1362-2E1E-C84F-8A76B6739F21}.Debug.ActiveCfg = Debug|Win32
- {5E17C9C3-1362-2E1E-C84F-8A76B6739F21}.Debug.Build.0 = Debug|Win32
- {5E17C9C3-1362-2E1E-C84F-8A76B6739F21}.Release.ActiveCfg = Release|Win32
- {5E17C9C3-1362-2E1E-C84F-8A76B6739F21}.Release.Build.0 = Release|Win32
- {5E1D6C83-31DE-4F6F-6132-87A9FB663041}.Debug.ActiveCfg = Debug|Win32
- {5E1D6C83-31DE-4F6F-6132-87A9FB663041}.Debug.Build.0 = Debug|Win32
- {5E1D6C83-31DE-4F6F-6132-87A9FB663041}.Release.ActiveCfg = Release|Win32
- {5E1D6C83-31DE-4F6F-6132-87A9FB663041}.Release.Build.0 = Release|Win32
- {CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.ActiveCfg = Debug|Win32
- {CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.Build.0 = Debug|Win32
- {CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.ActiveCfg = Release|Win32
- {CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.Build.0 = Release|Win32
- {8A519DC3-6092-A4FE-F748-BA91328D6522}.Debug.ActiveCfg = Debug|Win32
- {8A519DC3-6092-A4FE-F748-BA91328D6522}.Debug.Build.0 = Debug|Win32
- {8A519DC3-6092-A4FE-F748-BA91328D6522}.Release.ActiveCfg = Release|Win32
- {8A519DC3-6092-A4FE-F748-BA91328D6522}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792655}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792655}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792655}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792655}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792661}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792661}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792661}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792661}.Release.Build.0 = Release|Win32
- {58C183CE-6203-FE12-A237-BA8976695960}.Debug.ActiveCfg = Debug|Win32
- {58C183CE-6203-FE12-A237-BA8976695960}.Debug.Build.0 = Debug|Win32
- {58C183CE-6203-FE12-A237-BA8976695960}.Release.ActiveCfg = Release|Win32
- {58C183CE-6203-FE12-A237-BA8976695960}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792659}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792659}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792659}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792659}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792620}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792620}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792620}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792620}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792622}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792622}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792622}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792622}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792625}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792625}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792625}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792625}.Release.Build.0 = Release|Win32
- {5C83CE18-4F48-A7FE-6092-B7920AD3A624}.Debug.ActiveCfg = Debug|Win32
- {5C83CE18-4F48-A7FE-6092-B7920AD3A624}.Debug.Build.0 = Debug|Win32
- {5C83CE18-4F48-A7FE-6092-B7920AD3A624}.Release.ActiveCfg = Release|Win32
- {5C83CE18-4F48-A7FE-6092-B7920AD3A624}.Release.Build.0 = Release|Win32
- {58CCE283-1609-48FE-A4F7-BA0D3A793523}.Debug.ActiveCfg = Debug|Win32
- {58CCE283-1609-48FE-A4F7-BA0D3A793523}.Debug.Build.0 = Debug|Win32
- {58CCE283-1609-48FE-A4F7-BA0D3A793523}.Release.ActiveCfg = Release|Win32
- {58CCE283-1609-48FE-A4F7-BA0D3A793523}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4FC-BA0D3A792647}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4FC-BA0D3A792647}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4FC-BA0D3A792647}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4FC-BA0D3A792647}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792662}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792662}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792662}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792662}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792658}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792658}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792658}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792658}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792657}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792657}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792657}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792657}.Release.Build.0 = Release|Win32
- {58C1B183-9026-4E12-00F2-001200540054}.Debug.ActiveCfg = Debug|Win32
- {58C1B183-9026-4E12-00F2-001200540054}.Debug.Build.0 = Debug|Win32
- {58C1B183-9026-4E12-00F2-001200540054}.Release.ActiveCfg = Release|Win32
- {58C1B183-9026-4E12-00F2-001200540054}.Release.Build.0 = Release|Win32
- {5E18CC83-6092-48FE-A677-B832A0D3A650}.Debug.ActiveCfg = Debug|Win32
- {5E18CC83-6092-48FE-A677-B832A0D3A650}.Debug.Build.0 = Debug|Win32
- {5E18CC83-6092-48FE-A677-B832A0D3A650}.Release.ActiveCfg = Release|Win32
- {5E18CC83-6092-48FE-A677-B832A0D3A650}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792649}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792649}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792649}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792649}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792648}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792648}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792648}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792648}.Release.Build.0 = Release|Win32
- {58CCE183-5091-48FE-A4FC-BA0D3A792446}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-5091-48FE-A4FC-BA0D3A792446}.Debug.Build.0 = Debug|Win32
- {58CCE183-5091-48FE-A4FC-BA0D3A792446}.Release.ActiveCfg = Release|Win32
- {58CCE183-5091-48FE-A4FC-BA0D3A792446}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792645}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792645}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792645}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792645}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792644}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792644}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792644}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792644}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792643}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792643}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792643}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792643}.Release.Build.0 = Release|Win32
- {58CC8E13-0962-8F4E-77A6-BD3A6832A042}.Debug.ActiveCfg = Debug|Win32
- {58CC8E13-0962-8F4E-77A6-BD3A6832A042}.Debug.Build.0 = Debug|Win32
- {58CC8E13-0962-8F4E-77A6-BD3A6832A042}.Release.ActiveCfg = Release|Win32
- {58CC8E13-0962-8F4E-77A6-BD3A6832A042}.Release.Build.0 = Release|Win32
- {58C1B183-9260-4E8F-F200-000000000041}.Debug.ActiveCfg = Debug|Win32
- {58C1B183-9260-4E8F-F200-000000000041}.Debug.Build.0 = Debug|Win32
- {58C1B183-9260-4E8F-F200-000000000041}.Release.ActiveCfg = Release|Win32
- {58C1B183-9260-4E8F-F200-000000000041}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A677-BA0D3A832640}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A677-BA0D3A832640}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A677-BA0D3A832640}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A677-BA0D3A832640}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792638}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792638}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792638}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792638}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792637}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792637}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792637}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792637}.Release.Build.0 = Release|Win32
- {5821C383-6092-12FE-A877-BA0D33467633}.Debug.ActiveCfg = Debug|Win32
- {5821C383-6092-12FE-A877-BA0D33467633}.Debug.Build.0 = Debug|Win32
- {5821C383-6092-12FE-A877-BA0D33467633}.Release.ActiveCfg = Release|Win32
- {5821C383-6092-12FE-A877-BA0D33467633}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792632}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792632}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792632}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792632}.Release.Build.0 = Release|Win32
- {5CCE1883-0926-F7A4-8FE4-BA0606D92331}.Debug.ActiveCfg = Debug|Win32
- {5CCE1883-0926-F7A4-8FE4-BA0606D92331}.Debug.Build.0 = Debug|Win32
- {5CCE1883-0926-F7A4-8FE4-BA0606D92331}.Release.ActiveCfg = Release|Win32
- {5CCE1883-0926-F7A4-8FE4-BA0606D92331}.Release.Build.0 = Release|Win32
- {5C6D9CE1-2609-F7A4-8FE4-BA0883602330}.Debug.ActiveCfg = Debug|Win32
- {5C6D9CE1-2609-F7A4-8FE4-BA0883602330}.Debug.Build.0 = Debug|Win32
- {5C6D9CE1-2609-F7A4-8FE4-BA0883602330}.Release.ActiveCfg = Release|Win32
- {5C6D9CE1-2609-F7A4-8FE4-BA0883602330}.Release.Build.0 = Release|Win32
- {58E18CC3-6092-8F4E-A3E7-A792230D3629}.Debug.ActiveCfg = Debug|Win32
- {58E18CC3-6092-8F4E-A3E7-A792230D3629}.Debug.Build.0 = Debug|Win32
- {58E18CC3-6092-8F4E-A3E7-A792230D3629}.Release.ActiveCfg = Release|Win32
- {58E18CC3-6092-8F4E-A3E7-A792230D3629}.Release.Build.0 = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792628}.Debug.ActiveCfg = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792628}.Debug.Build.0 = Debug|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792628}.Release.ActiveCfg = Release|Win32
- {58CCE183-6092-48FE-A4F7-BA0D3A792628}.Release.Build.0 = Release|Win32
- {83581CCE-487E-3292-A4E7-BA07926D3A27}.Debug.ActiveCfg = Debug|Win32
- {83581CCE-487E-3292-A4E7-BA07926D3A27}.Debug.Build.0 = Debug|Win32
- {83581CCE-487E-3292-A4E7-BA07926D3A27}.Release.ActiveCfg = Release|Win32
- {83581CCE-487E-3292-A4E7-BA07926D3A27}.Release.Build.0 = Release|Win32
- {0000058C-0000-0000-0000-000000000021}.Debug.ActiveCfg = Debug|Win32
- {0000058C-0000-0000-0000-000000000021}.Debug.Build.0 = Debug|Win32
- {0000058C-0000-0000-0000-000000000021}.Release.ActiveCfg = Release|Win32
- {0000058C-0000-0000-0000-000000000021}.Release.Build.0 = Release|Win32
- {83581CCE-487E-3292-A4E7-BA07926D3A14}.Debug.ActiveCfg = Debug|Win32
- {83581CCE-487E-3292-A4E7-BA07926D3A14}.Debug.Build.0 = Debug|Win32
- {83581CCE-487E-3292-A4E7-BA07926D3A14}.Release.ActiveCfg = Release|Win32
- {83581CCE-487E-3292-A4E7-BA07926D3A14}.Release.Build.0 = Release|Win32
- {5CE28C83-48FE-1676-4FA7-B50D3A76A013}.Debug.ActiveCfg = Debug|Win32
- {5CE28C83-48FE-1676-4FA7-B50D3A76A013}.Debug.Build.0 = Debug|Win32
- {5CE28C83-48FE-1676-4FA7-B50D3A76A013}.Release.ActiveCfg = Release|Win32
- {5CE28C83-48FE-1676-4FA7-B50D3A76A013}.Release.Build.0 = Release|Win32
- {818C43EE-3561-F3AE-4FD7-8A2076E76A31}.Debug.ActiveCfg = Debug|Win32
- {818C43EE-3561-F3AE-4FD7-8A2076E76A31}.Debug.Build.0 = Debug|Win32
- {818C43EE-3561-F3AE-4FD7-8A2076E76A31}.Release.ActiveCfg = Release|Win32
- {818C43EE-3561-F3AE-4FD7-8A2076E76A31}.Release.Build.0 = Release|Win32
- {5189DEA3-3261-F33E-47ED-83BC69F66061}.Debug.ActiveCfg = Debug|Win32
- {5189DEA3-3261-F33E-47ED-83BC69F66061}.Debug.Build.0 = Debug|Win32
- {5189DEA3-3261-F33E-47ED-83BC69F66061}.Release.ActiveCfg = Release|Win32
- {5189DEA3-3261-F33E-47ED-83BC69F66061}.Release.Build.0 = Release|Win32
- {5C82D1D3-3861-3AF1-03EF-89AED4716761}.Debug.ActiveCfg = Debug|Win32
- {5C82D1D3-3861-3AF1-03EF-89AED4716761}.Debug.Build.0 = Debug|Win32
- {5C82D1D3-3861-3AF1-03EF-89AED4716761}.Release.ActiveCfg = Release|Win32
- {5C82D1D3-3861-3AF1-03EF-89AED4716761}.Release.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shared_memory_mapping_test", "shared_memory_mappable_test.vcproj", "{5CE18C83-6025-36FE-A4F7-BA09176D3A11}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shared_memory_test", "shared_memory_test.vcproj", "{5E2838CC-0916-8F4E-A4F7-93506BA0D310}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shared_ptr_test", "shared_ptr_test.vcproj", "{5371C383-6092-1238-A877-BAEB37867609}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "slist_test", "slist_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792608}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "string_test", "string_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D4A792607}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tree_test", "tree_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792606}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "upgradable_mutex_test", "upgradable_mutex.vcproj", "{4E88C1C2-0961-F7A4-F48E-A6A7D3B06004}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "user_buffer_test", "user_buffer_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792603}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vectorstream_test", "vectorstream_test.vcproj", "{58CCE183-6032-12FE-A4F7-BA893A767601}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vector_test", "vector_test.vcproj", "{5CE11C83-096A-84FE-4FA2-D3A6BA792002}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "named_condition_test", "named_condition_test.vcproj", "{58CC2563-6092-48FE-FAF7-BA046A792658}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_anonymous_mutexA", "doc_anonymous_mutexA.vcproj", "{58C1B183-9026-4E63-12F2-005412200054}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_anonymous_mutexB", "doc_anonymous_mutexB.vcproj", "{58C1B183-9026-4E63-12F2-005202441254}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_named_mutex", "doc_named_mutex.vcproj", "{58C181B3-9516-463E-2F12-122155400054}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_anonymous_conditionA", "doc_anonymous_conditionA.vcproj", "{5C1B8183-0296-4F83-1F22-001005220544}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_anonymous_conditionB", "doc_anonymous_conditionB.vcproj", "{58C1FE83-2906-E643-2F12-024410052254}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_named_conditionA", "doc_named_conditionA.vcproj", "{58EB1CB3-1354-364E-12F2-154356612054}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_named_conditionB", "doc_named_conditionB.vcproj", "{58181CB3-5134-634E-12F2-155435622054}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_anonymous_semaphoreA", "doc_anonymous_semaphoreA.vcproj", "{5CB81183-29FB-F843-24FF-022050100544}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_anonymous_semaphoreB", "doc_anonymous_semaphoreB.vcproj", "{58FBE8C3-9026-FAB2-E643-000522441254}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "named_upgradable_mutex_test", "named_upgradable_mutex.vcproj", "{48C1FBE8-F7A4-0961-48FE-7D93A63B0A04}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_anonymous_upgradable_mutexA", "doc_anonymous_upgradable_mutexA.vcproj", "{5C18831B-F162-FA96-E6C3-FA5122040054}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_anonymous_upgradable_mutexB", "doc_anonymous_upgradable_mutexB.vcproj", "{5C1B1043-1EFF-2793-4E63-245241283054}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_message_queueA", "doc_message_queueA.vcproj", "{51B189C3-4E63-9026-12F2-12200AF54054}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_message_queueB", "doc_message_queueB.vcproj", "{5C1B1813-12C2-0296-4E63-244549126520}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_cont", "doc_cont.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792653}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_contA", "doc_contA.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792652}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_contB", "doc_contB.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792651}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_shared_memory", "doc_shared_memory.vcproj", "{58CCE183-6032-12FE-4FC7-83A79F760B61}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unique_ptr_test", "unique_ptr_test.vcproj", "{571C3383-6092-A877-1238-B3786BAE7605}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_move_containers", "doc_move_containers.vcproj", "{58C1B183-0296-EA42-EF04-005120054104}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "map_index_allocation_test", "map_index_allocation_test.vcproj", "{588CCD13-2962-83FE-F4B7-92230DB73629}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "flat_map_index_allocation_test", "flat_map_index_allocation_test.vcproj", "{51D8E9C3-2D65-48FE-3AA7-7922C0E36329}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iset_index_allocation_test", "iset_index_allocation_test.vcproj", "{58BD1CC3-6972-F3F7-84BE-0DB736035922}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iunordered_set_index_allocation_test", "iunordered_set_index_allocation_test.vcproj", "{5BD1C7C3-3F7F-6972-84BE-B731D9236035}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_shared_memory2", "doc_shared_memory2.vcproj", "{58CE1D83-F31E-4FD7-6132-8A79F6307B61}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_file_mapping2", "doc_file_mapping2.vcproj", "{5CE19883-F413-7EFD-6342-B79639F7B611}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_file_mapping", "doc_file_mapping.vcproj", "{58DE18C3-3261-2F3E-FD47-83760B9FA761}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_map", "doc_map.vcproj", "{59CEC183-8192-8F6D-4FB7-BA260A79D352}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "windows_shared_memory_test", "windows_shared_memory_test.vcproj", "{E385C28C-0691-4FA7-F48E-935BA0D06310}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "windows_shared_memory_mapping_test", "windows_shared_memory_mapping_test.vcproj", "{518CE8C3-6512-FA75-46EF-B917A3A116D1}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "managed_windows_shared_memory_test", "managed_windows_shared_memory.vcproj", "{5D18CE83-1926-7AE4-FE94-B606D9B23131}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "adaptive_pool_test", "adaptive_pool_test.vcproj", "{58CE1D84-1962-4FE9-BA0D-A4F7973A4652}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cached_adaptive_pool_test", "cached_adaptive_pool_test.vcproj", "{5188E3CE-2964-F43E-FB87-B037AC692D59}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "private_adaptive_pool_test", "private_adaptive_pool_test.vcproj", "{5CE14C83-4962-8F5E-4FA7-B0D3A7B93635}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_allocator", "doc_allocator.vcproj", "{581B1C83-4E12-9526-020F-012482540054}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_node_allocator", "doc_node_allocator.vcproj", "{51B17C83-E172-5396-0FA2-825472008554}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_private_node_allocator", "doc_private_node_allocator.vcproj", "{2B75C833-17D2-4956-A23F-820854254175}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_cached_node_allocator", "doc_cached_node_allocator.vcproj", "{283AD375-7D12-5866-23BF-854308651275}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_adaptive_pool", "doc_adaptive_pool.vcproj", "{57C832B1-17D2-9537-FA12-827220448554}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_cached_adaptive_pool", "doc_cached_adaptive_pool.vcproj", "{536C8251-7E12-9537-A1E2-822073258554}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_private_adaptive_pool", "doc_private_adaptive_pool.vcproj", "{83258CB1-127E-9375-F872-8324A1054454}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_managed_raw_allocation", "doc_managed_raw_allocation.vcproj", "{5198EFC3-2731-F34E-4FD8-1859AC94F761}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_managed_aligned_allocation", "doc_managed_aligned_allocation.vcproj", "{58DE18C3-3261-2F3E-FD47-83760B9FA761}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_interprocesslib", "interprocesslib.vcproj", "{FFAA56F1-32EC-4B22-B6BD-95A311A67C35}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_windows_shared_memory", "doc_windows_shared_memory.vcproj", "{5E17C9C3-1362-2E1E-C84F-8A76B6739F21}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_windows_shared_memory2", "doc_windows_shared_memory2.vcproj", "{5E1D6C83-31DE-4F6F-6132-87A9FB663041}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "adaptive_node_pool_test", "adaptive_node_pool_test.vcproj", "{CD57C283-1862-42FE-BF87-B96D3A2A7912}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "node_pool_test", "node_pool_test.vcproj", "{8A519DC3-6092-A4FE-F748-BA91328D6522}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "deque_test", "deque_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792655}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "barrier_test", "barrier_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792661}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bufferstream_test", "bufferstream_test.vcproj", "{58C183CE-6203-FE12-A237-BA8976695960}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cached_node_allocator_test", "cached_node_allocator_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792659}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "private_node_allocator_test", "private_node_allocator_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792620}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "node_allocator_test", "node_allocator_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792622}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "named_mutex_test", "named_mutex_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792625}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "named_recursive_mutex_test", "named_recursive_mutex_test.vcproj", "{5C83CE18-4F48-A7FE-6092-B7920AD3A624}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "named_semaphore_test", "named_semaphore_test.vcproj", "{58CCE283-1609-48FE-A4F7-BA0D3A793523}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_managed_heap_memory", "doc_managed_heap_memory.vcproj", "{58CCE183-6092-48FE-A4FC-BA0D3A792647}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "allocexcept_test", "allocexcept_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792662}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "condition_test", "condition_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792658}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "data_test", "data_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792657}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_bufferstream", "doc_bufferstream.vcproj", "{58C1B183-9026-4E12-00F2-001200540054}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_intrusive", "doc_intrusive.vcproj", "{5E18CC83-6092-48FE-A677-B832A0D3A650}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_ipc_messageA", "doc_ipc_messageA.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792649}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_ipc_messageB", "doc_ipc_messageB.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792648}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_managed_mapped_file", "doc_managed_mapped_file.vcproj", "{58CCE183-5091-48FE-A4FC-BA0D3A792446}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_named_allocA", "doc_named_allocA.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792645}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_named_allocB", "doc_named_allocB.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792644}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_offset_ptr", "doc_offset_ptr.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792643}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_scoped_ptr", "doc_scoped_ptr.vcproj", "{58CC8E13-0962-8F4E-77A6-BD3A6832A042}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_vectorstream", "doc_vectorstream.vcproj", "{58C1B183-9260-4E8F-F200-000000000041}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_where_allocate", "doc_where_allocate.vcproj", "{58CCE183-6092-48FE-A677-BA0D3A832640}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "file_mapping_test", "file_mapping_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792638}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "flat_tree_test", "flat_tree_test.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792637}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "intrusive_ptr_test", "intrusive_ptr_test.vcproj", "{5821C383-6092-12FE-A877-BA0D33467633}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "list_test", "list_ex.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792632}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "managed_mapped_file_test", "managed_mapped_file_test.vcproj", "{5CCE1883-0926-F7A4-8FE4-BA0606D92331}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mapped_file_test", "mapped_file_test.vcproj", "{5C6D9CE1-2609-F7A4-8FE4-BA0883602330}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "memory_algorithm_test", "memory_algorithm_test.vcproj", "{58E18CC3-6092-8F4E-A3E7-A792230D3629}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "message_queue_test", "message_queue.vcproj", "{58CCE183-6092-48FE-A4F7-BA0D3A792628}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mutex_test", "mutex_test.vcproj", "{83581CCE-487E-3292-A4E7-BA07926D3A27}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "null_index_test", "null_index_test.vcproj", "{0000058C-0000-0000-0000-000000000021}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "recursive_mutex_test", "recursive_mutex_test.vcproj", "{83581CCE-487E-3292-A4E7-BA07926D3A14}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "semaphore_test", "semaphore_test.vcproj", "{5CE28C83-48FE-1676-4FA7-B50D3A76A013}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_managed_multiple_allocation", "doc_managed_multiple_allocation.vcproj", "{818C43EE-3561-F3AE-4FD7-8A2076E76A31}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_managed_allocation_command", "doc_managed_allocation_command.vcproj", "{5189DEA3-3261-F33E-47ED-83BC69F66061}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_managed_construction_info", "doc_managed_construction_info.vcproj", "{5C82D1D3-3861-3AF1-03EF-89AED4716761}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_shared_ptr_explicit", "doc_shared_ptr_explicit.vcproj", "{4E887AC3-F8EA-6923-A744-C264A398C913}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_unique_ptr", "doc_unique_ptr.vcproj", "{589C2EB3-8A57-1862-F4EA-A6B14C7329A3}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_shared_ptr", "doc_shared_ptr.vcproj", "{51CE89A3-6092-F4EA-48A7-B4B9AC326093}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfiguration) = preSolution
+ Debug = Debug
+ Release = Release
+ EndGlobalSection
+ GlobalSection(ProjectDependencies) = postSolution
+ EndGlobalSection
+ GlobalSection(ProjectConfiguration) = postSolution
+ {5CE18C83-6025-36FE-A4F7-BA09176D3A11}.Debug.ActiveCfg = Debug|Win32
+ {5CE18C83-6025-36FE-A4F7-BA09176D3A11}.Debug.Build.0 = Debug|Win32
+ {5CE18C83-6025-36FE-A4F7-BA09176D3A11}.Release.ActiveCfg = Release|Win32
+ {5CE18C83-6025-36FE-A4F7-BA09176D3A11}.Release.Build.0 = Release|Win32
+ {5E2838CC-0916-8F4E-A4F7-93506BA0D310}.Debug.ActiveCfg = Debug|Win32
+ {5E2838CC-0916-8F4E-A4F7-93506BA0D310}.Debug.Build.0 = Debug|Win32
+ {5E2838CC-0916-8F4E-A4F7-93506BA0D310}.Release.ActiveCfg = Release|Win32
+ {5E2838CC-0916-8F4E-A4F7-93506BA0D310}.Release.Build.0 = Release|Win32
+ {5371C383-6092-1238-A877-BAEB37867609}.Debug.ActiveCfg = Debug|Win32
+ {5371C383-6092-1238-A877-BAEB37867609}.Debug.Build.0 = Debug|Win32
+ {5371C383-6092-1238-A877-BAEB37867609}.Release.ActiveCfg = Release|Win32
+ {5371C383-6092-1238-A877-BAEB37867609}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792608}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792608}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792608}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792608}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D4A792607}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D4A792607}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D4A792607}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D4A792607}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792606}.Release.Build.0 = Release|Win32
+ {4E88C1C2-0961-F7A4-F48E-A6A7D3B06004}.Debug.ActiveCfg = Debug|Win32
+ {4E88C1C2-0961-F7A4-F48E-A6A7D3B06004}.Debug.Build.0 = Debug|Win32
+ {4E88C1C2-0961-F7A4-F48E-A6A7D3B06004}.Release.ActiveCfg = Release|Win32
+ {4E88C1C2-0961-F7A4-F48E-A6A7D3B06004}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792603}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792603}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792603}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792603}.Release.Build.0 = Release|Win32
+ {58CCE183-6032-12FE-A4F7-BA893A767601}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6032-12FE-A4F7-BA893A767601}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6032-12FE-A4F7-BA893A767601}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6032-12FE-A4F7-BA893A767601}.Release.Build.0 = Release|Win32
+ {5CE11C83-096A-84FE-4FA2-D3A6BA792002}.Debug.ActiveCfg = Debug|Win32
+ {5CE11C83-096A-84FE-4FA2-D3A6BA792002}.Debug.Build.0 = Debug|Win32
+ {5CE11C83-096A-84FE-4FA2-D3A6BA792002}.Release.ActiveCfg = Release|Win32
+ {5CE11C83-096A-84FE-4FA2-D3A6BA792002}.Release.Build.0 = Release|Win32
+ {58CC2563-6092-48FE-FAF7-BA046A792658}.Debug.ActiveCfg = Debug|Win32
+ {58CC2563-6092-48FE-FAF7-BA046A792658}.Debug.Build.0 = Debug|Win32
+ {58CC2563-6092-48FE-FAF7-BA046A792658}.Release.ActiveCfg = Release|Win32
+ {58CC2563-6092-48FE-FAF7-BA046A792658}.Release.Build.0 = Release|Win32
+ {58C1B183-9026-4E63-12F2-005412200054}.Debug.ActiveCfg = Debug|Win32
+ {58C1B183-9026-4E63-12F2-005412200054}.Debug.Build.0 = Debug|Win32
+ {58C1B183-9026-4E63-12F2-005412200054}.Release.ActiveCfg = Release|Win32
+ {58C1B183-9026-4E63-12F2-005412200054}.Release.Build.0 = Release|Win32
+ {58C1B183-9026-4E63-12F2-005202441254}.Debug.ActiveCfg = Debug|Win32
+ {58C1B183-9026-4E63-12F2-005202441254}.Debug.Build.0 = Debug|Win32
+ {58C1B183-9026-4E63-12F2-005202441254}.Release.ActiveCfg = Release|Win32
+ {58C1B183-9026-4E63-12F2-005202441254}.Release.Build.0 = Release|Win32
+ {58C181B3-9516-463E-2F12-122155400054}.Debug.ActiveCfg = Debug|Win32
+ {58C181B3-9516-463E-2F12-122155400054}.Debug.Build.0 = Debug|Win32
+ {58C181B3-9516-463E-2F12-122155400054}.Release.ActiveCfg = Release|Win32
+ {58C181B3-9516-463E-2F12-122155400054}.Release.Build.0 = Release|Win32
+ {5C1B8183-0296-4F83-1F22-001005220544}.Debug.ActiveCfg = Debug|Win32
+ {5C1B8183-0296-4F83-1F22-001005220544}.Debug.Build.0 = Debug|Win32
+ {5C1B8183-0296-4F83-1F22-001005220544}.Release.ActiveCfg = Release|Win32
+ {5C1B8183-0296-4F83-1F22-001005220544}.Release.Build.0 = Release|Win32
+ {58C1FE83-2906-E643-2F12-024410052254}.Debug.ActiveCfg = Debug|Win32
+ {58C1FE83-2906-E643-2F12-024410052254}.Debug.Build.0 = Debug|Win32
+ {58C1FE83-2906-E643-2F12-024410052254}.Release.ActiveCfg = Release|Win32
+ {58C1FE83-2906-E643-2F12-024410052254}.Release.Build.0 = Release|Win32
+ {58EB1CB3-1354-364E-12F2-154356612054}.Debug.ActiveCfg = Debug|Win32
+ {58EB1CB3-1354-364E-12F2-154356612054}.Debug.Build.0 = Debug|Win32
+ {58EB1CB3-1354-364E-12F2-154356612054}.Release.ActiveCfg = Release|Win32
+ {58EB1CB3-1354-364E-12F2-154356612054}.Release.Build.0 = Release|Win32
+ {58181CB3-5134-634E-12F2-155435622054}.Debug.ActiveCfg = Debug|Win32
+ {58181CB3-5134-634E-12F2-155435622054}.Debug.Build.0 = Debug|Win32
+ {58181CB3-5134-634E-12F2-155435622054}.Release.ActiveCfg = Release|Win32
+ {58181CB3-5134-634E-12F2-155435622054}.Release.Build.0 = Release|Win32
+ {5CB81183-29FB-F843-24FF-022050100544}.Debug.ActiveCfg = Debug|Win32
+ {5CB81183-29FB-F843-24FF-022050100544}.Debug.Build.0 = Debug|Win32
+ {5CB81183-29FB-F843-24FF-022050100544}.Release.ActiveCfg = Release|Win32
+ {5CB81183-29FB-F843-24FF-022050100544}.Release.Build.0 = Release|Win32
+ {58FBE8C3-9026-FAB2-E643-000522441254}.Debug.ActiveCfg = Debug|Win32
+ {58FBE8C3-9026-FAB2-E643-000522441254}.Debug.Build.0 = Debug|Win32
+ {58FBE8C3-9026-FAB2-E643-000522441254}.Release.ActiveCfg = Release|Win32
+ {58FBE8C3-9026-FAB2-E643-000522441254}.Release.Build.0 = Release|Win32
+ {48C1FBE8-F7A4-0961-48FE-7D93A63B0A04}.Debug.ActiveCfg = Debug|Win32
+ {48C1FBE8-F7A4-0961-48FE-7D93A63B0A04}.Debug.Build.0 = Debug|Win32
+ {48C1FBE8-F7A4-0961-48FE-7D93A63B0A04}.Release.ActiveCfg = Release|Win32
+ {48C1FBE8-F7A4-0961-48FE-7D93A63B0A04}.Release.Build.0 = Release|Win32
+ {5C18831B-F162-FA96-E6C3-FA5122040054}.Debug.ActiveCfg = Debug|Win32
+ {5C18831B-F162-FA96-E6C3-FA5122040054}.Debug.Build.0 = Debug|Win32
+ {5C18831B-F162-FA96-E6C3-FA5122040054}.Release.ActiveCfg = Release|Win32
+ {5C18831B-F162-FA96-E6C3-FA5122040054}.Release.Build.0 = Release|Win32
+ {5C1B1043-1EFF-2793-4E63-245241283054}.Debug.ActiveCfg = Debug|Win32
+ {5C1B1043-1EFF-2793-4E63-245241283054}.Debug.Build.0 = Debug|Win32
+ {5C1B1043-1EFF-2793-4E63-245241283054}.Release.ActiveCfg = Release|Win32
+ {5C1B1043-1EFF-2793-4E63-245241283054}.Release.Build.0 = Release|Win32
+ {51B189C3-4E63-9026-12F2-12200AF54054}.Debug.ActiveCfg = Debug|Win32
+ {51B189C3-4E63-9026-12F2-12200AF54054}.Debug.Build.0 = Debug|Win32
+ {51B189C3-4E63-9026-12F2-12200AF54054}.Release.ActiveCfg = Release|Win32
+ {51B189C3-4E63-9026-12F2-12200AF54054}.Release.Build.0 = Release|Win32
+ {5C1B1813-12C2-0296-4E63-244549126520}.Debug.ActiveCfg = Debug|Win32
+ {5C1B1813-12C2-0296-4E63-244549126520}.Debug.Build.0 = Debug|Win32
+ {5C1B1813-12C2-0296-4E63-244549126520}.Release.ActiveCfg = Release|Win32
+ {5C1B1813-12C2-0296-4E63-244549126520}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792653}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792653}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792653}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792653}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792652}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792652}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792652}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792652}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792651}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792651}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792651}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792651}.Release.Build.0 = Release|Win32
+ {58CCE183-6032-12FE-4FC7-83A79F760B61}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6032-12FE-4FC7-83A79F760B61}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6032-12FE-4FC7-83A79F760B61}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6032-12FE-4FC7-83A79F760B61}.Release.Build.0 = Release|Win32
+ {571C3383-6092-A877-1238-B3786BAE7605}.Debug.ActiveCfg = Debug|Win32
+ {571C3383-6092-A877-1238-B3786BAE7605}.Debug.Build.0 = Debug|Win32
+ {571C3383-6092-A877-1238-B3786BAE7605}.Release.ActiveCfg = Release|Win32
+ {571C3383-6092-A877-1238-B3786BAE7605}.Release.Build.0 = Release|Win32
+ {58C1B183-0296-EA42-EF04-005120054104}.Debug.ActiveCfg = Debug|Win32
+ {58C1B183-0296-EA42-EF04-005120054104}.Debug.Build.0 = Debug|Win32
+ {58C1B183-0296-EA42-EF04-005120054104}.Release.ActiveCfg = Release|Win32
+ {58C1B183-0296-EA42-EF04-005120054104}.Release.Build.0 = Release|Win32
+ {588CCD13-2962-83FE-F4B7-92230DB73629}.Debug.ActiveCfg = Debug|Win32
+ {588CCD13-2962-83FE-F4B7-92230DB73629}.Debug.Build.0 = Debug|Win32
+ {588CCD13-2962-83FE-F4B7-92230DB73629}.Release.ActiveCfg = Release|Win32
+ {588CCD13-2962-83FE-F4B7-92230DB73629}.Release.Build.0 = Release|Win32
+ {51D8E9C3-2D65-48FE-3AA7-7922C0E36329}.Debug.ActiveCfg = Debug|Win32
+ {51D8E9C3-2D65-48FE-3AA7-7922C0E36329}.Debug.Build.0 = Debug|Win32
+ {51D8E9C3-2D65-48FE-3AA7-7922C0E36329}.Release.ActiveCfg = Release|Win32
+ {51D8E9C3-2D65-48FE-3AA7-7922C0E36329}.Release.Build.0 = Release|Win32
+ {58BD1CC3-6972-F3F7-84BE-0DB736035922}.Debug.ActiveCfg = Debug|Win32
+ {58BD1CC3-6972-F3F7-84BE-0DB736035922}.Debug.Build.0 = Debug|Win32
+ {58BD1CC3-6972-F3F7-84BE-0DB736035922}.Release.ActiveCfg = Release|Win32
+ {58BD1CC3-6972-F3F7-84BE-0DB736035922}.Release.Build.0 = Release|Win32
+ {5BD1C7C3-3F7F-6972-84BE-B731D9236035}.Debug.ActiveCfg = Debug|Win32
+ {5BD1C7C3-3F7F-6972-84BE-B731D9236035}.Debug.Build.0 = Debug|Win32
+ {5BD1C7C3-3F7F-6972-84BE-B731D9236035}.Release.ActiveCfg = Release|Win32
+ {5BD1C7C3-3F7F-6972-84BE-B731D9236035}.Release.Build.0 = Release|Win32
+ {58CE1D83-F31E-4FD7-6132-8A79F6307B61}.Debug.ActiveCfg = Debug|Win32
+ {58CE1D83-F31E-4FD7-6132-8A79F6307B61}.Debug.Build.0 = Debug|Win32
+ {58CE1D83-F31E-4FD7-6132-8A79F6307B61}.Release.ActiveCfg = Release|Win32
+ {58CE1D83-F31E-4FD7-6132-8A79F6307B61}.Release.Build.0 = Release|Win32
+ {5CE19883-F413-7EFD-6342-B79639F7B611}.Debug.ActiveCfg = Debug|Win32
+ {5CE19883-F413-7EFD-6342-B79639F7B611}.Debug.Build.0 = Debug|Win32
+ {5CE19883-F413-7EFD-6342-B79639F7B611}.Release.ActiveCfg = Release|Win32
+ {5CE19883-F413-7EFD-6342-B79639F7B611}.Release.Build.0 = Release|Win32
+ {58DE18C3-3261-2F3E-FD47-83760B9FA761}.Debug.ActiveCfg = Debug|Win32
+ {58DE18C3-3261-2F3E-FD47-83760B9FA761}.Debug.Build.0 = Debug|Win32
+ {58DE18C3-3261-2F3E-FD47-83760B9FA761}.Release.ActiveCfg = Release|Win32
+ {58DE18C3-3261-2F3E-FD47-83760B9FA761}.Release.Build.0 = Release|Win32
+ {59CEC183-8192-8F6D-4FB7-BA260A79D352}.Debug.ActiveCfg = Debug|Win32
+ {59CEC183-8192-8F6D-4FB7-BA260A79D352}.Debug.Build.0 = Debug|Win32
+ {59CEC183-8192-8F6D-4FB7-BA260A79D352}.Release.ActiveCfg = Release|Win32
+ {59CEC183-8192-8F6D-4FB7-BA260A79D352}.Release.Build.0 = Release|Win32
+ {E385C28C-0691-4FA7-F48E-935BA0D06310}.Debug.ActiveCfg = Debug|Win32
+ {E385C28C-0691-4FA7-F48E-935BA0D06310}.Debug.Build.0 = Debug|Win32
+ {E385C28C-0691-4FA7-F48E-935BA0D06310}.Release.ActiveCfg = Release|Win32
+ {E385C28C-0691-4FA7-F48E-935BA0D06310}.Release.Build.0 = Release|Win32
+ {518CE8C3-6512-FA75-46EF-B917A3A116D1}.Debug.ActiveCfg = Debug|Win32
+ {518CE8C3-6512-FA75-46EF-B917A3A116D1}.Debug.Build.0 = Debug|Win32
+ {518CE8C3-6512-FA75-46EF-B917A3A116D1}.Release.ActiveCfg = Release|Win32
+ {518CE8C3-6512-FA75-46EF-B917A3A116D1}.Release.Build.0 = Release|Win32
+ {5D18CE83-1926-7AE4-FE94-B606D9B23131}.Debug.ActiveCfg = Debug|Win32
+ {5D18CE83-1926-7AE4-FE94-B606D9B23131}.Debug.Build.0 = Debug|Win32
+ {5D18CE83-1926-7AE4-FE94-B606D9B23131}.Release.ActiveCfg = Release|Win32
+ {5D18CE83-1926-7AE4-FE94-B606D9B23131}.Release.Build.0 = Release|Win32
+ {58CE1D84-1962-4FE9-BA0D-A4F7973A4652}.Debug.ActiveCfg = Debug|Win32
+ {58CE1D84-1962-4FE9-BA0D-A4F7973A4652}.Debug.Build.0 = Debug|Win32
+ {58CE1D84-1962-4FE9-BA0D-A4F7973A4652}.Release.ActiveCfg = Release|Win32
+ {58CE1D84-1962-4FE9-BA0D-A4F7973A4652}.Release.Build.0 = Release|Win32
+ {5188E3CE-2964-F43E-FB87-B037AC692D59}.Debug.ActiveCfg = Debug|Win32
+ {5188E3CE-2964-F43E-FB87-B037AC692D59}.Debug.Build.0 = Debug|Win32
+ {5188E3CE-2964-F43E-FB87-B037AC692D59}.Release.ActiveCfg = Release|Win32
+ {5188E3CE-2964-F43E-FB87-B037AC692D59}.Release.Build.0 = Release|Win32
+ {5CE14C83-4962-8F5E-4FA7-B0D3A7B93635}.Debug.ActiveCfg = Debug|Win32
+ {5CE14C83-4962-8F5E-4FA7-B0D3A7B93635}.Debug.Build.0 = Debug|Win32
+ {5CE14C83-4962-8F5E-4FA7-B0D3A7B93635}.Release.ActiveCfg = Release|Win32
+ {5CE14C83-4962-8F5E-4FA7-B0D3A7B93635}.Release.Build.0 = Release|Win32
+ {581B1C83-4E12-9526-020F-012482540054}.Debug.ActiveCfg = Debug|Win32
+ {581B1C83-4E12-9526-020F-012482540054}.Debug.Build.0 = Debug|Win32
+ {581B1C83-4E12-9526-020F-012482540054}.Release.ActiveCfg = Release|Win32
+ {581B1C83-4E12-9526-020F-012482540054}.Release.Build.0 = Release|Win32
+ {51B17C83-E172-5396-0FA2-825472008554}.Debug.ActiveCfg = Debug|Win32
+ {51B17C83-E172-5396-0FA2-825472008554}.Debug.Build.0 = Debug|Win32
+ {51B17C83-E172-5396-0FA2-825472008554}.Release.ActiveCfg = Release|Win32
+ {51B17C83-E172-5396-0FA2-825472008554}.Release.Build.0 = Release|Win32
+ {2B75C833-17D2-4956-A23F-820854254175}.Debug.ActiveCfg = Debug|Win32
+ {2B75C833-17D2-4956-A23F-820854254175}.Debug.Build.0 = Debug|Win32
+ {2B75C833-17D2-4956-A23F-820854254175}.Release.ActiveCfg = Release|Win32
+ {2B75C833-17D2-4956-A23F-820854254175}.Release.Build.0 = Release|Win32
+ {283AD375-7D12-5866-23BF-854308651275}.Debug.ActiveCfg = Debug|Win32
+ {283AD375-7D12-5866-23BF-854308651275}.Debug.Build.0 = Debug|Win32
+ {283AD375-7D12-5866-23BF-854308651275}.Release.ActiveCfg = Release|Win32
+ {283AD375-7D12-5866-23BF-854308651275}.Release.Build.0 = Release|Win32
+ {57C832B1-17D2-9537-FA12-827220448554}.Debug.ActiveCfg = Debug|Win32
+ {57C832B1-17D2-9537-FA12-827220448554}.Debug.Build.0 = Debug|Win32
+ {57C832B1-17D2-9537-FA12-827220448554}.Release.ActiveCfg = Release|Win32
+ {57C832B1-17D2-9537-FA12-827220448554}.Release.Build.0 = Release|Win32
+ {536C8251-7E12-9537-A1E2-822073258554}.Debug.ActiveCfg = Debug|Win32
+ {536C8251-7E12-9537-A1E2-822073258554}.Debug.Build.0 = Debug|Win32
+ {536C8251-7E12-9537-A1E2-822073258554}.Release.ActiveCfg = Release|Win32
+ {536C8251-7E12-9537-A1E2-822073258554}.Release.Build.0 = Release|Win32
+ {83258CB1-127E-9375-F872-8324A1054454}.Debug.ActiveCfg = Debug|Win32
+ {83258CB1-127E-9375-F872-8324A1054454}.Debug.Build.0 = Debug|Win32
+ {83258CB1-127E-9375-F872-8324A1054454}.Release.ActiveCfg = Release|Win32
+ {83258CB1-127E-9375-F872-8324A1054454}.Release.Build.0 = Release|Win32
+ {5198EFC3-2731-F34E-4FD8-1859AC94F761}.Debug.ActiveCfg = Debug|Win32
+ {5198EFC3-2731-F34E-4FD8-1859AC94F761}.Debug.Build.0 = Debug|Win32
+ {5198EFC3-2731-F34E-4FD8-1859AC94F761}.Release.ActiveCfg = Release|Win32
+ {5198EFC3-2731-F34E-4FD8-1859AC94F761}.Release.Build.0 = Release|Win32
+ {58DE18C3-3261-2F3E-FD47-83760B9FA761}.Debug.ActiveCfg = Debug|Win32
+ {58DE18C3-3261-2F3E-FD47-83760B9FA761}.Debug.Build.0 = Debug|Win32
+ {58DE18C3-3261-2F3E-FD47-83760B9FA761}.Release.ActiveCfg = Release|Win32
+ {58DE18C3-3261-2F3E-FD47-83760B9FA761}.Release.Build.0 = Release|Win32
+ {FFAA56F1-32EC-4B22-B6BD-95A311A67C35}.Debug.ActiveCfg = Debug|Win32
+ {FFAA56F1-32EC-4B22-B6BD-95A311A67C35}.Debug.Build.0 = Debug|Win32
+ {FFAA56F1-32EC-4B22-B6BD-95A311A67C35}.Release.ActiveCfg = Release|Win32
+ {FFAA56F1-32EC-4B22-B6BD-95A311A67C35}.Release.Build.0 = Release|Win32
+ {5E17C9C3-1362-2E1E-C84F-8A76B6739F21}.Debug.ActiveCfg = Debug|Win32
+ {5E17C9C3-1362-2E1E-C84F-8A76B6739F21}.Debug.Build.0 = Debug|Win32
+ {5E17C9C3-1362-2E1E-C84F-8A76B6739F21}.Release.ActiveCfg = Release|Win32
+ {5E17C9C3-1362-2E1E-C84F-8A76B6739F21}.Release.Build.0 = Release|Win32
+ {5E1D6C83-31DE-4F6F-6132-87A9FB663041}.Debug.ActiveCfg = Debug|Win32
+ {5E1D6C83-31DE-4F6F-6132-87A9FB663041}.Debug.Build.0 = Debug|Win32
+ {5E1D6C83-31DE-4F6F-6132-87A9FB663041}.Release.ActiveCfg = Release|Win32
+ {5E1D6C83-31DE-4F6F-6132-87A9FB663041}.Release.Build.0 = Release|Win32
+ {CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.ActiveCfg = Debug|Win32
+ {CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.Build.0 = Debug|Win32
+ {CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.ActiveCfg = Release|Win32
+ {CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.Build.0 = Release|Win32
+ {8A519DC3-6092-A4FE-F748-BA91328D6522}.Debug.ActiveCfg = Debug|Win32
+ {8A519DC3-6092-A4FE-F748-BA91328D6522}.Debug.Build.0 = Debug|Win32
+ {8A519DC3-6092-A4FE-F748-BA91328D6522}.Release.ActiveCfg = Release|Win32
+ {8A519DC3-6092-A4FE-F748-BA91328D6522}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792655}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792655}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792655}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792655}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792661}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792661}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792661}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792661}.Release.Build.0 = Release|Win32
+ {58C183CE-6203-FE12-A237-BA8976695960}.Debug.ActiveCfg = Debug|Win32
+ {58C183CE-6203-FE12-A237-BA8976695960}.Debug.Build.0 = Debug|Win32
+ {58C183CE-6203-FE12-A237-BA8976695960}.Release.ActiveCfg = Release|Win32
+ {58C183CE-6203-FE12-A237-BA8976695960}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792659}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792659}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792659}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792659}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792620}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792620}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792620}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792620}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792622}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792622}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792622}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792622}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792625}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792625}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792625}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792625}.Release.Build.0 = Release|Win32
+ {5C83CE18-4F48-A7FE-6092-B7920AD3A624}.Debug.ActiveCfg = Debug|Win32
+ {5C83CE18-4F48-A7FE-6092-B7920AD3A624}.Debug.Build.0 = Debug|Win32
+ {5C83CE18-4F48-A7FE-6092-B7920AD3A624}.Release.ActiveCfg = Release|Win32
+ {5C83CE18-4F48-A7FE-6092-B7920AD3A624}.Release.Build.0 = Release|Win32
+ {58CCE283-1609-48FE-A4F7-BA0D3A793523}.Debug.ActiveCfg = Debug|Win32
+ {58CCE283-1609-48FE-A4F7-BA0D3A793523}.Debug.Build.0 = Debug|Win32
+ {58CCE283-1609-48FE-A4F7-BA0D3A793523}.Release.ActiveCfg = Release|Win32
+ {58CCE283-1609-48FE-A4F7-BA0D3A793523}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4FC-BA0D3A792647}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4FC-BA0D3A792647}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4FC-BA0D3A792647}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4FC-BA0D3A792647}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792662}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792662}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792662}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792662}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792658}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792658}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792658}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792658}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792657}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792657}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792657}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792657}.Release.Build.0 = Release|Win32
+ {58C1B183-9026-4E12-00F2-001200540054}.Debug.ActiveCfg = Debug|Win32
+ {58C1B183-9026-4E12-00F2-001200540054}.Debug.Build.0 = Debug|Win32
+ {58C1B183-9026-4E12-00F2-001200540054}.Release.ActiveCfg = Release|Win32
+ {58C1B183-9026-4E12-00F2-001200540054}.Release.Build.0 = Release|Win32
+ {5E18CC83-6092-48FE-A677-B832A0D3A650}.Debug.ActiveCfg = Debug|Win32
+ {5E18CC83-6092-48FE-A677-B832A0D3A650}.Debug.Build.0 = Debug|Win32
+ {5E18CC83-6092-48FE-A677-B832A0D3A650}.Release.ActiveCfg = Release|Win32
+ {5E18CC83-6092-48FE-A677-B832A0D3A650}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792649}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792649}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792649}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792649}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792648}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792648}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792648}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792648}.Release.Build.0 = Release|Win32
+ {58CCE183-5091-48FE-A4FC-BA0D3A792446}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-5091-48FE-A4FC-BA0D3A792446}.Debug.Build.0 = Debug|Win32
+ {58CCE183-5091-48FE-A4FC-BA0D3A792446}.Release.ActiveCfg = Release|Win32
+ {58CCE183-5091-48FE-A4FC-BA0D3A792446}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792645}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792645}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792645}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792645}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792644}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792644}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792644}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792644}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792643}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792643}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792643}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792643}.Release.Build.0 = Release|Win32
+ {58CC8E13-0962-8F4E-77A6-BD3A6832A042}.Debug.ActiveCfg = Debug|Win32
+ {58CC8E13-0962-8F4E-77A6-BD3A6832A042}.Debug.Build.0 = Debug|Win32
+ {58CC8E13-0962-8F4E-77A6-BD3A6832A042}.Release.ActiveCfg = Release|Win32
+ {58CC8E13-0962-8F4E-77A6-BD3A6832A042}.Release.Build.0 = Release|Win32
+ {58C1B183-9260-4E8F-F200-000000000041}.Debug.ActiveCfg = Debug|Win32
+ {58C1B183-9260-4E8F-F200-000000000041}.Debug.Build.0 = Debug|Win32
+ {58C1B183-9260-4E8F-F200-000000000041}.Release.ActiveCfg = Release|Win32
+ {58C1B183-9260-4E8F-F200-000000000041}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A677-BA0D3A832640}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A677-BA0D3A832640}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A677-BA0D3A832640}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A677-BA0D3A832640}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792638}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792638}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792638}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792638}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792637}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792637}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792637}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792637}.Release.Build.0 = Release|Win32
+ {5821C383-6092-12FE-A877-BA0D33467633}.Debug.ActiveCfg = Debug|Win32
+ {5821C383-6092-12FE-A877-BA0D33467633}.Debug.Build.0 = Debug|Win32
+ {5821C383-6092-12FE-A877-BA0D33467633}.Release.ActiveCfg = Release|Win32
+ {5821C383-6092-12FE-A877-BA0D33467633}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792632}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792632}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792632}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792632}.Release.Build.0 = Release|Win32
+ {5CCE1883-0926-F7A4-8FE4-BA0606D92331}.Debug.ActiveCfg = Debug|Win32
+ {5CCE1883-0926-F7A4-8FE4-BA0606D92331}.Debug.Build.0 = Debug|Win32
+ {5CCE1883-0926-F7A4-8FE4-BA0606D92331}.Release.ActiveCfg = Release|Win32
+ {5CCE1883-0926-F7A4-8FE4-BA0606D92331}.Release.Build.0 = Release|Win32
+ {5C6D9CE1-2609-F7A4-8FE4-BA0883602330}.Debug.ActiveCfg = Debug|Win32
+ {5C6D9CE1-2609-F7A4-8FE4-BA0883602330}.Debug.Build.0 = Debug|Win32
+ {5C6D9CE1-2609-F7A4-8FE4-BA0883602330}.Release.ActiveCfg = Release|Win32
+ {5C6D9CE1-2609-F7A4-8FE4-BA0883602330}.Release.Build.0 = Release|Win32
+ {58E18CC3-6092-8F4E-A3E7-A792230D3629}.Debug.ActiveCfg = Debug|Win32
+ {58E18CC3-6092-8F4E-A3E7-A792230D3629}.Debug.Build.0 = Debug|Win32
+ {58E18CC3-6092-8F4E-A3E7-A792230D3629}.Release.ActiveCfg = Release|Win32
+ {58E18CC3-6092-8F4E-A3E7-A792230D3629}.Release.Build.0 = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792628}.Debug.ActiveCfg = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792628}.Debug.Build.0 = Debug|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792628}.Release.ActiveCfg = Release|Win32
+ {58CCE183-6092-48FE-A4F7-BA0D3A792628}.Release.Build.0 = Release|Win32
+ {83581CCE-487E-3292-A4E7-BA07926D3A27}.Debug.ActiveCfg = Debug|Win32
+ {83581CCE-487E-3292-A4E7-BA07926D3A27}.Debug.Build.0 = Debug|Win32
+ {83581CCE-487E-3292-A4E7-BA07926D3A27}.Release.ActiveCfg = Release|Win32
+ {83581CCE-487E-3292-A4E7-BA07926D3A27}.Release.Build.0 = Release|Win32
+ {0000058C-0000-0000-0000-000000000021}.Debug.ActiveCfg = Debug|Win32
+ {0000058C-0000-0000-0000-000000000021}.Debug.Build.0 = Debug|Win32
+ {0000058C-0000-0000-0000-000000000021}.Release.ActiveCfg = Release|Win32
+ {0000058C-0000-0000-0000-000000000021}.Release.Build.0 = Release|Win32
+ {83581CCE-487E-3292-A4E7-BA07926D3A14}.Debug.ActiveCfg = Debug|Win32
+ {83581CCE-487E-3292-A4E7-BA07926D3A14}.Debug.Build.0 = Debug|Win32
+ {83581CCE-487E-3292-A4E7-BA07926D3A14}.Release.ActiveCfg = Release|Win32
+ {83581CCE-487E-3292-A4E7-BA07926D3A14}.Release.Build.0 = Release|Win32
+ {5CE28C83-48FE-1676-4FA7-B50D3A76A013}.Debug.ActiveCfg = Debug|Win32
+ {5CE28C83-48FE-1676-4FA7-B50D3A76A013}.Debug.Build.0 = Debug|Win32
+ {5CE28C83-48FE-1676-4FA7-B50D3A76A013}.Release.ActiveCfg = Release|Win32
+ {5CE28C83-48FE-1676-4FA7-B50D3A76A013}.Release.Build.0 = Release|Win32
+ {818C43EE-3561-F3AE-4FD7-8A2076E76A31}.Debug.ActiveCfg = Debug|Win32
+ {818C43EE-3561-F3AE-4FD7-8A2076E76A31}.Debug.Build.0 = Debug|Win32
+ {818C43EE-3561-F3AE-4FD7-8A2076E76A31}.Release.ActiveCfg = Release|Win32
+ {818C43EE-3561-F3AE-4FD7-8A2076E76A31}.Release.Build.0 = Release|Win32
+ {5189DEA3-3261-F33E-47ED-83BC69F66061}.Debug.ActiveCfg = Debug|Win32
+ {5189DEA3-3261-F33E-47ED-83BC69F66061}.Debug.Build.0 = Debug|Win32
+ {5189DEA3-3261-F33E-47ED-83BC69F66061}.Release.ActiveCfg = Release|Win32
+ {5189DEA3-3261-F33E-47ED-83BC69F66061}.Release.Build.0 = Release|Win32
+ {5C82D1D3-3861-3AF1-03EF-89AED4716761}.Debug.ActiveCfg = Debug|Win32
+ {5C82D1D3-3861-3AF1-03EF-89AED4716761}.Debug.Build.0 = Debug|Win32
+ {5C82D1D3-3861-3AF1-03EF-89AED4716761}.Release.ActiveCfg = Release|Win32
+ {5C82D1D3-3861-3AF1-03EF-89AED4716761}.Release.Build.0 = Release|Win32
+ {4E887AC3-F8EA-6923-A744-C264A398C913}.Debug.ActiveCfg = Debug|Win32
+ {4E887AC3-F8EA-6923-A744-C264A398C913}.Debug.Build.0 = Debug|Win32
+ {4E887AC3-F8EA-6923-A744-C264A398C913}.Release.ActiveCfg = Release|Win32
+ {4E887AC3-F8EA-6923-A744-C264A398C913}.Release.Build.0 = Release|Win32
+ {589C2EB3-8A57-1862-F4EA-A6B14C7329A3}.Debug.ActiveCfg = Debug|Win32
+ {589C2EB3-8A57-1862-F4EA-A6B14C7329A3}.Debug.Build.0 = Debug|Win32
+ {589C2EB3-8A57-1862-F4EA-A6B14C7329A3}.Release.ActiveCfg = Release|Win32
+ {589C2EB3-8A57-1862-F4EA-A6B14C7329A3}.Release.Build.0 = Release|Win32
+ {51CE89A3-6092-F4EA-48A7-B4B9AC326093}.Debug.ActiveCfg = Debug|Win32
+ {51CE89A3-6092-F4EA-48A7-B4B9AC326093}.Debug.Build.0 = Debug|Win32
+ {51CE89A3-6092-F4EA-48A7-B4B9AC326093}.Release.ActiveCfg = Release|Win32
+ {51CE89A3-6092-F4EA-48A7-B4B9AC326093}.Release.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ EndGlobalSection
+ GlobalSection(ExtensibilityAddIns) = postSolution
+ EndGlobalSection
+EndGlobal
Deleted: trunk/libs/interprocess/proj/vc7ide/ProcessA.vcproj
==============================================================================
--- trunk/libs/interprocess/proj/vc7ide/ProcessA.vcproj 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,133 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="ProcessA"
- ProjectGUID="{58CCE183-6092-48FE-A4F7-BA0D3A792619}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="../../Bin/Win32/Debug"
- IntermediateDirectory="Debug/ProcessA"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- MinimalRebuild="TRUE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="4"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/ProcessA_d.exe"
- LinkIncremental="2"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/ProcessA.pdb"
- SubSystem="1"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="../../Bin/Win32/Release"
- IntermediateDirectory="Release/ProcessA"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/ProcessA.exe"
- LinkIncremental="1"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\..\example\process_a_example.cpp">
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
Deleted: trunk/libs/interprocess/proj/vc7ide/ProcessAFixed.vcproj
==============================================================================
--- trunk/libs/interprocess/proj/vc7ide/ProcessAFixed.vcproj 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,133 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="ProcessAFixed"
- ProjectGUID="{58CCE183-6092-48FE-A4F7-BA0D3A792618}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="../../Bin/Win32/Debug"
- IntermediateDirectory="Debug/ProcessAFixed"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- MinimalRebuild="TRUE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="4"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/ProcessAFixed_d.exe"
- LinkIncremental="2"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/ProcessAFixed.pdb"
- SubSystem="1"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="../../Bin/Win32/Release"
- IntermediateDirectory="Release/ProcessAFixed"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/ProcessAFixed.exe"
- LinkIncremental="1"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\..\example\process_a_fixed_example.cpp">
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
Deleted: trunk/libs/interprocess/proj/vc7ide/ProcessB.vcproj
==============================================================================
--- trunk/libs/interprocess/proj/vc7ide/ProcessB.vcproj 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,132 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="ProcessB"
- ProjectGUID="{58CCE183-6092-48FE-A4F7-BA0D3A792617}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="../../Bin/Win32/Debug"
- IntermediateDirectory="Debug/ProcessB"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- MinimalRebuild="TRUE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="4"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/ProcessB_d.exe"
- LinkIncremental="2"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/ProcessB.pdb"
- SubSystem="1"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="../../Bin/Win32/Release"
- IntermediateDirectory="Release/ProcessB"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/ProcessB.exe"
- LinkIncremental="1"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\..\example\process_b_example.cpp">
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd">
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
Deleted: trunk/libs/interprocess/proj/vc7ide/ProcessBFixed.vcproj
==============================================================================
--- trunk/libs/interprocess/proj/vc7ide/ProcessBFixed.vcproj 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,132 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="ProcessBFixed"
- ProjectGUID="{58CCE183-6092-48FE-A4F7-BA0D3A792616}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="../../Bin/Win32/Debug"
- IntermediateDirectory="Debug/ProcessBFixed"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- MinimalRebuild="TRUE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="4"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/ProcessBFixed_d.exe"
- LinkIncremental="2"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/ProcessBFixed.pdb"
- SubSystem="1"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="../../Bin/Win32/Release"
- IntermediateDirectory="Release/ProcessBFixed"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/ProcessBFixed.exe"
- LinkIncremental="1"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\..\example\process_b_fixed_example.cpp">
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd">
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
Deleted: trunk/libs/interprocess/proj/vc7ide/allocate_ex.vcproj
==============================================================================
--- trunk/libs/interprocess/proj/vc7ide/allocate_ex.vcproj 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,134 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="allocate_ex"
- ProjectGUID="{58CCE183-6092-48FE-A4F7-BA0D3A792663}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="../../Bin/Win32/Debug"
- IntermediateDirectory="Debug/allocate_ex"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- MinimalRebuild="TRUE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/allocate_ex_d.exe"
- LinkIncremental="1"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/allocate_ex.pdb"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="../../Bin/Win32/Release"
- IntermediateDirectory="Release/allocate_ex"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/allocate_ex.exe"
- LinkIncremental="1"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\..\example\alloc_example.cpp">
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
Deleted: trunk/libs/interprocess/proj/vc7ide/file_lock_test.vcproj
==============================================================================
--- trunk/libs/interprocess/proj/vc7ide/file_lock_test.vcproj 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,134 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="file_lock_test"
- ProjectGUID="{58CCE183-6092-48FE-A4F7-BA0D3A792639}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="../../Bin/Win32/Debug"
- IntermediateDirectory="Debug/file_lock_test"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- MinimalRebuild="TRUE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/file_lock_test_d.exe"
- LinkIncremental="1"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/file_lock_test.pdb"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="../../Bin/Win32/Release"
- IntermediateDirectory="Release/file_lock_test"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/file_lock_test.exe"
- LinkIncremental="1"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{7FCFEF41-3746-C7A5-8B8E-A352A2F22D7F}">
- <File
- RelativePath="..\..\test\file_lock_test.cpp">
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{95393980-8912-4b74-66A0-607BE52EB5FB}">
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
Deleted: trunk/libs/interprocess/proj/vc7ide/hash_table_ex.vcproj
==============================================================================
--- trunk/libs/interprocess/proj/vc7ide/hash_table_ex.vcproj 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,134 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="hash_table_test"
- ProjectGUID="{58CCE183-6092-48FE-A4F7-BA0D3A792636}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="../../Bin/Win32/Debug"
- IntermediateDirectory="Debug/hash_table_ex"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- MinimalRebuild="TRUE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/hash_table_ex_d.exe"
- LinkIncremental="1"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/hash_table_ex.pdb"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="../../Bin/Win32/Release"
- IntermediateDirectory="Release/hash_table_ex"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/hash_table_ex.exe"
- LinkIncremental="1"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\..\test\hash_table_test.cpp">
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
Deleted: trunk/libs/interprocess/proj/vc7ide/intersegment_ptr_test.vcproj
==============================================================================
--- trunk/libs/interprocess/proj/vc7ide/intersegment_ptr_test.vcproj 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="intersegment_ptr_test"
- ProjectGUID="{58CCE183-6092-12FE-A4F7-BA0D3A767634}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="../../Bin/Win32/Debug"
- IntermediateDirectory="Debug/intersegment_ptr_test"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- MinimalRebuild="TRUE"
- ExceptionHandling="TRUE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- RuntimeTypeInfo="TRUE"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/intersegment_ptr_test_d.exe"
- LinkIncremental="1"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/intersegment_ptr_test.pdb"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="../../Bin/Win32/Release"
- IntermediateDirectory="Release/intersegment_ptr_test"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- RuntimeLibrary="2"
- RuntimeTypeInfo="TRUE"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/intersegment_ptr_test.exe"
- LinkIncremental="1"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-CAA5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\..\test\intersegment_ptr_test.cpp">
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-8ABD-4b04-88EB-625FBE52EBFB}">
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
Deleted: trunk/libs/interprocess/proj/vc7ide/named_allocate_ex.vcproj
==============================================================================
--- trunk/libs/interprocess/proj/vc7ide/named_allocate_ex.vcproj 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,134 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="named_allocate_ex"
- ProjectGUID="{58CCE183-6092-48FE-A4F7-BA0D3A792626}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="../../Bin/Win32/Debug"
- IntermediateDirectory="Debug/named_allocate_ex"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- MinimalRebuild="TRUE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/named_allocate_ex_d.exe"
- LinkIncremental="1"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/named_allocate_ex.pdb"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="../../Bin/Win32/Release"
- IntermediateDirectory="Release/named_allocate_ex"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/named_allocate_ex.exe"
- LinkIncremental="1"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\..\example\named_alloc_example.cpp">
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
Deleted: trunk/libs/interprocess/proj/vc7ide/read_write_mutex_test.vcproj
==============================================================================
--- trunk/libs/interprocess/proj/vc7ide/read_write_mutex_test.vcproj 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,134 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="read_write_mutex_test"
- ProjectGUID="{58CCE183-6092-48FE-A4F7-BA0D3A792615}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="../../Bin/Win32/Debug"
- IntermediateDirectory="Debug/shared_read_write_mutex_test"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- MinimalRebuild="TRUE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/shared_read_write_mutex_test_d.exe"
- LinkIncremental="1"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/shared_read_write_mutex_test.pdb"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="../../Bin/Win32/Release"
- IntermediateDirectory="Release/shared_read_write_mutex_test"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/shared_read_write_mutex_test.exe"
- LinkIncremental="1"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
- <File
- RelativePath="..\..\test\read_write_mutex_test.cpp">
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
Deleted: trunk/libs/interprocess/proj/vc7ide/sharable_mutex.vcproj
==============================================================================
--- trunk/libs/interprocess/proj/vc7ide/sharable_mutex.vcproj 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,134 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="sharable_mutex_test"
- ProjectGUID="{5E188CC3-0962-F7A4-8F4E-A0D3B606A712}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="../../Bin/Win32/Debug"
- IntermediateDirectory="Debug/sharable_mutex_test"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- MinimalRebuild="TRUE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/sharable_mutex_test_d.exe"
- LinkIncremental="1"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/sharable_mutex_test.pdb"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="../../Bin/Win32/Release"
- IntermediateDirectory="Release/sharable_mutex_test"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/sharable_mutex_test.exe"
- LinkIncremental="1"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4737FCF1-C7A5-A606-4376-2A3252AD72FF}">
- <File
- RelativePath="..\..\test\sharable_mutex_test.cpp">
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{98903953-8D9B-88EB-4b04-6BBF2E52E5FB}">
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
Deleted: trunk/libs/interprocess/proj/vc7ide/shared_memory_mapping_test.vcproj
==============================================================================
--- trunk/libs/interprocess/proj/vc7ide/shared_memory_mapping_test.vcproj 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,135 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="shared_memory_mapping_test"
- ProjectGUID="{5CE18C83-6025-36FE-A4F7-BA09176D3A11}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="../../Bin/Win32/Debug"
- IntermediateDirectory="Debug/shared_memory_mapping_test"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- MinimalRebuild="TRUE"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="3"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/mapped_file_test_d.exe"
- LinkIncremental="1"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- ProgramDatabaseFile="$(OutDir)/shared_memory_mapping_test.pdb"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="../../Bin/Win32/Release"
- IntermediateDirectory="Release/shared_memory_mapping_test"
- ConfigurationType="1"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="3"
- AdditionalIncludeDirectories="../../../.."
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="TRUE"
- DebugInformationFormat="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- OutputFile="$(OutDir)/shared_memory_mapping_test.exe"
- LinkIncremental="1"
- AdditionalLibraryDirectories="../../../../stage/lib"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCWebDeploymentTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4F737F1-C7A5-3256-66A0-2A352A22D7FF}">
- <File
- RelativePath="..\..\test\shared_memory_mapping_test.cpp">
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{5CE18253-89BD-b044-826B-62B5F2EBFBE5}">
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
Deleted: trunk/libs/interprocess/test/allocation_test_template.hpp
==============================================================================
--- trunk/libs/interprocess/test/allocation_test_template.hpp 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,371 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztañaga 2006. 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_TEST_ALLOCATION_TEST_TEMPLATE_HEADER
-#define BOOST_INTERPROCESS_TEST_ALLOCATION_TEST_TEMPLATE_HEADER
-
-#include <vector>
-#include <iostream>
-#include <new>
-#include <utility>
-
-namespace boost { namespace interprocess { namespace test {
-
-//This test allocates until there is no more memory
-//and after that deallocates all in the inverse order
-template<class Allocator>
-bool test_allocation_inverse_deallocation(Allocator &a)
-{
- std::vector<void*> buffers;
-
- for(int i = 0; true; ++i){
- void *ptr = a.allocate(i, std::nothrow);
- if(!ptr)
- break;
- buffers.push_back(ptr);
- }
-
- for(int j = (int)buffers.size()
- ;j--
- ;){
- a.deallocate(buffers[j]);
- }
-
- return a.all_memory_deallocated() && a.check_sanity();
-}
-
-//This test allocates until there is no more memory
-//and after that deallocates all in the same order
-template<class Allocator>
-bool test_allocation_direct_deallocation(Allocator &a)
-{
- std::vector<void*> buffers;
-
- for(int i = 0; true; ++i){
- void *ptr = a.allocate(i, std::nothrow);
- if(!ptr)
- break;
- buffers.push_back(ptr);
- }
-
- for(int j = 0, max = (int)buffers.size()
- ;j < max
- ;++j){
- a.deallocate(buffers[j]);
- }
-
- return a.all_memory_deallocated() && a.check_sanity();
-}
-
-//This test allocates until there is no more memory
-//and after that deallocates all following a pattern
-template<class Allocator>
-bool test_allocation_mixed_deallocation(Allocator &a)
-{
- std::vector<void*> buffers;
-
- for(int i = 0; true; ++i){
- void *ptr = a.allocate(i, std::nothrow);
- if(!ptr)
- break;
- buffers.push_back(ptr);
- }
-
- for(int j = 0, max = (int)buffers.size()
- ;j < max
- ;++j){
- int pos = (j%4)*((int)buffers.size())/4;
- a.deallocate(buffers[pos]);
- buffers.erase(buffers.begin()+pos);
- }
-
- return a.all_memory_deallocated() && a.check_sanity();
-}
-
-//This test allocates until there is no more memory
-//and after that tries to shrink all the buffers to the
-//half of the original size
-template<class Allocator>
-bool test_allocation_shrink(Allocator &a)
-{
- std::vector<void*> buffers;
-
- //Allocate buffers with extra memory
- for(int i = 0; true; ++i){
- void *ptr = a.allocate(i*2, std::nothrow);
- if(!ptr)
- break;
- buffers.push_back(ptr);
- }
-
- //Now shrink to half
- for(int i = 0, max = (int)buffers.size()
- ;i < max
- ; ++i){
- std::size_t received_size;
- if(a.allocation_command( shrink_in_place | nothrow_allocation, i*2
- , i, received_size, buffers[i]).first){
- if(received_size > std::size_t(i*2)){
- return false;
- }
- if(received_size < std::size_t(i)){
- return false;
- }
- }
- }
-
- //Deallocate it in non sequential order
- for(int j = 0, max = (int)buffers.size()
- ;j < max
- ;++j){
- int pos = (j%4)*((int)buffers.size())/4;
- a.deallocate(buffers[pos]);
- buffers.erase(buffers.begin()+pos);
- }
-
- return a.all_memory_deallocated() && a.check_sanity();
-}
-
-//This test allocates until there is no more memory
-//and after that tries to expand all the buffers to
-//avoid the wasted internal fragmentation
-template<class Allocator>
-bool test_allocation_expand(Allocator &a)
-{
- std::vector<void*> buffers;
-
- //Allocate buffers with extra memory
- for(int i = 0; true; ++i){
- void *ptr = a.allocate(i, std::nothrow);
- if(!ptr)
- break;
- buffers.push_back(ptr);
- }
-
- //Now try to expand to the double of the size
- for(int i = 0, max = (int)buffers.size()
- ;i < max
- ;++i){
- std::size_t received_size;
- std::size_t min_size = i+1;
- std::size_t preferred_size = i*2;
- preferred_size = min_size > preferred_size ? min_size : preferred_size;
-
- while(a.allocation_command( expand_fwd | nothrow_allocation, min_size
- , preferred_size, received_size, buffers[i]).first){
- //Check received size is bigger than minimum
- if(received_size < min_size){
- return false;
- }
- //Now, try to expand further
- min_size = received_size+1;
- preferred_size = min_size*2;
- }
- }
-
- //Deallocate it in non sequential order
- for(int j = 0, max = (int)buffers.size()
- ;j < max
- ;++j){
- int pos = (j%4)*((int)buffers.size())/4;
- a.deallocate(buffers[pos]);
- buffers.erase(buffers.begin()+pos);
- }
-
- return a.all_memory_deallocated() && a.check_sanity();
-}
-
-//This test allocates until there is no more memory
-//and after that deallocates the odd buffers to
-//make room for expansions. The expansion will probably
-//success since the deallocation left room for that.
-template<class Allocator>
-bool test_allocation_deallocation_expand(Allocator &a)
-{
- std::vector<void*> buffers;
-
- //Allocate buffers with extra memory
- for(int i = 0; true; ++i){
- void *ptr = a.allocate(i, std::nothrow);
- if(!ptr)
- break;
- buffers.push_back(ptr);
- }
-
- //Now deallocate the half of the blocks
- //so expand maybe can merge new free blocks
- for(int i = 0, max = (int)buffers.size()
- ;i < max
- ;++i){
- if(i%2){
- a.deallocate(buffers[i]);
- buffers[i] = 0;
- }
- }
-
- //Now try to expand to the double of the size
- for(int i = 0, max = (int)buffers.size()
- ;i < max
- ;++i){
- //
- if(buffers[i]){
- std::size_t received_size;
- std::size_t min_size = i+1;
- std::size_t preferred_size = i*2;
- preferred_size = min_size > preferred_size ? min_size : preferred_size;
-
- while(a.allocation_command( expand_fwd | nothrow_allocation, min_size
- , preferred_size, received_size, buffers[i]).first){
- //Check received size is bigger than minimum
- if(received_size < min_size){
- return false;
- }
- //Now, try to expand further
- min_size = received_size+1;
- preferred_size = min_size*2;
- }
- }
- }
-
- //Now erase null values from the vector
- buffers.erase(std::remove(buffers.begin(), buffers.end(), (void*)0)
- ,buffers.end());
-
- //Deallocate it in non sequential order
- for(int j = 0, max = (int)buffers.size()
- ;j < max
- ;++j){
- int pos = (j%4)*((int)buffers.size())/4;
- a.deallocate(buffers[pos]);
- buffers.erase(buffers.begin()+pos);
- }
-
- return a.all_memory_deallocated() && a.check_sanity();
-}
-
-//This test allocates until there is no more memory
-//and after that deallocates all except the last.
-//If the allocation algorithm is a bottom-up algorithm
-//the last buffer will be in the end of the segment.
-//Then the test will start expanding backwards, until
-//the buffer fills all the memory
-template<class Allocator>
-bool test_allocation_with_reuse(Allocator &a)
-{
- std::vector<void*> buffers;
-
- //Allocate buffers with extra memory
- for(int i = 0; true; ++i){
- void *ptr = a.allocate(i, std::nothrow);
- if(!ptr)
- break;
- buffers.push_back(ptr);
- }
-
- //Now deallocate all except the latest
- //Now try to expand to the double of the size
- for(int i = 0, max = (int)buffers.size() - 1
- ;i < max
- ;++i){
- a.deallocate(buffers[i]);
- }
-
- //Save the unique buffer and clear vector
- void *ptr = buffers.back();
- buffers.clear();
-
- //Now allocate with reuse
- std::size_t received_size = 0;
- for(int i = 0; true; ++i){
- std::pair<void*, bool> ret =
- a.allocation_command( expand_bwd | nothrow_allocation, received_size+1
- , received_size+(i+1)*2, received_size, ptr);
- if(!ret.first)
- break;
- //If we have memory, this must be a buffer reuse
- if(!ret.second)
- return 1;
- ptr = ret.first;
- }
- //There is only a single block so deallocate it
- a.deallocate(ptr);
-
- return a.all_memory_deallocated() && a.check_sanity();
-}
-
-//This function calls all tests
-template<class Allocator>
-bool test_all_allocation(Allocator &a)
-{
-
- std::cout << "Starting test_allocation_direct_deallocation. Class: "
- << typeid(a).name() << std::endl;
-
- if(!test_allocation_direct_deallocation(a)){
- std::cout << "test_allocation_direct_deallocation failed. Class: "
- << typeid(a).name() << std::endl;
- return false;
- }
-
- std::cout << "Starting test_allocation_inverse_deallocation. Class: "
- << typeid(a).name() << std::endl;
-
- if(!test_allocation_inverse_deallocation(a)){
- std::cout << "test_allocation_inverse_deallocation failed. Class: "
- << typeid(a).name() << std::endl;
- return false;
- }
-
- std::cout << "Starting test_allocation_mixed_deallocation. Class: "
- << typeid(a).name() << std::endl;
-
- if(!test_allocation_mixed_deallocation(a)){
- std::cout << "test_allocation_mixed_deallocation failed. Class: "
- << typeid(a).name() << std::endl;
- return false;
- }
-
- std::cout << "Starting test_allocation_shrink. Class: "
- << typeid(a).name() << std::endl;
-
- if(!test_allocation_shrink(a)){
- std::cout << "test_allocation_shrink failed. Class: "
- << typeid(a).name() << std::endl;
- return false;
- }
-
- std::cout << "Starting test_allocation_expand. Class: "
- << typeid(a).name() << std::endl;
-
- if(!test_allocation_expand(a)){
- std::cout << "test_allocation_expand failed. Class: "
- << typeid(a).name() << std::endl;
- return false;
- }
-
- if(!test_allocation_deallocation_expand(a)){
- std::cout << "test_allocation_deallocation_expand failed. Class: "
- << typeid(a).name() << std::endl;
- return false;
- }
-
- if(!test_allocation_with_reuse(a)){
- std::cout << "test_allocation_with_reuse failed. Class: "
- << typeid(a).name() << std::endl;
- return false;
- }
-
- return true;
-}
-
-}}} //namespace boost { namespace interprocess { namespace test {
-
-#endif //BOOST_INTERPROCESS_TEST_ALLOCATION_TEST_TEMPLATE_HEADER
-
Deleted: trunk/libs/interprocess/test/get_compiler_name.hpp
==============================================================================
--- trunk/libs/interprocess/test/get_compiler_name.hpp 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,48 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztanaga 2004-2007. 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_GET_COMPILER_NAME_HPP
-#define BOOST_GET_COMPILER_NAME_HPP
-
-#include <boost/config.hpp>
-#include <string>
-#include <algorithm>
-
-namespace boost{
-namespace interprocess{
-namespace test{
-
-inline void get_compiler_name(std::string &str)
-{
- str = BOOST_COMPILER;
- std::replace(str.begin(), str.end(), ' ', '_');
- std::replace(str.begin(), str.end(), '.', '_');
-}
-
-inline const char *get_compiler_name()
-{
- static std::string str;
- get_compiler_name(str);
- return str.c_str();
-}
-
-inline const char *add_to_compiler_name(const char *name)
-{
- static std::string str;
- get_compiler_name(str);
- str += name;
- return str.c_str();
-}
-
-} //namespace test{
-} //namespace interprocess{
-} //namespace boost{
-
-#endif //#ifndef BOOST_GET_COMPILER_NAME_HPP
Deleted: trunk/libs/interprocess/test/printcontainer.hpp
==============================================================================
--- trunk/libs/interprocess/test/printcontainer.hpp 2007-09-26 13:53:01 EDT (Wed, 26 Sep 2007)
+++ (empty file)
@@ -1,45 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztañaga 2004-2006. 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_PRINTCONTAINER_HPP
-#define BOOST_PRINTCONTAINER_HPP
-
-#include <functional>
-#include <iostream>
-#include <algorithm>
-#include <boost/interprocess/detail/config_begin.hpp>
-
-namespace boost{
-namespace interprocess{
-namespace test{
-
-struct PrintValues : public std::unary_function<int, void>
-{
- void operator() (int value) const
- {
- std::cout << value << " ";
- }
-};
-
-template<class Container>
-void PrintContents(const Container &cont, const char *contName)
-{
- std::cout<< "Printing contents of " << contName << std::endl;
- std::for_each(cont.begin(), cont.end(), PrintValues());
- std::cout<< std::endl << std::endl;
-}
-
-} //namespace test{
-} //namespace interprocess{
-} //namespace boost{
-
-#include <boost/interprocess/detail/config_end.hpp>
-
-#endif //#ifndef BOOST_PRINTCONTAINER_HPP
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk