1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
// $Id: PI_Malloc.cpp 80826 2008-03-04 14:51:23Z wotte $
#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
|