summaryrefslogtreecommitdiff
path: root/docs/tutorials/Chap_3/mm.cpp
blob: 43188360f665a9d86e68fe1b839b69f890c12ef7 (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$

#include "ace/Memory_Pool.h"
#include "ace/Shared_Memory_MM.h"
#include "ace/Malloc.h"
#include "ace/Malloc_T.h"
#include "ace/Thread_Manager.h"

#define DATA_SIZE 100
#define MESSAGE1 "Hiya over there client process"
#define MESSAGE2  "Did you hear me the first time?"
const ACE_TCHAR *poolname="My_Pool";

typedef ACE_Malloc<ACE_MMAP_MEMORY_POOL, ACE_Null_Mutex> Malloc_Allocator;

static void *
server (void * = 0)
{
  ACE_MMAP_Memory_Pool_Options opt;

  //Create the memory allocator passing it the shared memory
  //pool that you want to use
  Malloc_Allocator shm_allocator(poolname,poolname,&opt);

  //Create a message, allocate memory for it and bind it with
  //a name so that the client can the find it in the memory
  //pool
  char* Message1=(char*)shm_allocator.malloc(strlen(MESSAGE1)+1);

  ACE_OS::strcpy(Message1,MESSAGE1);
  shm_allocator.bind("FirstMessage",Message1);
  ACE_DEBUG((LM_DEBUG,"<<%s\n",Message1));

  //How about a second message
  char* Message2=(char*)shm_allocator.malloc(strlen(MESSAGE2)+1);
  ACE_OS::strcpy(Message2,MESSAGE2);
  shm_allocator.bind("SecondMessage",Message2);
  ACE_DEBUG((LM_DEBUG,"<<%s\n",Message2));

  //Set the Server to go to sleep for a while so that the client has
  //a chance to do its stuff
  ACE_DEBUG((LM_DEBUG, "Server done writing.. going to sleep zzz..\n\n\n"));
  ACE_OS::sleep(10); 

  ACE_DEBUG ((LM_DEBUG, "server exit\n"));

  return 0;
}

static void *
client (void * = 0)
{
  ACE_MMAP_Memory_Pool_Options opt;

  //Create the memory allocator passing it the shared memory
  //pool that you want to use
  Malloc_Allocator shm_allocator(poolname,poolname,&opt);

  //Lets get that first message.  Notice that the find is looking up the
  //memory based on the "name" that was bound to it by the server.
  void *Message1 = 0;
  if(shm_allocator.find("FirstMessage") == -1 )
    {
      ACE_ERROR((LM_ERROR,
                 "Client ack\n"));
      return 0;
    }
  if(shm_allocator.find("FirstMessage",Message1)==-1)
    {
      ACE_ERROR((LM_ERROR,
                 "Client: Problem cant find data that server has sent\n"));
      return 0;
    }

  ACE_OS::printf(">>%s\n",(char*) Message1);
  ACE_OS::fflush(stdout);

  //Lets get that second message now.
  void *Message2;
  if(shm_allocator.find("SecondMessage",Message2)==-1)
    {
      ACE_ERROR((LM_ERROR,
                 "Client: Problem cant find data that server has sent\n"));
      ACE_OS::exit(1);
    }
  ACE_OS::printf(">>%s\n",(char*)Message2);
  ACE_OS::fflush(stdout);

  ACE_DEBUG((LM_DEBUG,"Client done reading! BYE NOW\n"));
  ACE_OS::fflush(stdout);

  //Get rid of all resources allocated by the server. In other
  //words get rid of the shared memory pool that had been
  //previously allocated
  shm_allocator.remove();

  return 0;
}

int main (int, char *argv[])
{
  switch (*argv[1])
    {
    case 's':
      server ();
      break;
    default:
      client ();
      break;
    }

  return 0;
}