summaryrefslogtreecommitdiff
path: root/examples/APG/Containers/Allocator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/APG/Containers/Allocator.cpp')
-rw-r--r--examples/APG/Containers/Allocator.cpp108
1 files changed, 108 insertions, 0 deletions
diff --git a/examples/APG/Containers/Allocator.cpp b/examples/APG/Containers/Allocator.cpp
new file mode 100644
index 00000000000..9f9fe92d2cc
--- /dev/null
+++ b/examples/APG/Containers/Allocator.cpp
@@ -0,0 +1,108 @@
+// $Id$
+
+#include "ace/Containers.h"
+#include "ace/Malloc_T.h"
+#include "ace/Synch.h" // Needed for the lock.
+#include "DataElement.h"
+
+class StackExample
+{
+public:
+ // Illustrate all the differnet
+ // types of stacks provided by ACE.
+ int run (void);
+
+private:
+ // Illustrate the use of an unbounded stack.
+ int runUnboundedStack (ACE_Allocator* allocator);
+};
+
+// Listing 1 code/ch05
+int StackExample::run (void)
+{
+ ACE_TRACE (ACE_TEXT ("StackUser::run"));
+
+ ACE_Allocator *allocator = 0;
+ size_t block_size = sizeof(ACE_Node<DataElement>);
+ ACE_NEW_RETURN
+ (allocator,
+ ACE_Dynamic_Cached_Allocator<ACE_Null_Mutex>
+ (100 + 1, block_size),
+ -1);
+
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\n# of live objects %d\n"),
+ DataElement::numOfActiveObjects ()));
+
+ ACE_ASSERT (this->runUnboundedStack (allocator) != -1);
+
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\n# of live objects %d\n"),
+ DataElement::numOfActiveObjects ()));
+
+ delete allocator;
+ return 0;
+}
+// Listing 1
+// Listing 2 code/ch05
+int StackExample::runUnboundedStack (ACE_Allocator* allocator)
+{
+ ACE_TRACE (ACE_TEXT ("StackExample::runUnboundedStack"));
+
+ // Pass in an allocator during construction.
+ ACE_Unbounded_Stack<DataElement> ustack (allocator);
+
+ for (int m = 0; m < 100; m++)
+ {
+ DataElement elem (m);
+ int result = ustack.push (elem);
+ if (result == -1)
+ ACE_ERROR_RETURN
+ ((LM_ERROR, ACE_TEXT ("%p\n"),
+ ACE_TEXT ("Push Next Element")),
+ -1);
+ }
+
+ void* furtherMemory = 0;
+ furtherMemory = allocator->malloc
+ (sizeof(ACE_Node<DataElement>));
+ ACE_ASSERT (furtherMemory == 0);
+
+ // No memory left..
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("%p\n"),
+ ACE_TEXT ("No memory..")));
+
+ // Free up some memory in the allocator.
+ DataElement e;
+ for (int n = 0; n < 10; n++)
+ {
+ ustack.pop (e);
+ }
+
+ furtherMemory =
+ allocator->malloc (sizeof (ACE_Node<DataElement>));
+ ACE_ASSERT (furtherMemory != 0);
+
+ return 0;
+}
+// Listing 2
+
+int ACE_TMAIN (int, ACE_TCHAR *[])
+{
+ StackExample se;
+ return se.run ();
+}
+
+#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
+template class ACE_Dynamic_Cached_Allocator<ACE_Null_Mutex>;
+template class ACE_Unbounded_Stack<DataElement>;
+template class ACE_Node<DataElement>;
+template class ACE_Cached_Mem_Pool_Node<char>;
+template class ACE_Free_List<ACE_Cached_Mem_Pool_Node<char> >;
+template class ACE_Locked_Free_List<ACE_Cached_Mem_Pool_Node<char>,ACE_Null_Mutex>;
+#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
+#pragma instantiate ACE_Dynamic_Cached_Allocator<ACE_Null_Mutex>
+#pragma instantiate ACE_Unbounded_Stack<DataElement>
+#pragma instantiate ACE_Node<DataElement>
+#pragma instantiate ACE_Cached_Mem_Pool_Node<char>
+#pragma instantiate ACE_Free_List<ACE_Cached_Mem_Pool_Node<char> >
+#pragma instantiate ACE_Locked_Free_List<ACE_Cached_Mem_Pool_Node<char>,ACE_Null_Mutex>
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION*/