summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorirfan <irfan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-09-08 02:53:31 +0000
committerirfan <irfan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-09-08 02:53:31 +0000
commit95012743a8c2f734bae9327bed5127240e675c9f (patch)
tree9514ac9cfdc07c1feeb44a56f2379e5d2e2d2e33
parent58b97baec866c98d9d6d75f32adf0a0ac8a671c9 (diff)
downloadATCD-95012743a8c2f734bae9327bed5127240e675c9f.tar.gz
ChangeLogTag:Tue Sep 07 19:55:52 1999 Irfan Pyarali <irfan@cs.wustl.edu>
-rw-r--r--ChangeLog-99b35
-rw-r--r--ace/Active_Map_Manager_T.i19
-rw-r--r--ace/Map_Manager.cpp123
-rw-r--r--ace/Map_Manager.h18
-rw-r--r--ace/Map_Manager.i118
-rw-r--r--ace/README3
-rw-r--r--tests/Lazy_Map_Manager_Test.cpp385
-rw-r--r--tests/Lazy_Map_Manager_Test.dsp194
-rw-r--r--tests/Makefile1
-rwxr-xr-xtests/run_pharlap_tests.bat1
-rw-r--r--tests/run_tests.bat1
-rw-r--r--tests/run_tests.lst1
-rwxr-xr-xtests/run_tests.psosim2
-rw-r--r--tests/tests.dsw12
-rw-r--r--tests/version_tests/Lazy_Map_Manager_Test.dsp274
-rw-r--r--tests/version_tests/version_tests.dsw12
16 files changed, 1176 insertions, 23 deletions
diff --git a/ChangeLog-99b b/ChangeLog-99b
index 2ff961d5dc4..290ff6dc8f7 100644
--- a/ChangeLog-99b
+++ b/ChangeLog-99b
@@ -1,3 +1,38 @@
+Tue Sep 07 19:55:52 1999 Irfan Pyarali <irfan@cs.wustl.edu>
+
+ * ace/Map_Manager.h (ACE_Map_Manager): The old map manager (the
+ one before the changes made to support the active map manager)
+ used to allow deletion of entries from the map during iteration
+ (note that this feature was accidental since typically changes
+ to container invalidates the iterators). The new design did not
+ support this "feature". However, some users had come to depend
+ on this feature.
+
+ The solution was to delay the movement of freed slots from the
+ occupied list to the free list until we run out of free slots in
+ the free list when binding new entries into the map. However,
+ this change requires additional state in each entry that keeps
+ track of whether this entry has been freed. Also, the time
+ required for binding new entries is less predictable since the
+ bind may require moving of freed slots from the occupied list to
+ the free list because of the initial lazy unbind.
+
+ Changes were also required to the Active_Map_Manager since it
+ directly depends on the internals of the Map_Manager.
+
+ Since this lazy feature is not required in the majority of cases
+ and results in increased memory consumption, this feature is
+ only support if ACE_HAS_LAZY_MAP_MANAGER is defined.
+
+ A new test Lazy_Map_Manager_Test.cpp was added to check the new
+ changes.
+
+ Thanks for Dr. Schmidt for helping with this solution and to
+ Murphy Ivan <Ivan.Murphy@med.siemens.de> for pointing out this
+ problem.
+
+ Bug fixed: id 228.
+
Tue Sep 7 15:19:33 1999 Douglas C. Schmidt <schmidt@tango.cs.wustl.edu>
* tests/Log_Msg_Test.cpp (test_ostream): NUL-terminated the buffer
diff --git a/ace/Active_Map_Manager_T.i b/ace/Active_Map_Manager_T.i
index 29197057d0c..58f485f4432 100644
--- a/ace/Active_Map_Manager_T.i
+++ b/ace/Active_Map_Manager_T.i
@@ -61,6 +61,9 @@ ACE_Active_Map_Manager<T>::find (const ACE_Active_Map_Manager_Key &key,
size_t slot_generation = key.slot_generation ();
if (slot_index > this->total_size_ ||
+#if defined (ACE_HAS_LAZY_MAP_MANAGER)
+ this->search_structure_[slot_index].free_ ||
+#endif /* ACE_HAS_LAZY_MAP_MANAGER */
this->search_structure_[slot_index].ext_id_.slot_generation () != slot_generation ||
this->search_structure_[slot_index].ext_id_.slot_index () == this->free_list_id ())
{
@@ -167,9 +170,23 @@ ACE_Active_Map_Manager<T>::unbind (const ACE_Active_Map_Manager_Key &key,
{
size_t slot_index = key.slot_index ();
- // Move from occupied list to free list
+#if defined (ACE_HAS_LAZY_MAP_MANAGER)
+
+ //
+ // In the case of lazy map managers, the movement of free slots
+ // from the occupied list to the free list is delayed until we
+ // run out of free slots in the free list.
+ //
+
+ this->search_structure_[slot_index].free_ = 1;
+
+#else
+
+ // Move from occupied list to free list.
this->move_from_occupied_list_to_free_list (slot_index);
+#endif /* ACE_HAS_LAZY_MAP_MANAGER */
+
// Reset the slot_index. This will tell us that this entry is free.
this->search_structure_[slot_index].ext_id_.slot_index (this->free_list_id ());
diff --git a/ace/Map_Manager.cpp b/ace/Map_Manager.cpp
index 7bcec198a04..fe9286075d3 100644
--- a/ace/Map_Manager.cpp
+++ b/ace/Map_Manager.cpp
@@ -95,26 +95,86 @@ ACE_Map_Manager<EXT_ID, INT_ID, ACE_LOCK>::bind_i (const EXT_ID &ext_id,
template <class EXT_ID, class INT_ID, class ACE_LOCK> int
ACE_Map_Manager<EXT_ID, INT_ID, ACE_LOCK>::next_free (size_t &free_slot)
{
- // Find an empty slot.
+ // Look in the free list for an empty slot.
free_slot = this->free_list_.next ();
- // Make sure we haven't run out of free slots.
+ // If we do find a free slot, return successfully.
if (free_slot != this->free_list_id ())
return 0;
- else
- {
- // Resize the map.
- int result = this->resize_i (this->new_size ());
- // Check for errors.
- if (result == 0)
- // New free slot.
- free_slot = this->free_list_.next ();
+#if defined (ACE_HAS_LAZY_MAP_MANAGER)
+
+ // Move any free slots from occupied list to free list.
+ this->move_all_free_slots_from_occupied_list ();
+
+ // Try again in case we found any free slots in the occupied list.
+ free_slot = this->free_list_.next ();
+
+ // If we do find a free slot, return successfully.
+ if (free_slot != this->free_list_id ())
+ return 0;
+
+#endif /* ACE_HAS_LAZY_MAP_MANAGER */
+
+ // Resize the map.
+ int result = this->resize_i (this->new_size ());
+
+ // Check for errors.
+ if (result == 0)
+ // New free slot.
+ free_slot = this->free_list_.next ();
+
+ return result;
+}
+
+#if defined (ACE_HAS_LAZY_MAP_MANAGER)
+
+template <class EXT_ID, class INT_ID, class ACE_LOCK> void
+ACE_Map_Manager<EXT_ID, INT_ID, ACE_LOCK>::move_all_free_slots_from_occupied_list (void)
+{
+ //
+ // In the case of lazy map managers, the movement of free slots from
+ // the occupied list to the free list is delayed until we run out of
+ // free slots in the free list.
+ //
+
+ // Go through the entire occupied list, moving free slots to the
+ // free list. Note that all free slots in the occupied list are
+ // moved in this loop.
+ for (size_t i = this->occupied_list_.next ();
+ i != this->occupied_list_id ();
+ )
+ {
+ //
+ // Note the trick used here: Information about the current slot
+ // is first noted; <i> then moves to the next occupied slot;
+ // only after this is the slot (potentially) moved from the
+ // occupied list to the free list. This order of things, i.e.,
+ // moving <i> before moving the free slot is necessary,
+ // otherwise we'll forget which our next occupied slot is.
+ //
+
+ // Note information about current slot.
+ ACE_Map_Entry<EXT_ID, INT_ID> &current_slot = this->search_structure_[i];
+ size_t position_of_current_slot = i;
+
+ // Move <i> to next occupied slot.
+ i = this->search_structure_[i].next ();
+
+ // If current slot is free
+ if (current_slot.free_)
+ {
+ // Reset free flag to zero before moving to free list.
+ current_slot.free_ = 0;
- return result;
+ // Move from occupied list to free list.
+ this->move_from_occupied_list_to_free_list (position_of_current_slot);
+ }
}
}
+#endif /* ACE_HAS_LAZY_MAP_MANAGER */
+
template <class EXT_ID, class INT_ID, class ACE_LOCK> void
ACE_Map_Manager<EXT_ID, INT_ID, ACE_LOCK>::shared_move (size_t slot,
ACE_Map_Entry<EXT_ID, INT_ID> &current_list,
@@ -303,6 +363,14 @@ ACE_Map_Manager<EXT_ID, INT_ID, ACE_LOCK>::find_and_return_index (const EXT_ID &
i != this->occupied_list_id ();
i = this->search_structure_[i].next ())
{
+
+#if defined (ACE_HAS_LAZY_MAP_MANAGER)
+
+ if (this->search_structure_[i].free_)
+ continue;
+
+#endif /* ACE_HAS_LAZY_MAP_MANAGER */
+
if (this->equal (this->search_structure_[i].ext_id_,
ext_id))
{
@@ -341,9 +409,24 @@ ACE_Map_Manager<EXT_ID, INT_ID, ACE_LOCK>::unbind_and_return_index (const EXT_ID
if (result == 0)
{
- // Move from occupied list to free list
+
+#if defined (ACE_HAS_LAZY_MAP_MANAGER)
+
+ //
+ // In the case of lazy map managers, the movement of free slots
+ // from the occupied list to the free list is delayed until we
+ // run out of free slots in the free list.
+ //
+
+ this->search_structure_[slot].free_ = 1;
+
+#else
+
+ // Move from occupied list to free list.
this->move_from_occupied_list_to_free_list (slot);
+#endif /* ACE_HAS_LAZY_MAP_MANAGER */
+
// Update the current size.
--this->cur_size_;
}
@@ -400,6 +483,17 @@ ACE_Map_Manager<EXT_ID, INT_ID, ACE_LOCK>::resize_i (size_t new_size)
new (&(temp[i])) ENTRY;
temp[i].next (i + 1);
temp[i].prev (i - 1);
+
+#if defined (ACE_HAS_LAZY_MAP_MANAGER)
+
+ // Even though this slot is initially free, we need the <free_>
+ // flag to be zero so that we don't have to set it when the slot
+ // is moved to the occupied list. In addition, this flag has no
+ // meaning while this slot is in the free list.
+ temp[i].free_ = 0;
+
+#endif /* ACE_HAS_LAZY_MAP_MANAGER */
+
}
// Add new entries to the free list.
@@ -463,6 +557,11 @@ ACE_Map_Entry<EXT_ID, INT_ID>::dump (void) const
ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this));
ACE_DEBUG ((LM_DEBUG, ASYS_TEXT ("next_ = %d"), this->next_));
ACE_DEBUG ((LM_DEBUG, ASYS_TEXT ("prev_ = %d"), this->prev_));
+
+#if defined (ACE_HAS_LAZY_MAP_MANAGER)
+ ACE_DEBUG ((LM_DEBUG, ASYS_TEXT ("free_ = %d"), this->free_));
+#endif /* ACE_HAS_LAZY_MAP_MANAGER */
+
ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
}
diff --git a/ace/Map_Manager.h b/ace/Map_Manager.h
index 0da265175f2..f684bcb7aad 100644
--- a/ace/Map_Manager.h
+++ b/ace/Map_Manager.h
@@ -68,6 +68,14 @@ public:
size_t prev_;
// Keeps track of the previous entry.
+
+#if defined (ACE_HAS_LAZY_MAP_MANAGER)
+
+ int free_;
+ // Is this entry free?
+
+#endif /* ACE_HAS_LAZY_MAP_MANAGER */
+
};
// Forward decl.
@@ -327,6 +335,16 @@ protected:
void move_from_occupied_list_to_free_list (size_t slot);
// Move from occupied list to free list.
+#if defined (ACE_HAS_LAZY_MAP_MANAGER)
+
+ void move_all_free_slots_from_occupied_list (void);
+ // In the case of lazy map managers, the movement of free slots from
+ // the occupied list to the free list is delayed until we run out of
+ // free slots in the free list. This function goes through the
+ // entire occupied list, moving free slots to the free list.
+
+#endif /* ACE_HAS_LAZY_MAP_MANAGER */
+
void shared_move (size_t slot,
ACE_Map_Entry<EXT_ID, INT_ID> &current_list,
size_t current_list_id,
diff --git a/ace/Map_Manager.i b/ace/Map_Manager.i
index 940acbc10b1..5ab50a108a3 100644
--- a/ace/Map_Manager.i
+++ b/ace/Map_Manager.i
@@ -290,10 +290,30 @@ ACE_Map_Iterator_Base<EXT_ID, INT_ID, ACE_LOCK>::done (void) const
template <class EXT_ID, class INT_ID, class ACE_LOCK> ACE_INLINE int
ACE_Map_Iterator_Base<EXT_ID, INT_ID, ACE_LOCK>::forward_i (void)
{
- if (this->next_ == this->map_man_->occupied_list_id ())
- this->next_ = this->map_man_->occupied_list_.next ();
- else
- this->next_ = this->map_man_->search_structure_[this->next_].next ();
+
+#if defined (ACE_HAS_LAZY_MAP_MANAGER)
+
+ while (1)
+ {
+ // Go to the next item in the list.
+ this->next_ = this->map_man_->search_structure_[this->next_].next ();
+
+ // Stop if we reach the end.
+ if (this->done ())
+ break;
+
+ // Break if we find a non-free slot.
+ if (!this->map_man_->search_structure_[this->next_].free_)
+ {
+ break;
+ }
+ }
+
+#else
+
+ this->next_ = this->map_man_->search_structure_[this->next_].next ();
+
+#endif /* ACE_HAS_LAZY_MAP_MANAGER */
return this->next_ != this->map_man_->occupied_list_id ();
}
@@ -301,10 +321,30 @@ ACE_Map_Iterator_Base<EXT_ID, INT_ID, ACE_LOCK>::forward_i (void)
template <class EXT_ID, class INT_ID, class ACE_LOCK> ACE_INLINE int
ACE_Map_Iterator_Base<EXT_ID, INT_ID, ACE_LOCK>::reverse_i (void)
{
- if (this->next_ == this->map_man_->occupied_list_id ())
- this->next_ = this->map_man_->occupied_list_.prev ();
- else
- this->next_ = this->map_man_->search_structure_[this->next_].prev ();
+
+#if defined (ACE_HAS_LAZY_MAP_MANAGER)
+
+ while (1)
+ {
+ // Go to the prev item in the list.
+ this->next_ = this->map_man_->search_structure_[this->next_].prev ();
+
+ // Stop if we reach the end.
+ if (this->done ())
+ break;
+
+ // Break if we find a non-free slot.
+ if (!this->map_man_->search_structure_[this->next_].free_)
+ {
+ break;
+ }
+ }
+
+#else
+
+ this->next_ = this->map_man_->search_structure_[this->next_].prev ();
+
+#endif /* ACE_HAS_LAZY_MAP_MANAGER */
return this->next_ != this->map_man_->occupied_list_id ();
}
@@ -335,7 +375,36 @@ ACE_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK>::ACE_Map_Iterator (ACE_Map_Manager<EX
: ACE_Map_Iterator_Base<EXT_ID, INT_ID, ACE_LOCK> (mm)
{
if (!pass_end)
- this->forward_i ();
+ {
+
+#if defined (ACE_HAS_LAZY_MAP_MANAGER)
+
+ // Start here.
+ this->next_ = this->map_man_->occupied_list_.next ();
+
+ while (1)
+ {
+ // Stop if we reach the end.
+ if (this->done ())
+ break;
+
+ // Break if we find a non-free slot.
+ if (!this->map_man_->search_structure_[this->next_].free_)
+ {
+ break;
+ }
+
+ // Go to the next item in the list.
+ this->next_ = this->map_man_->search_structure_[this->next_].next ();
+ }
+
+#else
+
+ this->next_ = this->map_man_->occupied_list_.next ();
+
+#endif /* ACE_HAS_LAZY_MAP_MANAGER */
+
+ }
}
template <class EXT_ID, class INT_ID, class ACE_LOCK> ACE_INLINE int
@@ -384,7 +453,36 @@ ACE_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK>::ACE_Map_Reverse_Iterator (AC
: ACE_Map_Iterator_Base<EXT_ID, INT_ID, ACE_LOCK> (mm)
{
if (!pass_end)
- this->reverse_i ();
+ {
+
+#if defined (ACE_HAS_LAZY_MAP_MANAGER)
+
+ // Start here.
+ this->next_ = this->map_man_->occupied_list_.prev ();
+
+ while (1)
+ {
+ // Stop if we reach the end.
+ if (this->done ())
+ break;
+
+ // Break if we find a non-free slot.
+ if (!this->map_man_->search_structure_[this->next_].free_)
+ {
+ break;
+ }
+
+ // Go to the prev item in the list.
+ this->next_ = this->map_man_->search_structure_[this->next_].prev ();
+ }
+
+#else
+
+ this->next_ = this->map_man_->occupied_list_.prev ();
+
+#endif /* ACE_HAS_LAZY_MAP_MANAGER */
+
+}
}
template <class EXT_ID, class INT_ID, class ACE_LOCK> ACE_INLINE int
diff --git a/ace/README b/ace/README
index 19a90b3c44e..7cc4e1fbfd4 100644
--- a/ace/README
+++ b/ace/README
@@ -558,6 +558,9 @@ ACE_HAS_TEMPLATE_TYPEDEFS Compiler implements templates
class.
ACE_HAS_TERM_IOCTLS Platform has terminal ioctl
flags like TCGETS and TCSETS.
+ACE_HAS_LAZY_MAP_MANAGER ACE supports lazy Map Managers
+ that allow deletion of entries
+ during active iteration.
ACE_HAS_THREADS Platform supports threads
ACE_HAS_THREAD_SAFE_ACCEPT Platform allows multiple
threads to call accept() on
diff --git a/tests/Lazy_Map_Manager_Test.cpp b/tests/Lazy_Map_Manager_Test.cpp
new file mode 100644
index 00000000000..7cb94968e0b
--- /dev/null
+++ b/tests/Lazy_Map_Manager_Test.cpp
@@ -0,0 +1,385 @@
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// tests
+//
+// = FILENAME
+// Lazy_Map_Manager_Test.cpp
+//
+// = DESCRIPTION
+// This is a simple test of the <ACE_Map_Manager> and
+// <ACE_Active_Map_Manager> that illustrates how lazy map managers
+// allow the deletion of entries while iterating over the map.
+//
+// = AUTHOR
+// Irfan Pyarali <irfan@cs.wustl.edu>,
+// ============================================================================
+
+#include "test_config.h"
+#include "ace/Map_Manager.h"
+#include "ace/Active_Map_Manager.h"
+#include "ace/Synch.h"
+#include "ace/streams.h"
+
+ACE_RCSID(tests, Map_Manager_Test, "$Id$")
+
+#if defined(__BORLANDC__) && __BORLANDC__ >= 0x0530
+USELIB("..\ace\aced.lib");
+//---------------------------------------------------------------------------
+#endif /* defined(__BORLANDC__) && __BORLANDC__ >= 0x0530 */
+
+// Simple map manager.
+typedef ACE_Map_Manager<int, int, ACE_Null_Mutex> MAP;
+
+//
+// Displaying the contents of a map manager.
+//
+
+void
+display_map (MAP &map)
+{
+ {
+ // Simple iteration printing the entries.
+ for (MAP::iterator iter = map.begin ();
+ iter != map.end ();
+ ++iter)
+ {
+ MAP::ENTRY &entry = *iter;
+ ACE_DEBUG ((LM_DEBUG,
+ ASYS_TEXT ("%d "),
+ entry.int_id_));
+ }
+
+ ACE_DEBUG ((LM_DEBUG, ASYS_TEXT ("\n")));
+ }
+
+ {
+ // Simple reverse iteration printing the entries.
+ for (MAP::reverse_iterator iter = map.rbegin ();
+ iter != map.rend ();
+ ++iter)
+ {
+ MAP::ENTRY &entry = *iter;
+ ACE_DEBUG ((LM_DEBUG,
+ ASYS_TEXT ("%d "),
+ entry.int_id_));
+ }
+
+ ACE_DEBUG ((LM_DEBUG, ASYS_TEXT ("\n")));
+ }
+
+ ACE_DEBUG ((LM_DEBUG, ASYS_TEXT ("\n")));
+}
+
+//
+// Test for map manager.
+//
+
+void
+map_test ()
+{
+ // Map of size 3.
+ MAP map (3);
+ int i = 0;
+
+ // Insert a few entries.
+ for (i = 0; i < 3; ++i)
+ map.bind (i, i);
+
+ display_map (map);
+
+ // Remove middle one.
+ map.unbind (1);
+
+ display_map (map);
+
+ // Remove the entry on one end.
+ map.unbind (0);
+
+ display_map (map);
+
+ // Remove the entry on the other end.
+ map.unbind (2);
+
+ display_map (map);
+
+ // If we have lazy map managers, we can delete entries while
+ // iterating over the map.
+
+#if defined (ACE_HAS_LAZY_MAP_MANAGER)
+
+ // Insert a few entries.
+ for (i = 0; i < 3; ++i)
+ map.bind (i, i);
+
+ display_map (map);
+
+ // Remove middle one.
+ {
+ // Deletion while iterating.
+ for (MAP::iterator iter = map.begin ();
+ iter != map.end ();
+ ++iter)
+ {
+ MAP::ENTRY &entry = *iter;
+ if (entry.int_id_ == 1)
+ {
+ map.unbind (1);
+ }
+ }
+
+ display_map (map);
+ }
+
+ // Remove the entry on one end.
+ {
+ // Deletion while iterating.
+ for (MAP::iterator iter = map.begin ();
+ iter != map.end ();
+ ++iter)
+ {
+ MAP::ENTRY &entry = *iter;
+ if (entry.int_id_ == 0)
+ {
+ map.unbind (0);
+ }
+ }
+
+ display_map (map);
+ }
+
+ // Remove the entry on the other end.
+ {
+ // Deletion while iterating.
+ for (MAP::iterator iter = map.begin ();
+ iter != map.end ();
+ ++iter)
+ {
+ MAP::ENTRY &entry = *iter;
+ if (entry.int_id_ == 2)
+ {
+ map.unbind (2);
+ }
+ }
+
+ display_map (map);
+ }
+
+#endif /* ACE_HAS_LAZY_MAP_MANAGER */
+
+ // Insert a few entries. This will force an increase in map size.
+ for (i = 0; i < 4; ++i)
+ map.bind (i, i);
+
+ display_map (map);
+
+ // Remove a few entries (in reverse order).
+ for (i = 3; i >= 0; --i)
+ map.unbind (i);
+
+ display_map (map);
+}
+
+// Simple active map manager.
+typedef ACE_Active_Map_Manager<int> ACTIVE_MAP;
+
+//
+// Displaying the contents of an active map manager.
+//
+
+void
+display_map (ACTIVE_MAP &map)
+{
+ {
+ // Simple iteration printing the entries.
+ for (ACTIVE_MAP::iterator iter = map.begin ();
+ iter != map.end ();
+ ++iter)
+ {
+ ACTIVE_MAP::ENTRY &entry = *iter;
+ ACE_DEBUG ((LM_DEBUG,
+ ASYS_TEXT ("%d "),
+ entry.int_id_));
+ }
+
+ ACE_DEBUG ((LM_DEBUG, ASYS_TEXT ("\n")));
+ }
+
+ {
+ // Simple reverse iteration printing the entries.
+ for (ACTIVE_MAP::reverse_iterator iter = map.rbegin ();
+ iter != map.rend ();
+ ++iter)
+ {
+ ACTIVE_MAP::ENTRY &entry = *iter;
+ ACE_DEBUG ((LM_DEBUG,
+ ASYS_TEXT ("%d "),
+ entry.int_id_));
+ }
+
+ ACE_DEBUG ((LM_DEBUG, ASYS_TEXT ("\n")));
+ }
+
+ ACE_DEBUG ((LM_DEBUG, ASYS_TEXT ("\n")));
+}
+
+//
+// Test for active map manager.
+//
+
+void
+active_map_test ()
+{
+ // Map of size 3.
+ ACTIVE_MAP map (3);
+ ACE_Active_Map_Manager_Key keys[4];
+ int i = 0;
+
+ // Insert a few entries.
+ for (i = 0; i < 3; ++i)
+ map.bind (i, keys[i]);
+
+ display_map (map);
+
+ // Remove middle one.
+ map.unbind (keys[1]);
+
+ display_map (map);
+
+ // Remove the entry on one end.
+ map.unbind (keys[0]);
+
+ display_map (map);
+
+ // Remove the entry on the other end.
+ map.unbind (keys[2]);
+
+ display_map (map);
+
+ // If we have lazy map managers, we can delete entries while
+ // iterating over the map.
+
+#if defined (ACE_HAS_LAZY_MAP_MANAGER)
+
+ // Insert a few entries.
+ for (i = 0; i < 3; ++i)
+ map.bind (i, keys[i]);
+
+ display_map (map);
+
+ // Remove middle one.
+ {
+ // Deletion while iterating.
+ for (ACTIVE_MAP::iterator iter = map.begin ();
+ iter != map.end ();
+ ++iter)
+ {
+ ACTIVE_MAP::ENTRY &entry = *iter;
+ if (entry.int_id_ == 1)
+ {
+ map.unbind (keys[1]);
+ }
+ }
+
+ display_map (map);
+ }
+
+ // Remove the entry on one end.
+ {
+ // Deletion while iterating.
+ for (ACTIVE_MAP::iterator iter = map.begin ();
+ iter != map.end ();
+ ++iter)
+ {
+ ACTIVE_MAP::ENTRY &entry = *iter;
+ if (entry.int_id_ == 0)
+ {
+ map.unbind (keys[0]);
+ }
+ }
+
+ display_map (map);
+ }
+
+ // Remove the entry on the other end.
+ {
+ // Deletion while iterating.
+ for (ACTIVE_MAP::iterator iter = map.begin ();
+ iter != map.end ();
+ ++iter)
+ {
+ ACTIVE_MAP::ENTRY &entry = *iter;
+ if (entry.int_id_ == 2)
+ {
+ map.unbind (keys[2]);
+ }
+ }
+
+ display_map (map);
+ }
+
+#endif /* ACE_HAS_LAZY_MAP_MANAGER */
+
+ // Insert a few entries. This will force an increase in map size.
+ for (i = 0; i < 4; ++i)
+ map.bind (i, keys[i]);
+
+ display_map (map);
+
+ // Remove a few entries (in reverse order).
+ for (i = 3; i >= 0; --i)
+ map.unbind (keys[i]);
+
+ display_map (map);
+}
+
+int
+main (int argc, ASYS_TCHAR *argv[])
+{
+ ACE_START_TEST (ASYS_TEXT ("Lazy_Map_Manager_Test"));
+ ACE_LOG_MSG->clr_flags (ACE_Log_Msg::VERBOSE_LITE);
+
+ ACE_DEBUG ((LM_DEBUG, ASYS_TEXT ("\nMap Manager...\n\n")));
+ map_test ();
+
+ ACE_DEBUG ((LM_DEBUG, ASYS_TEXT ("\nActive Map Manager...\n\n")));
+ active_map_test ();
+
+ ACE_LOG_MSG->set_flags (ACE_Log_Msg::VERBOSE_LITE);
+ ACE_END_TEST;
+ return 0;
+}
+
+#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
+
+template class ACE_Map_Manager<int, int, ACE_Null_Mutex>;
+template class ACE_Map_Iterator_Base<int, int, ACE_Null_Mutex>;
+template class ACE_Map_Iterator<int, int, ACE_Null_Mutex>;
+template class ACE_Map_Reverse_Iterator<int, int, ACE_Null_Mutex>;
+template class ACE_Map_Entry<int, int>;
+
+template class ACE_Active_Map_Manager<int>;
+template class ACE_Map_Manager<ACE_Active_Map_Manager_Key, int, ACE_Null_Mutex>;
+template class ACE_Map_Iterator_Base<ACE_Active_Map_Manager_Key, int, ACE_Null_Mutex>;
+template class ACE_Map_Iterator<ACE_Active_Map_Manager_Key, int, ACE_Null_Mutex>;
+template class ACE_Map_Reverse_Iterator<ACE_Active_Map_Manager_Key, int, ACE_Null_Mutex>;
+template class ACE_Map_Entry<ACE_Active_Map_Manager_Key, int>;
+
+#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
+
+#pragma instantiate ACE_Map_Manager<int, int, ACE_Null_Mutex>
+#pragma instantiate ACE_Map_Iterator_Base<int, int, ACE_Null_Mutex>
+#pragma instantiate ACE_Map_Iterator<int, int, ACE_Null_Mutex>
+#pragma instantiate ACE_Map_Reverse_Iterator<int, int, ACE_Null_Mutex>
+#pragma instantiate ACE_Map_Entry<int, int>
+
+#pragma instantiate ACE_Active_Map_Manager<int>
+#pragma instantiate ACE_Map_Manager<ACE_Active_Map_Manager_Key, int, ACE_Null_Mutex>
+#pragma instantiate ACE_Map_Iterator_Base<ACE_Active_Map_Manager_Key, int, ACE_Null_Mutex>
+#pragma instantiate ACE_Map_Iterator<ACE_Active_Map_Manager_Key, int, ACE_Null_Mutex>
+#pragma instantiate ACE_Map_Reverse_Iterator<ACE_Active_Map_Manager_Key, int, ACE_Null_Mutex>
+#pragma instantiate ACE_Map_Entry<ACE_Active_Map_Manager_Key, int>
+
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
diff --git a/tests/Lazy_Map_Manager_Test.dsp b/tests/Lazy_Map_Manager_Test.dsp
new file mode 100644
index 00000000000..430d11aae72
--- /dev/null
+++ b/tests/Lazy_Map_Manager_Test.dsp
@@ -0,0 +1,194 @@
+# Microsoft Developer Studio Project File - Name="Lazy_Map_Manager_Test" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+# TARGTYPE "Win32 (ALPHA) Console Application" 0x0603
+
+CFG=Lazy_Map_Manager_Test - Win32 PharLap ETS Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "Lazy_Map_Manager_Test.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "Lazy_Map_Manager_Test.mak" CFG="Lazy_Map_Manager_Test - Win32 PharLap ETS Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "Lazy_Map_Manager_Test - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE "Lazy_Map_Manager_Test - Win32 Alpha Debug" (based on "Win32 (ALPHA) Console Application")
+!MESSAGE "Lazy_Map_Manager_Test - Win32 PharLap ETS Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+
+!IF "$(CFG)" == "Lazy_Map_Manager_Test - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Atomic_O"
+# PROP BASE Intermediate_Dir "Atomic_O"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "."
+# PROP Intermediate_Dir ".\DLL\Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+CPP=cl.exe
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\\" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /FD /c
+# SUBTRACT CPP /YX
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 aced.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\ace"
+
+!ELSEIF "$(CFG)" == "Lazy_Map_Manager_Test - Win32 Alpha Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Atomic_O"
+# PROP BASE Intermediate_Dir "Atomic_O"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ""
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+CPP=cl.exe
+# ADD BASE CPP /nologo /Gt0 /W3 /GX /Zi /Od /I"..\\" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /FD /MTd /c
+# ADD CPP /nologo /Gt0 /W3 /GX /Zi /Od /I"..\\" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /FD /MDd /c
+# SUBTRACT CPP /YX
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 aced.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /debug /machine:ALPHA /pdbtype:sept /libpath:"..\ace"
+# ADD LINK32 aced.lib /nologo /subsystem:console /debug /machine:ALPHA /pdbtype:sept /libpath:"..\ace"
+
+!ELSEIF "$(CFG)" == "Lazy_Map_Manager_Test - Win32 PharLap ETS Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Atomic_O"
+# PROP BASE Intermediate_Dir "Atomic_O"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "."
+# PROP Intermediate_Dir ".\ETS_LIB\Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+CPP=cl.exe
+# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\\" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /FD /c
+# SUBTRACT BASE CPP /YX
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\\" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /FD /c
+# SUBTRACT CPP /YX
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 aced.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\ace"
+# ADD LINK32 aced.lib /nologo /subsystem:console /debug /machine:I386 /out:"Lazy_Map_Manager_Test_ETS.exe" /pdbtype:sept /libpath:"..\ace" /ETS:tests_pharlap_msvc.lnk
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "Lazy_Map_Manager_Test - Win32 Debug"
+# Name "Lazy_Map_Manager_Test - Win32 Alpha Debug"
+# Name "Lazy_Map_Manager_Test - Win32 PharLap ETS Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter ".cpp"
+# Begin Source File
+
+SOURCE=.\Lazy_Map_Manager_Test.cpp
+
+!IF "$(CFG)" == "Lazy_Map_Manager_Test - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "Lazy_Map_Manager_Test - Win32 Alpha Debug"
+
+DEP_CPP_Lazy=\
+ "..\ace\ACE.h"\
+ "..\ace\ACE.i"\
+ "..\ace\Atomic_Op.i"\
+ "..\ace\Auto_Ptr.cpp"\
+ "..\ace\Auto_Ptr.h"\
+ "..\ace\Auto_Ptr.i"\
+ "..\ace\config-win32-common.h"\
+ "..\ace\config-win32.h"\
+ "..\ace\config.h"\
+ "..\ace\Event_Handler.h"\
+ "..\ace\Event_Handler.i"\
+ "..\ace\Log_Msg.h"\
+ "..\ace\Log_Priority.h"\
+ "..\ace\Log_Record.h"\
+ "..\ace\Log_Record.i"\
+ "..\ace\Managed_Object.cpp"\
+ "..\ace\Managed_Object.h"\
+ "..\ace\Managed_Object.i"\
+ "..\ace\Object_Manager.h"\
+ "..\ace\Object_Manager.i"\
+ "..\ace\OS.h"\
+ "..\ace\OS.i"\
+ "..\ace\SString.h"\
+ "..\ace\SString.i"\
+ "..\ace\SV_Semaphore_Complex.h"\
+ "..\ace\SV_Semaphore_Complex.i"\
+ "..\ace\SV_Semaphore_Simple.h"\
+ "..\ace\SV_Semaphore_Simple.i"\
+ "..\ace\Synch.h"\
+ "..\ace\Synch.i"\
+ "..\ace\Synch_T.cpp"\
+ "..\ace\Synch_T.h"\
+ "..\ace\Synch_T.i"\
+ "..\ace\Thread.h"\
+ "..\ace\Thread.i"\
+ "..\ace\Trace.h"\
+ "..\ace\Version.h"\
+ "..\ace\ws2tcpip.h"\
+ ".\test_config.h"\
+
+NODEP_CPP_Lazy=\
+ "..\ace\stdcpp.h"\
+
+
+!ELSEIF "$(CFG)" == "Lazy_Map_Manager_Test - Win32 PharLap ETS Debug"
+
+!ENDIF
+
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter ".h"
+# Begin Source File
+
+SOURCE=.\test_config.h
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/tests/Makefile b/tests/Makefile
index 04322352d96..aa9c5a7139d 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -33,6 +33,7 @@ BIN = Aio_Platform_Test \
Hash_Map_Manager_Test \
Hash_Map_Bucket_Iterator_Test \
IOStream_Test \
+ Lazy_Map_Manager_Test \
Log_Msg_Test \
Malloc_Test \
Map_Test \
diff --git a/tests/run_pharlap_tests.bat b/tests/run_pharlap_tests.bat
index 88e6ee8b575..910f2a678f5 100755
--- a/tests/run_pharlap_tests.bat
+++ b/tests/run_pharlap_tests.bat
@@ -31,6 +31,7 @@ call %0 Env_Value_Test
call %0 Future_Test
call %0 Handle_Set_Test
call %0 Hash_Map_Manager_Test
+call %0 Lazy_Map_Manager_Test
call %0 Hash_Map_Bucket_Iterator_Test
call %0 High_Res_Timer_Test
call %0 IOStream_Test
diff --git a/tests/run_tests.bat b/tests/run_tests.bat
index e3bbaf467a4..5abad7cbaa4 100644
--- a/tests/run_tests.bat
+++ b/tests/run_tests.bat
@@ -82,6 +82,7 @@ call %run_cmd% %dopure% %platform% Hash_Map_Bucket_Iterator_Test
call %run_cmd% %dopure% %platform% High_Res_Timer_Test
call %run_cmd% %dopure% %platform% IOStream_Test
call %run_cmd% %dopure% %platform% Map_Manager_Test
+call %run_cmd% %dopure% %platform% Lazy_Map_Manager_Test
call %run_cmd% %dopure% %platform% Cache_Map_Manager_Test
call %run_cmd% %dopure% %platform% Cached_Conn_Test
call %run_cmd% %dopure% %platform% Cached_Accept_Conn_Test
diff --git a/tests/run_tests.lst b/tests/run_tests.lst
index 11c5de2b66a..372f984580b 100644
--- a/tests/run_tests.lst
+++ b/tests/run_tests.lst
@@ -59,6 +59,7 @@ Cached_Conn_Test
Cached_Accept_Conn_Test
Map_Manager_Test
Hash_Map_Manager_Test
+Lazy_Map_Manager_Test
Hash_Map_Bucket_Iterator_Test
Map_Test
Message_Queue_Notifications_Test
diff --git a/tests/run_tests.psosim b/tests/run_tests.psosim
index dd274a9e239..26b4cb5870d 100755
--- a/tests/run_tests.psosim
+++ b/tests/run_tests.psosim
@@ -142,6 +142,8 @@ run Map_Manager_Test # uses Map Manager and Hash Map Manager
run Hash_Map_Manager_Test # uses Hash Map Manager + Forward and Reverse Map Iterators.
+run Lazy_Map_Manager_Test # uses Lazy Map Manager + Forward and Reverse Map Iterators.
+
run Hash_Map_Bucket_Iterator_Test # uses Hash Map Bucket iterator.
run Cache_Map_Manager_Test # uses Cache Map Manager and Hash Cache Map Manager + Forward and Reverse Map Iterators.
diff --git a/tests/tests.dsw b/tests/tests.dsw
index 30c4eea17e8..41b38acf169 100644
--- a/tests/tests.dsw
+++ b/tests/tests.dsw
@@ -99,6 +99,18 @@ Package=<4>
###############################################################################
+Project: "Lazy_Map_Manager_Test"=.\Lazy_Map_Manager_Test.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
Project: "Cached_Conn_Test"=.\Cached_Conn_Test.dsp - Package Owner=<4>
Package=<5>
diff --git a/tests/version_tests/Lazy_Map_Manager_Test.dsp b/tests/version_tests/Lazy_Map_Manager_Test.dsp
new file mode 100644
index 00000000000..1cd0f007127
--- /dev/null
+++ b/tests/version_tests/Lazy_Map_Manager_Test.dsp
@@ -0,0 +1,274 @@
+# Microsoft Developer Studio Project File - Name="Lazy_Map_Manager_Test" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=Lazy_Map_Manager_Test - Win32 DLL Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "Lazy_Map_Manager_Test.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "Lazy_Map_Manager_Test.mak" CFG="Lazy_Map_Manager_Test - Win32 DLL Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "Lazy_Map_Manager_Test - Win32 DLL Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE "Lazy_Map_Manager_Test - Win32 DLL Unicode Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE "Lazy_Map_Manager_Test - Win32 static Unicode Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE "Lazy_Map_Manager_Test - Win32 static Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE "Lazy_Map_Manager_Test - Win32 DLL Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "Lazy_Map_Manager_Test - Win32 DLL Unicode Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "Lazy_Map_Manager_Test - Win32 static Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "Lazy_Map_Manager_Test - Win32 static Unicode Release" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "Lazy_Map_Manager_Test - Win32 DLL Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir ".\Lazy_Map_Manager_Test\DLL Debug"
+# PROP BASE Intermediate_Dir ".\Lazy_Map_Manager_Test\DLL Debug"
+# PROP BASE Target_Dir ".\Lazy_Map_Manager_Test"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ".\DLL Debug"
+# PROP Intermediate_Dir ".\DLL Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ".\Lazy_Map_Manager_Test"
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\\" /D "_DEBUG" /D ACE_HAS_DLL=1 /D "WIN32" /D "_CONSOLE" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386
+# ADD LINK32 aced.lib /nologo /subsystem:console /debug /machine:I386 /libpath:"..\..\ace"
+
+!ELSEIF "$(CFG)" == "Lazy_Map_Manager_Test - Win32 DLL Unicode Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir ".\Lazy_Map_Manager_Test\DLL Unicode Debug"
+# PROP BASE Intermediate_Dir ".\Lazy_Map_Manager_Test\DLL Unicode Debug"
+# PROP BASE Target_Dir ".\Lazy_Map_Manager_Test"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ".\DLL Unicode Debug"
+# PROP Intermediate_Dir ".\DLL Unicode Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ".\Lazy_Map_Manager_Test"
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\\" /D "_DEBUG" /D ACE_HAS_DLL=1 /D "UNICODE" /D "WIN32" /D "_CONSOLE" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386
+# ADD LINK32 aceud.lib /nologo /subsystem:console /debug /machine:I386 /libpath:"..\..\ace"
+
+!ELSEIF "$(CFG)" == "Lazy_Map_Manager_Test - Win32 static Unicode Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir ".\Lazy_Map_Manager_Test\static Unicode Debug"
+# PROP BASE Intermediate_Dir ".\Lazy_Map_Manager_Test\static Unicode Debug"
+# PROP BASE Target_Dir ".\Lazy_Map_Manager_Test"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ".\static Unicode Debug"
+# PROP Intermediate_Dir ".\static Unicode Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ".\Lazy_Map_Manager_Test"
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\\" /D "_DEBUG" /D ACE_HAS_DLL=0 /D ACE_NO_INLINE /D "UNICODE" /D "WIN32" /D "_CONSOLE" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386
+# ADD LINK32 acesud.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /libpath:"..\..\ace"
+
+!ELSEIF "$(CFG)" == "Lazy_Map_Manager_Test - Win32 static Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir ".\Lazy_Map_Manager_Test\static Debug"
+# PROP BASE Intermediate_Dir ".\Lazy_Map_Manager_Test\static Debug"
+# PROP BASE Target_Dir ".\Lazy_Map_Manager_Test"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ".\static Debug"
+# PROP Intermediate_Dir ".\static Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ".\Lazy_Map_Manager_Test"
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\\" /D "_DEBUG" /D ACE_HAS_DLL=0 /D ACE_NO_INLINE /D "WIN32" /D "_CONSOLE" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386
+# ADD LINK32 acesd.lib advapi32.lib user32.lib /nologo /subsystem:console /debug /machine:I386 /libpath:"..\..\ace"
+
+!ELSEIF "$(CFG)" == "Lazy_Map_Manager_Test - Win32 DLL Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir ".\Lazy_Map_Manager_Test\DLL Release"
+# PROP BASE Intermediate_Dir ".\Lazy_Map_Manager_Test\DLL Release"
+# PROP BASE Target_Dir ".\Lazy_Map_Manager_Test"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir ".\DLL Release"
+# PROP Intermediate_Dir ".\DLL Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ".\Lazy_Map_Manager_Test"
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\\" /D "NDEBUG" /D ACE_HAS_DLL=1 /D "WIN32" /D "_CONSOLE" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ace.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\ace"
+
+!ELSEIF "$(CFG)" == "Lazy_Map_Manager_Test - Win32 DLL Unicode Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir ".\Lazy_Map_Manager_Test\DLL Unicode Release"
+# PROP BASE Intermediate_Dir ".\Lazy_Map_Manager_Test\DLL Unicode Release"
+# PROP BASE Target_Dir ".\Lazy_Map_Manager_Test"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir ".\DLL Unicode Release"
+# PROP Intermediate_Dir ".\DLL Unicode Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ".\Lazy_Map_Manager_Test"
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\\" /D "NDEBUG" /D ACE_HAS_DLL=1 /D "UNICODE" /D "WIN32" /D "_CONSOLE" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 aceu.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\ace"
+
+!ELSEIF "$(CFG)" == "Lazy_Map_Manager_Test - Win32 static Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir ".\Lazy_Map_Manager_Test\static Release"
+# PROP BASE Intermediate_Dir ".\Lazy_Map_Manager_Test\static Release"
+# PROP BASE Target_Dir ".\Lazy_Map_Manager_Test"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir ".\static Release"
+# PROP Intermediate_Dir ".\static Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ".\Lazy_Map_Manager_Test"
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\\" /D "NDEBUG" /D ACE_HAS_DLL=0 /D ACE_NO_INLINE /D "WIN32" /D "_CONSOLE" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 aces.lib advapi32.lib user32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\ace"
+
+!ELSEIF "$(CFG)" == "Lazy_Map_Manager_Test - Win32 static Unicode Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir ".\Lazy_Map_Manager_Test\static Unicode Release"
+# PROP BASE Intermediate_Dir ".\Lazy_Map_Manager_Test\static Unicode Release"
+# PROP BASE Target_Dir ".\Lazy_Map_Manager_Test"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir ".\static Unicode Release"
+# PROP Intermediate_Dir ".\static Unicode Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ".\Lazy_Map_Manager_Test"
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\\" /D "NDEBUG" /D ACE_HAS_DLL=0 /D ACE_NO_INLINE /D "UNICODE" /D "WIN32" /D "_CONSOLE" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 acesu.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\ace"
+
+!ENDIF
+
+# Begin Target
+
+# Name "Lazy_Map_Manager_Test - Win32 DLL Debug"
+# Name "Lazy_Map_Manager_Test - Win32 DLL Unicode Debug"
+# Name "Lazy_Map_Manager_Test - Win32 static Unicode Debug"
+# Name "Lazy_Map_Manager_Test - Win32 static Debug"
+# Name "Lazy_Map_Manager_Test - Win32 DLL Release"
+# Name "Lazy_Map_Manager_Test - Win32 DLL Unicode Release"
+# Name "Lazy_Map_Manager_Test - Win32 static Release"
+# Name "Lazy_Map_Manager_Test - Win32 static Unicode Release"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90"
+# Begin Source File
+
+SOURCE=..\Lazy_Map_Manager_Test.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd"
+# Begin Source File
+
+SOURCE=..\Lazy_Map_Manager_Test.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\test_config.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/tests/version_tests/version_tests.dsw b/tests/version_tests/version_tests.dsw
index 494d4377e17..56889916585 100644
--- a/tests/version_tests/version_tests.dsw
+++ b/tests/version_tests/version_tests.dsw
@@ -267,6 +267,18 @@ Package=<4>
###############################################################################
+Project: "Lazy_Map_Manager_Test"=.\Lazy_Map_Manager_Test.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
Project: "High_Res_Timer_Test"=.\High_Res_Timer_Test.dsp - Package Owner=<4>
Package=<5>