summaryrefslogtreecommitdiff
path: root/ACE/examples/APG/Shared_Memory/PI_Malloc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/examples/APG/Shared_Memory/PI_Malloc.cpp')
-rw-r--r--ACE/examples/APG/Shared_Memory/PI_Malloc.cpp140
1 files changed, 140 insertions, 0 deletions
diff --git a/ACE/examples/APG/Shared_Memory/PI_Malloc.cpp b/ACE/examples/APG/Shared_Memory/PI_Malloc.cpp
new file mode 100644
index 00000000000..04b39a3fcf3
--- /dev/null
+++ b/ACE/examples/APG/Shared_Memory/PI_Malloc.cpp
@@ -0,0 +1,140 @@
+// $Id$
+
+#include "ace/OS_NS_stdio.h"
+#include "ace/OS_NS_string.h"
+
+// Listing 1 code/ch17
+#include "ace/MMAP_Memory_Pool.h"
+#include "ace/Malloc_T.h"
+#include "ace/Null_Mutex.h"
+#include "ace/PI_Malloc.h"
+
+typedef ACE_Malloc_T <ACE_MMAP_MEMORY_POOL,
+ ACE_Null_Mutex,
+ ACE_PI_Control_Block>
+ ALLOCATOR;
+typedef ACE_Malloc_LIFO_Iterator_T<ACE_MMAP_MEMORY_POOL,
+ ACE_Null_Mutex,
+ ACE_PI_Control_Block>
+ MALLOC_LIFO_ITERATOR;
+
+ALLOCATOR *g_allocator;
+// Listing 1
+// Listing 2 code/ch17
+class Record
+{
+public:
+ Record (int id1, int id2, char *name)
+ : id1_(id1), id2_(id2)
+ {
+ size_t len = ACE_OS::strlen (name) + 1;
+ char *buf =
+ reinterpret_cast<char *> (g_allocator->malloc (len));
+ ACE_OS::strcpy (buf, name);
+ name_ = buf;
+ }
+
+ ~Record() { g_allocator->free (name_.addr ()); }
+
+ char *name (void) { return name_; }
+ int id1 (void) { return id1_; }
+ int id2 (void) { return id2_; }
+
+private:
+ int id1_;
+ int id2_;
+ ACE_Based_Pointer_Basic<char> name_;
+};
+// Listing 2
+
+void showRecords (void)
+{
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("The following records were found:\n")));
+
+ {
+ MALLOC_LIFO_ITERATOR iter (*g_allocator);
+
+ for (void *temp = 0; iter.next (temp) != 0; iter.advance ())
+ {
+ Record *record =
+ reinterpret_cast<Record *> (temp);
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("Record name: %C|id1:%d|id2:%d\n"),
+ record->name(), record->id1(), record->id2()));
+ }
+ }
+}
+
+int addRecords (void)
+{
+ char buf[32];
+
+ for (int i = 0; i < 10; i++)
+ {
+ ACE_OS::sprintf (buf, "%s:%d", "Record", i);
+
+ void *memory = g_allocator->malloc (sizeof (Record));
+ if (memory == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("Unable to malloc")),
+ -1);
+
+ // Allocate and place record
+ Record* newRecord = new (memory) Record (i, i+1, buf);
+ if (g_allocator->bind (buf, newRecord) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("bind failed")),
+ -1);
+ }
+
+ return 0;
+}
+
+// Listing 3 code/ch17
+// Backing file where the data is kept.
+#define BACKING_STORE ACE_TEXT("backing2.store")
+
+int ACE_TMAIN (int argc, ACE_TCHAR *[])
+{
+ if (argc > 1)
+ {
+ ACE_MMAP_Memory_Pool_Options options
+ (ACE_DEFAULT_BASE_ADDR,
+ ACE_MMAP_Memory_Pool_Options::ALWAYS_FIXED);
+ ACE_NEW_RETURN (g_allocator,
+ ALLOCATOR (BACKING_STORE,
+ BACKING_STORE,
+ &options),
+ -1);
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("Mapped to base address %@\n"),
+ g_allocator->base_addr ()));
+
+ showRecords ();
+ }
+ else
+ {
+ ACE_MMAP_Memory_Pool_Options options
+ (0, ACE_MMAP_Memory_Pool_Options::NEVER_FIXED);
+ ACE_NEW_RETURN (g_allocator,
+ ALLOCATOR (BACKING_STORE,
+ BACKING_STORE,
+ &options),
+ -1);
+
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("Mapped to base address %@\n"),
+ g_allocator->base_addr ()));
+
+ addRecords();
+ }
+
+ g_allocator->sync ();
+ delete g_allocator;
+ return 0;
+}
+// Listing 3
+