summaryrefslogtreecommitdiff
path: root/docs/tutorials/019/server.cpp
diff options
context:
space:
mode:
authorschmidt <douglascraigschmidt@users.noreply.github.com>1999-02-01 00:19:36 +0000
committerschmidt <douglascraigschmidt@users.noreply.github.com>1999-02-01 00:19:36 +0000
commite48627f7aa4870d63fe22eb3182d4fc025f9f322 (patch)
treed260f0202fabfa51980da5a32a2485d7cd9e6bba /docs/tutorials/019/server.cpp
parentfec0ef596a5d7d17b473990f439f205f01917eb9 (diff)
downloadATCD-e48627f7aa4870d63fe22eb3182d4fc025f9f322.tar.gz
.
Diffstat (limited to 'docs/tutorials/019/server.cpp')
-rw-r--r--docs/tutorials/019/server.cpp219
1 files changed, 111 insertions, 108 deletions
diff --git a/docs/tutorials/019/server.cpp b/docs/tutorials/019/server.cpp
index c03a4a8f11d..e114e2c66c1 100644
--- a/docs/tutorials/019/server.cpp
+++ b/docs/tutorials/019/server.cpp
@@ -1,4 +1,3 @@
-
// $Id$
/*
@@ -8,116 +7,120 @@
*/
#include "shmem.h"
-#if defined(ACE_LACKS_SYSV_SHMEM)
-int main (int, char *[])
+#if defined (ACE_LACKS_SYSV_SHMEM)
+int
+main (int, char *[])
{
- ACE_ERROR_RETURN ((LM_ERROR, "System V Shared Memory not available on this platform\n"),100);
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "System V Shared Memory not available on this platform\n"),
+ 100);
}
#else // ACE_LACKS_SYSV_SHMEM
-int main (int, char *argv[])
+int
+main (int, char *argv[])
{
- /*
- You can use the ACE_Malloc template to create memory pools
- from various shared memory strategies. It's really cool.
- We're not going to use it.
-
- Instead, I want to get to the roots of it all and directly
- use ACE_Shared_Memory_SV. Like many ACE objects, this is a
- wrapper around OS services.
-
- With this constructor we create a shared memory area to
- use. The ACE_CREATE flag will cause it to be created if it
- doesn't already exist. The SHM_KEY value (from shmem.h)
- uniquely identifies the segment and allows other apps to
- attach to the same segment. Execute 'ipcs -m' before and
- after starting this app to see that the segment is created.
- (I can't for the life of me correlate the SHM_KEY value back
- to the key/id reported by ipcs though.)
- */
- ACE_Shared_Memory_SV shm_server (SHM_KEY, SHMSZ,
- ACE_Shared_Memory_SV::ACE_CREATE);
-
- /*
- The constructor created the segment for us but we still need
- to map the segment into our address space. (Note that you
- can pass a value to malloc() but it will be silently
- igored.) The void* (cast to char*) that is returned will
- point to the beginning of the shared segment.
- */
- char *shm = (char *) shm_server.malloc ();
-
- /*
- Since we're asking to create the segment, we will fail if it
- already exists. We could fall back and simply attach to it
- like the client but I'd rather not assume it was a previous
- instance of this app that left the segment around.
- */
- if( ! shm )
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "%p\n\t(%P|%t) Cannot create shared memory segment.\n"
- "\tUse 'ipcs' to see if it already exists\n",
- argv[0]),100);
- }
-
- /*
- This second pointer will be used to walk through the block
- of memory...
- */
- char *s = shm;
-
- /*
- Out of curiosity, I added this output message. The tests
- I've done so far show me the same address for client and
- server. What does your OS tell you?
- */
- ACE_DEBUG ((LM_INFO, "(%P|%t) Shared Memory is at 0x%x\n",
- shm ));
-
- /*
- At this point, our application can use the pointer just like
- any other given to us by new or malloc. For our purposes,
- we'll copy in the alpabet as a null-terminated string.
- */
- for (char c = 'a'; c <= 'z'; c++)
- *s++ = c;
-
- *s = '\0';
-
- /*
- Using a simple not-too-busy loop, we'll wait for the client
- (or anyone else) to change the first byte in the shared area
- to a '*' character. This is where you would rather use
- semaphores or some similar "resource light" approach.
- */
- while (*shm != '*')
- ACE_OS::sleep (1);
-
- /*
- Let's see what the client did to the segment...
- */
- for (s = shm; *s != '\0'; s++)
- {
- putchar (*s);
- }
- putchar ('\n');
-
- /*
- If you're done with the segment and ready for it to be
- removed from the system, use the remove() method. Once the
- program exits, do 'ipcs -m' again and you'll see that the
- segment is gone. If you just want to terminate your use of
- the segment but leave it around for other apps, use the
- close() method instead.
-
- The free() method may be tempting but it doesn't actually do
- anything. If your app is *really* done with the shared
- memory then use either close() or remove().
- */
- if (shm_server.remove () < 0)
- ACE_ERROR ((LM_ERROR, "%p\n", "remove"));
-
- return 0;
+ /*
+ You can use the ACE_Malloc template to create memory pools
+ from various shared memory strategies. It's really cool.
+ We're not going to use it.
+
+ Instead, I want to get to the roots of it all and directly
+ use ACE_Shared_Memory_SV. Like many ACE objects, this is a
+ wrapper around OS services.
+
+ With this constructor we create a shared memory area to
+ use. The ACE_CREATE flag will cause it to be created if it
+ doesn't already exist. The SHM_KEY value (from shmem.h)
+ uniquely identifies the segment and allows other apps to
+ attach to the same segment. Execute 'ipcs -m' before and
+ after starting this app to see that the segment is created.
+ (I can't for the life of me correlate the SHM_KEY value back
+ to the key/id reported by ipcs though.)
+ */
+ ACE_Shared_Memory_SV shm_server (SHM_KEY, SHMSZ,
+ ACE_Shared_Memory_SV::ACE_CREATE);
+
+ /*
+ The constructor created the segment for us but we still need
+ to map the segment into our address space. (Note that you
+ can pass a value to malloc() but it will be silently
+ igored.) The void* (cast to char*) that is returned will
+ point to the beginning of the shared segment.
+ */
+ char *shm = (char *) shm_server.malloc ();
+
+ /*
+ Since we're asking to create the segment, we will fail if it
+ already exists. We could fall back and simply attach to it
+ like the client but I'd rather not assume it was a previous
+ instance of this app that left the segment around.
+ */
+ if (shm == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "%p\n\t(%P|%t) Cannot create shared memory segment.\n"
+ "\tUse 'ipcs' to see if it already exists\n",
+ argv[0]),
+ 100);
+
+ /*
+ This second pointer will be used to walk through the block
+ of memory...
+ */
+ char *s = shm;
+
+ /*
+ Out of curiosity, I added this output message. The tests
+ I've done so far show me the same address for client and
+ server. What does your OS tell you?
+ */
+ ACE_DEBUG ((LM_INFO,
+ "(%P|%t) Shared Memory is at 0x%x\n",
+ shm ));
+
+ /*
+ At this point, our application can use the pointer just like
+ any other given to us by new or malloc. For our purposes,
+ we'll copy in the alpabet as a null-terminated string.
+ */
+ for (char c = 'a'; c <= 'z'; c++)
+ *s++ = c;
+
+ *s = '\0';
+
+ /*
+ Using a simple not-too-busy loop, we'll wait for the client
+ (or anyone else) to change the first byte in the shared area
+ to a '*' character. This is where you would rather use
+ semaphores or some similar "resource light" approach.
+ */
+ while (*shm != '*')
+ ACE_OS::sleep (1);
+
+ /*
+ Let's see what the client did to the segment...
+ */
+ for (s = shm; *s != '\0'; s++)
+ putchar (*s);
+
+ putchar ('\n');
+
+ /*
+ If you're done with the segment and ready for it to be
+ removed from the system, use the remove() method. Once the
+ program exits, do 'ipcs -m' again and you'll see that the
+ segment is gone. If you just want to terminate your use of
+ the segment but leave it around for other apps, use the
+ close() method instead.
+
+ The free() method may be tempting but it doesn't actually do
+ anything. If your app is *really* done with the shared
+ memory then use either close() or remove().
+ */
+ if (shm_server.remove () < 0)
+ ACE_ERROR ((LM_ERROR,
+ "%p\n",
+ "remove"));
+ return 0;
}
-#endif // ACE_LACKS_SYSV_SHMEM
+#endif /* ACE_LACKS_SYSV_SHMEM */