summaryrefslogtreecommitdiff
path: root/examples/Shared_Malloc/test_multiple_mallocs.cpp
blob: 568d72f39f764dde20fc8be3df581610ab0c3bf8 (plain)
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
// $Id$

// Test the capability of <ACE_Malloc> to handle multiple mallocs
// rooted at different base addresses.

#include "ace/Malloc.h"
#include "ace/Synch.h"

ACE_RCSID(Shared_Malloc, test_multiple_mallocs, "$Id$")

typedef ACE_Malloc <ACE_MMAP_MEMORY_POOL, ACE_Process_Mutex> MALLOC; 

// Default address for shared memory mapped files and SYSV shared
// memory (defaults to 64 M).
static void *request_base_addr = ((void *) (64 * 1024 * 1024));
static const char *request_string = "hello from request repository";

// Default address for shared memory mapped files and SYSV shared
// memory (defaults to 64 M).
static void *response_base_addr = ((void *) (128 * 1024 * 1024));
static const char *response_string = "hello from response repository";

int 
main (int, char *[])
{
  ACE_MMAP_Memory_Pool_Options request_options (request_base_addr);

  // Create an adapter version of an allocator.
  ACE_Allocator_Adapter<MALLOC> *shmem_request;

  ACE_NEW_RETURN (shmem_request,
                  ACE_Allocator_Adapter<MALLOC> ("request_file",
                                                 "RequestLock",
                                                 &request_options),
                  1);

  ACE_MMAP_Memory_Pool_Options response_options (response_base_addr);

  // Create a non-adapter version of an allocator.
  MALLOC *shmem_response;
  ACE_NEW_RETURN (shmem_response,
                  MALLOC ("response_file",
                          "ResponseLock",
                          &response_options),
                  1);
  void *data = 0; 

  // If we find "foo" then we're running the "second" time, so we must
  // release the resources.
  if (shmem_request->find ("foo",
                           data) == 0)
    {
      ACE_DEBUG ((LM_DEBUG, 
                  "%s\n",
                  data));
      shmem_request->remove ();
    }

  // This is the first time in, so we allocate the memory and bind it
  // to the name "foo".
  else
    {
      ACE_ALLOCATOR_RETURN (data,
                            shmem_request->malloc (ACE_OS::strlen (request_string) + 1),
                            1);
      ACE_OS::strcpy ((char *) data,
                      request_string);

      if (shmem_request->bind ("foo",
                               data) == -1)
        ACE_ERROR_RETURN ((LM_ERROR,
                           "%p\n",
                           "bind"),
                          1);
    }
  data = 0;

  // If we find "foo" then we're running the "second" time, so we must
  // release the resources.
  if (shmem_response->find ("foo",
                            data) == 0)
    {
      ACE_DEBUG ((LM_DEBUG,
                  "%s\n",
                  data));
      shmem_response->remove ();
      ACE_DEBUG ((LM_DEBUG,
                  "all resources have been released\n"));
    }

  // This is the first time in, so we allocate the memory and bind it
  // to the name "foo".
  else
    {
      ACE_ALLOCATOR_RETURN (data,
                            shmem_response->malloc (ACE_OS::strlen (response_string) + 1),
                            1);
      ACE_OS::strcpy ((char *) data,
                      response_string);

      if (shmem_response->bind ("foo",
                                data) == -1)
        ACE_ERROR_RETURN ((LM_ERROR,
                           "%p\n",
                           "bind"),
                          1);

      ACE_DEBUG ((LM_DEBUG,
                  "Run again to see results and release resources.\n"));
    }

  return 0;
}