summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjcej <jcej@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1998-12-28 23:00:59 +0000
committerjcej <jcej@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1998-12-28 23:00:59 +0000
commit986dcd3013fe2b4b8ae52db80abd5717576e2316 (patch)
tree905370482340b1c304440e7c0908351a70150c47
parent4e58ead845a74368f8902ddf50fc2c55213e1c86 (diff)
downloadATCD-986dcd3013fe2b4b8ae52db80abd5717576e2316.tar.gz
*** empty log message ***
-rw-r--r--ChangeLog-98b9
-rw-r--r--docs/tutorials/020/Makefile76
-rw-r--r--docs/tutorials/020/client.cpp32
-rw-r--r--docs/tutorials/020/client2.cpp25
-rw-r--r--docs/tutorials/020/combine.shar343
-rw-r--r--docs/tutorials/020/mmap.cpp34
-rw-r--r--docs/tutorials/020/mmap.h39
-rw-r--r--docs/tutorials/020/mmapfile8
-rw-r--r--docs/tutorials/020/page01.html26
-rw-r--r--docs/tutorials/020/page02.html71
-rw-r--r--docs/tutorials/020/page03.html51
-rw-r--r--docs/tutorials/020/page04.html83
-rw-r--r--docs/tutorials/020/page05.html94
-rw-r--r--docs/tutorials/020/page06.html27
-rw-r--r--docs/tutorials/020/server.cpp41
-rw-r--r--docs/tutorials/020/server2.cpp31
-rw-r--r--docs/tutorials/online-tutorials.html11
17 files changed, 1001 insertions, 0 deletions
diff --git a/ChangeLog-98b b/ChangeLog-98b
index 8e0046f3636..41d0fa67884 100644
--- a/ChangeLog-98b
+++ b/ChangeLog-98b
@@ -1,3 +1,12 @@
+Mon Dec 28 17:57:25 1998 James CE Johnson <jcej@chiroptera.tragus.org>
+
+ * docs/tutorials/020/*:
+ Sooner than expected... A brief and basic intro to using
+ ACE_Shared_Memory_MM.
+
+ * docs/tutorials/online-tutorials.html:
+ Linked in 019 and 020
+
Mon Dec 28 16:32:42 1998 James CE Johnson <jcej@chiroptera.tragus.org>
* docs/tutorials/019/*:
diff --git a/docs/tutorials/020/Makefile b/docs/tutorials/020/Makefile
new file mode 100644
index 00000000000..a7b0d9fca2a
--- /dev/null
+++ b/docs/tutorials/020/Makefile
@@ -0,0 +1,76 @@
+
+# $Id$
+
+#----------------------------------------------------------------------------
+# Local macros
+#----------------------------------------------------------------------------
+
+BIN = client server client2 server2
+
+FILES = mmap
+
+BUILD = $(VBIN)
+
+BSRC = $(addsuffix .cpp,$(BIN))
+
+SRC += $(addsuffix .cpp,$(FILES))
+
+#----------------------------------------------------------------------------
+# Include macros and targets
+#----------------------------------------------------------------------------
+
+include $(ACE_ROOT)/include/makeinclude/wrapper_macros.GNU
+include $(ACE_ROOT)/include/makeinclude/macros.GNU
+include $(ACE_ROOT)/include/makeinclude/rules.common.GNU
+include $(ACE_ROOT)/include/makeinclude/rules.nonested.GNU
+include $(ACE_ROOT)/include/makeinclude/rules.bin.GNU
+include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
+
+#----------------------------------------------------------------------------
+# Local targets
+#----------------------------------------------------------------------------
+
+rename : #
+ for i in *.cxx ; do \
+ n=`expr "$$i" : "\(.*\).cxx"` ;\
+ mv $$i $$n.cpp ;\
+ done
+
+Indent : #
+ for i in $(SRC) $(HDR) ; do \
+ indent -npsl -l80 -fca -fc1 -cli0 -cdb -ts2 -bl -bli0 < $$i | \
+ sed -e 's/: :/::/g' \
+ -e 's/^.*\(public:\)/\1/' \
+ -e 's/^.*\(protected:\)/\1/' \
+ -e 's/^.*\(private:\)/\1/' \
+ -e 's/:\(public\)/ : \1/' \
+ -e 's/:\(protected\)/ : \1/' \
+ -e 's/:\(private\)/ : \1/' \
+ -e 's/ / /g' \
+ > $$i~ ;\
+ mv $$i~ $$i ;\
+ done
+
+Depend : #
+ $(MAKE) SRC="$(SRC) $(BSRC)" depend
+ perl ../fix.Makefile
+
+.depend : #
+ touch .depend
+
+HTML : #
+ [ -f hdr ] || $(MAKE) UNSHAR
+ perl ../combine *.pre
+
+SHAR : #
+ [ ! -f combine.shar ] || exit 1
+ shar -T hdr bodies *.pre *.pst > combine.shar && rm -f hdr bodies *.pre *.pst
+
+UNSHAR : #
+ sh combine.shar
+
+#----------------------------------------------------------------------------
+# Dependencies
+#----------------------------------------------------------------------------
+
+include .depend
diff --git a/docs/tutorials/020/client.cpp b/docs/tutorials/020/client.cpp
new file mode 100644
index 00000000000..bfab1d188a6
--- /dev/null
+++ b/docs/tutorials/020/client.cpp
@@ -0,0 +1,32 @@
+
+// $Id$
+
+#include "mmap.h"
+
+int main (int, char *[])
+{
+ ACE_Shared_Memory_MM shm_client (SHM_KEY, SHMSZ);
+ char *shm = (char *) shm_client.malloc ();
+
+ ACE_DEBUG ((LM_INFO, "(%P|%t) Memory Mapped file is at 0x%x\n",
+ shm ));
+
+ if( ! shm )
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,"(%P|%t) Could not get the mmapped file!\n"),100);
+ }
+
+ for (char *s = shm; *s != '\0'; s++)
+ {
+ putchar (*s);
+ *s = toupper(*s);
+ }
+
+ putchar ('\n');
+ *shm = '*';
+
+ shm_client.close();
+
+ return 0;
+}
+
diff --git a/docs/tutorials/020/client2.cpp b/docs/tutorials/020/client2.cpp
new file mode 100644
index 00000000000..35ddc8ffe43
--- /dev/null
+++ b/docs/tutorials/020/client2.cpp
@@ -0,0 +1,25 @@
+
+// $Id$
+
+#include "mmap.h"
+
+int main (int, char *[])
+{
+ ACE_Shared_Memory_MM shm_client (SHM_KEY, sizeof(SharedData));
+
+ char *shm = (char *) shm_client.malloc ();
+
+ ACE_DEBUG ((LM_INFO, "(%P|%t) Memory Mapped file is at 0x%x\n",
+ shm ));
+
+ SharedData * sd = new(shm) SharedData(0);
+
+ sd->show();
+ sd->set();
+ sd->available(1);
+
+ shm_client.close();
+
+ return 0;
+}
+
diff --git a/docs/tutorials/020/combine.shar b/docs/tutorials/020/combine.shar
new file mode 100644
index 00000000000..187ff0fadcb
--- /dev/null
+++ b/docs/tutorials/020/combine.shar
@@ -0,0 +1,343 @@
+#!/bin/sh
+# This is a shell archive (produced by GNU sharutils 4.2).
+# To extract the files from this archive, save it to some FILE, remove
+# everything before the `!/bin/sh' line above, then type `sh FILE'.
+#
+# Made on 1998-12-28 18:00 EST by <jcej@chiroptera.tragus.org>.
+# Source directory was `/var/home/jcej/projects/ACE_wrappers/docs/tutorials/020'.
+#
+# Existing files will *not* be overwritten unless `-c' is specified.
+#
+# This shar contains:
+# length mode name
+# ------ ---------- ------------------------------------------
+# 426 -rw-rw-r-- hdr
+# 69 -rw-rw-r-- bodies
+# 509 -rw-rw-r-- page01.pre
+# 524 -rw-rw-r-- page02.pre
+# 115 -rw-rw-r-- page03.pre
+# 411 -rw-rw-r-- page04.pre
+# 102 -rw-rw-r-- page05.pre
+# 371 -rw-rw-r-- page06.pre
+# 132 -rw-rw-r-- page02.pst
+#
+save_IFS="${IFS}"
+IFS="${IFS}:"
+gettext_dir=FAILED
+locale_dir=FAILED
+first_param="$1"
+for dir in $PATH
+do
+ if test "$gettext_dir" = FAILED && test -f $dir/gettext \
+ && ($dir/gettext --version >/dev/null 2>&1)
+ then
+ set `$dir/gettext --version 2>&1`
+ if test "$3" = GNU
+ then
+ gettext_dir=$dir
+ fi
+ fi
+ if test "$locale_dir" = FAILED && test -f $dir/shar \
+ && ($dir/shar --print-text-domain-dir >/dev/null 2>&1)
+ then
+ locale_dir=`$dir/shar --print-text-domain-dir`
+ fi
+done
+IFS="$save_IFS"
+if test "$locale_dir" = FAILED || test "$gettext_dir" = FAILED
+then
+ echo=echo
+else
+ TEXTDOMAINDIR=$locale_dir
+ export TEXTDOMAINDIR
+ TEXTDOMAIN=sharutils
+ export TEXTDOMAIN
+ echo="$gettext_dir/gettext -s"
+fi
+touch -am 1231235999 $$.touch >/dev/null 2>&1
+if test ! -f 1231235999 && test -f $$.touch; then
+ shar_touch=touch
+else
+ shar_touch=:
+ echo
+ $echo 'WARNING: not restoring timestamps. Consider getting and'
+ $echo "installing GNU \`touch', distributed in GNU File Utilities..."
+ echo
+fi
+rm -f 1231235999 $$.touch
+#
+if mkdir _sh07707; then
+ $echo 'x -' 'creating lock directory'
+else
+ $echo 'failed to create lock directory'
+ exit 1
+fi
+# ============= hdr ==============
+if test -f 'hdr' && test "$first_param" != -c; then
+ $echo 'x -' SKIPPING 'hdr' '(file already exists)'
+else
+ $echo 'x -' extracting 'hdr' '(text)'
+ sed 's/^X//' << 'SHAR_EOF' > 'hdr' &&
+<HTML>
+<HEAD>
+X <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+X <META NAME="Author" CONTENT="James CE Johnson">
+X <TITLE>ACE Tutorial 020</TITLE>
+</HEAD>
+<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#000FFF" VLINK="#FF0F0F">
+X
+<CENTER><B><FONT SIZE=+2>ACE Tutorial 020</FONT></B></CENTER>
+X
+<CENTER><B><FONT SIZE=+2>Sharing your Memories with persistence</FONT></B></CENTER>
+X
+<P>
+<HR WIDTH="100%">
+SHAR_EOF
+ $shar_touch -am 1228173698 'hdr' &&
+ chmod 0664 'hdr' ||
+ $echo 'restore of' 'hdr' 'failed'
+ if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
+ && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
+ md5sum -c << SHAR_EOF >/dev/null 2>&1 \
+ || $echo 'hdr:' 'MD5 check failed'
+edd6dc67f13434391cf73b7604485b80 hdr
+SHAR_EOF
+ else
+ shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'hdr'`"
+ test 426 -eq "$shar_count" ||
+ $echo 'hdr:' 'original size' '426,' 'current size' "$shar_count!"
+ fi
+fi
+# ============= bodies ==============
+if test -f 'bodies' && test "$first_param" != -c; then
+ $echo 'x -' SKIPPING 'bodies' '(file already exists)'
+else
+ $echo 'x -' extracting 'bodies' '(text)'
+ sed 's/^X//' << 'SHAR_EOF' > 'bodies' &&
+PAGE=2
+server.cpp
+client.cpp
+server2.cpp client2.cpp
+mmap.h mmap.cpp
+SHAR_EOF
+ $shar_touch -am 1228174898 'bodies' &&
+ chmod 0664 'bodies' ||
+ $echo 'restore of' 'bodies' 'failed'
+ if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
+ && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
+ md5sum -c << SHAR_EOF >/dev/null 2>&1 \
+ || $echo 'bodies:' 'MD5 check failed'
+a5d087bf1c11cf431c082ba146f3c6aa bodies
+SHAR_EOF
+ else
+ shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'bodies'`"
+ test 69 -eq "$shar_count" ||
+ $echo 'bodies:' 'original size' '69,' 'current size' "$shar_count!"
+ fi
+fi
+# ============= page01.pre ==============
+if test -f 'page01.pre' && test "$first_param" != -c; then
+ $echo 'x -' SKIPPING 'page01.pre' '(file already exists)'
+else
+ $echo 'x -' extracting 'page01.pre' '(text)'
+ sed 's/^X//' << 'SHAR_EOF' > 'page01.pre' &&
+X This tutorial mirrors the previous. Instead of using shared memory,
+X this time we'll be using a memory-mapped file.
+X <p>
+X The cool thing about doing it this way is that we gain
+X persistence of memory even across reboots. I wonder if you
+X could memory map a file that's mounted via NFS?
+X <p>
+X Like the shared memory tutorial, this one is also very basic and
+X primitive. I'm assuming you've read that one, so I'll just hit
+X the high points this time through..
+SHAR_EOF
+ $shar_touch -am 1228173898 'page01.pre' &&
+ chmod 0664 'page01.pre' ||
+ $echo 'restore of' 'page01.pre' 'failed'
+ if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
+ && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
+ md5sum -c << SHAR_EOF >/dev/null 2>&1 \
+ || $echo 'page01.pre:' 'MD5 check failed'
+333a5e5f8be0a5b8dc66424a50e5b4bd page01.pre
+SHAR_EOF
+ else
+ shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'page01.pre'`"
+ test 509 -eq "$shar_count" ||
+ $echo 'page01.pre:' 'original size' '509,' 'current size' "$shar_count!"
+ fi
+fi
+# ============= page02.pre ==============
+if test -f 'page02.pre' && test "$first_param" != -c; then
+ $echo 'x -' SKIPPING 'page02.pre' '(file already exists)'
+else
+ $echo 'x -' extracting 'page02.pre' '(text)'
+ sed 's/^X//' << 'SHAR_EOF' > 'page02.pre' &&
+X Here's our new server using a memory mapped file instead of Unix
+X System V shared memory. Print out both servers and hold 'em up
+X to a strong light. I think you'll see there isn't much
+X difference.
+X <p>
+X The filename is defined in mmap.h as <i>mmapfile</i>. You can
+X <i>cat</i> it any time to see what's in there. If you're
+X feeling brave, try writting some data into it. On my system it
+X causes unpleasant things to happen. I'd recommend that you
+X don't do that!
+<hr>
+SHAR_EOF
+ $shar_touch -am 1228174498 'page02.pre' &&
+ chmod 0664 'page02.pre' ||
+ $echo 'restore of' 'page02.pre' 'failed'
+ if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
+ && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
+ md5sum -c << SHAR_EOF >/dev/null 2>&1 \
+ || $echo 'page02.pre:' 'MD5 check failed'
+94e75b2122d4d4c57e6f2f75c8d09b18 page02.pre
+SHAR_EOF
+ else
+ shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'page02.pre'`"
+ test 524 -eq "$shar_count" ||
+ $echo 'page02.pre:' 'original size' '524,' 'current size' "$shar_count!"
+ fi
+fi
+# ============= page03.pre ==============
+if test -f 'page03.pre' && test "$first_param" != -c; then
+ $echo 'x -' SKIPPING 'page03.pre' '(file already exists)'
+else
+ $echo 'x -' extracting 'page03.pre' '(text)'
+ sed 's/^X//' << 'SHAR_EOF' > 'page03.pre' &&
+There's no important difference between this and the SV client. Is
+X everybody thinking "template" here?
+<hr>
+SHAR_EOF
+ $shar_touch -am 1228174598 'page03.pre' &&
+ chmod 0664 'page03.pre' ||
+ $echo 'restore of' 'page03.pre' 'failed'
+ if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
+ && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
+ md5sum -c << SHAR_EOF >/dev/null 2>&1 \
+ || $echo 'page03.pre:' 'MD5 check failed'
+4ecbc37dd434a7f7ac6d17967625cfcb page03.pre
+SHAR_EOF
+ else
+ shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'page03.pre'`"
+ test 115 -eq "$shar_count" ||
+ $echo 'page03.pre:' 'original size' '115,' 'current size' "$shar_count!"
+ fi
+fi
+# ============= page04.pre ==============
+if test -f 'page04.pre' && test "$first_param" != -c; then
+ $echo 'x -' SKIPPING 'page04.pre' '(file already exists)'
+else
+ $echo 'x -' extracting 'page04.pre' '(text)'
+ sed 's/^X//' << 'SHAR_EOF' > 'page04.pre' &&
+I wanted to show placement new again & prove that you can use it with
+X a memory mapped file just as easily as with a shared memory
+X segment.
+X <p>
+Imagine if you had an object that contained an image & then you mapped
+X that to a file... Instead of a bunch of jpg files laying
+X around, you would actually have objects instead. Save the
+X image? No problem, it's already there!
+<hr>
+SHAR_EOF
+ $shar_touch -am 1228175398 'page04.pre' &&
+ chmod 0664 'page04.pre' ||
+ $echo 'restore of' 'page04.pre' 'failed'
+ if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
+ && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
+ md5sum -c << SHAR_EOF >/dev/null 2>&1 \
+ || $echo 'page04.pre:' 'MD5 check failed'
+22e02b4170bdf5e6cd8894b8983c737a page04.pre
+SHAR_EOF
+ else
+ shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'page04.pre'`"
+ test 411 -eq "$shar_count" ||
+ $echo 'page04.pre:' 'original size' '411,' 'current size' "$shar_count!"
+ fi
+fi
+# ============= page05.pre ==============
+if test -f 'page05.pre' && test "$first_param" != -c; then
+ $echo 'x -' SKIPPING 'page05.pre' '(file already exists)'
+else
+ $echo 'x -' extracting 'page05.pre' '(text)'
+ sed 's/^X//' << 'SHAR_EOF' > 'page05.pre' &&
+The mmap.h where we define stuff that needs to be shared between the
+X apps at compile-time.
+<hr>
+SHAR_EOF
+ $shar_touch -am 1228175198 'page05.pre' &&
+ chmod 0664 'page05.pre' ||
+ $echo 'restore of' 'page05.pre' 'failed'
+ if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
+ && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
+ md5sum -c << SHAR_EOF >/dev/null 2>&1 \
+ || $echo 'page05.pre:' 'MD5 check failed'
+4dd4610ed79583de6edd62eeb02bf7fe page05.pre
+SHAR_EOF
+ else
+ shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'page05.pre'`"
+ test 102 -eq "$shar_count" ||
+ $echo 'page05.pre:' 'original size' '102,' 'current size' "$shar_count!"
+ fi
+fi
+# ============= page06.pre ==============
+if test -f 'page06.pre' && test "$first_param" != -c; then
+ $echo 'x -' SKIPPING 'page06.pre' '(file already exists)'
+else
+ $echo 'x -' extracting 'page06.pre' '(text)'
+ sed 's/^X//' << 'SHAR_EOF' > 'page06.pre' &&
+This one was even shorter than the last!
+X
+X <ul>
+X <li><A HREF="server.cpp">server.cpp</A>
+X <li><A HREF="client.cpp">client.cpp</A>
+X <li><A HREF="server2.cpp">server2.cpp</A>
+X <li><A HREF="client2.cpp">client2.cpp</A>
+X <li><A HREF="mmap.h">mmap.h</A>
+X <li><A HREF="mmap.cpp">mmap.cpp</A>
+X <li><A HREF="Makefile">Makefile</A>
+X </ul>
+SHAR_EOF
+ $shar_touch -am 1228175498 'page06.pre' &&
+ chmod 0664 'page06.pre' ||
+ $echo 'restore of' 'page06.pre' 'failed'
+ if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
+ && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
+ md5sum -c << SHAR_EOF >/dev/null 2>&1 \
+ || $echo 'page06.pre:' 'MD5 check failed'
+8c515447a6b2a9c39a25915248260602 page06.pre
+SHAR_EOF
+ else
+ shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'page06.pre'`"
+ test 371 -eq "$shar_count" ||
+ $echo 'page06.pre:' 'original size' '371,' 'current size' "$shar_count!"
+ fi
+fi
+# ============= page02.pst ==============
+if test -f 'page02.pst' && test "$first_param" != -c; then
+ $echo 'x -' SKIPPING 'page02.pst' '(file already exists)'
+else
+ $echo 'x -' extracting 'page02.pst' '(text)'
+ sed 's/^X//' << 'SHAR_EOF' > 'page02.pst' &&
+<HR>
+BTW: In ACE 4.6.7 and prior there is a bug that prevents the remove()
+X method from actually removing the physical file.
+SHAR_EOF
+ $shar_touch -am 1228175398 'page02.pst' &&
+ chmod 0664 'page02.pst' ||
+ $echo 'restore of' 'page02.pst' 'failed'
+ if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
+ && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
+ md5sum -c << SHAR_EOF >/dev/null 2>&1 \
+ || $echo 'page02.pst:' 'MD5 check failed'
+10ea86cd7f1b8484868846bd8761e582 page02.pst
+SHAR_EOF
+ else
+ shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'page02.pst'`"
+ test 132 -eq "$shar_count" ||
+ $echo 'page02.pst:' 'original size' '132,' 'current size' "$shar_count!"
+ fi
+fi
+rm -fr _sh07707
+exit 0
diff --git a/docs/tutorials/020/mmap.cpp b/docs/tutorials/020/mmap.cpp
new file mode 100644
index 00000000000..6ee9f1198c8
--- /dev/null
+++ b/docs/tutorials/020/mmap.cpp
@@ -0,0 +1,34 @@
+
+// $Id$
+
+#include "mmap.h"
+
+SharedData::SharedData(int _initialize)
+ : available_(0)
+{
+ if( _initialize )
+ {
+ ACE_OS::sprintf(buf_,"UNSET\n");
+ }
+}
+
+void SharedData::set(void)
+{
+ ACE_OS::sprintf(buf_,"My PID is (%d)\n",ACE_OS::getpid());
+}
+
+void SharedData::show(void)
+{
+ ACE_DEBUG ((LM_INFO, "(%P|%t) Shared Data text is (%s)\n",
+ buf_ ));
+}
+
+int SharedData::available(void)
+{
+ return available_;
+}
+
+void SharedData::available(int _available)
+{
+ available_ = _available;
+}
diff --git a/docs/tutorials/020/mmap.h b/docs/tutorials/020/mmap.h
new file mode 100644
index 00000000000..5c3d8bce778
--- /dev/null
+++ b/docs/tutorials/020/mmap.h
@@ -0,0 +1,39 @@
+
+// $Id$
+
+#ifndef MMAP_H
+#define MMAP_H
+
+// The expected filename for ACE_Shared_Memory_MM.h
+#include "ace/Shared_Memory_MM.h"
+
+// Just enough for the alphabet...
+#define SHMSZ 27
+
+/*
+ Here we use a real filename instead of an arbitrary number. This
+ actually will exist in the filesystem. You can 'cat' it and
+ everything!
+*/
+#define SHM_KEY "mmapfile"
+
+/*
+ The SV Shared Memory SharedData object returns. It is identical to
+ the one we used in that tutorial. I didn't even change the name.
+ */
+class SharedData
+{
+public:
+ SharedData(int _initialize = 1);
+
+ void set(void);
+ void show(void);
+ int available(void);
+ void available(int _available);
+
+protected:
+ char buf_[128];
+ int available_;
+};
+
+#endif // MMAP_H
diff --git a/docs/tutorials/020/mmapfile b/docs/tutorials/020/mmapfile
new file mode 100644
index 00000000000..7ea5caf832b
--- /dev/null
+++ b/docs/tutorials/020/mmapfile
@@ -0,0 +1,8 @@
+root tty2 Dec 13 19:43
+jcej tty5 Dec 14 20:36
+dialout modem Dec 28 15:51 (/usr/sbin/diald -daemon -f /etc/diald.lads)
+jcej ttyp1 Dec 22 00:31 (:0.0)
+jcej ttyp2 Dec 22 11:22 (:0.0)
+jcej ttyp7 Dec 22 18:22 (:0.0)
+jcej ttyp9 Dec 24 00:04 (:0.0)
+jcej ttyp8 Dec 22 18:47 (:0.0)
diff --git a/docs/tutorials/020/page01.html b/docs/tutorials/020/page01.html
new file mode 100644
index 00000000000..9b88f442c08
--- /dev/null
+++ b/docs/tutorials/020/page01.html
@@ -0,0 +1,26 @@
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+ <META NAME="Author" CONTENT="James CE Johnson">
+ <TITLE>ACE Tutorial 020</TITLE>
+</HEAD>
+<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#000FFF" VLINK="#FF0F0F">
+
+<CENTER><B><FONT SIZE=+2>ACE Tutorial 020</FONT></B></CENTER>
+
+<CENTER><B><FONT SIZE=+2>Sharing your Memories with persistence</FONT></B></CENTER>
+
+<P>
+<HR WIDTH="100%">
+ This tutorial mirrors the previous. Instead of using shared memory,
+ this time we'll be using a memory-mapped file.
+ <p>
+ The cool thing about doing it this way is that we gain
+ persistence of memory even across reboots. I wonder if you
+ could memory map a file that's mounted via NFS?
+ <p>
+ Like the shared memory tutorial, this one is also very basic and
+ primitive. I'm assuming you've read that one, so I'll just hit
+ the high points this time through..
+<P><HR WIDTH="100%">
+<CENTER>[<A HREF="../online-tutorials.html">Tutorial Index</A>] [<A HREF="page02.html">Continue This Tutorial</A>]</CENTER>
diff --git a/docs/tutorials/020/page02.html b/docs/tutorials/020/page02.html
new file mode 100644
index 00000000000..dc5f293b16a
--- /dev/null
+++ b/docs/tutorials/020/page02.html
@@ -0,0 +1,71 @@
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+ <META NAME="Author" CONTENT="James CE Johnson">
+ <TITLE>ACE Tutorial 020</TITLE>
+</HEAD>
+<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#000FFF" VLINK="#FF0F0F">
+
+<CENTER><B><FONT SIZE=+2>ACE Tutorial 020</FONT></B></CENTER>
+
+<CENTER><B><FONT SIZE=+2>Sharing your Memories with persistence</FONT></B></CENTER>
+
+<P>
+<HR WIDTH="100%">
+ Here's our new server using a memory mapped file instead of Unix
+ System V shared memory. Print out both servers and hold 'em up
+ to a strong light. I think you'll see there isn't much
+ difference.
+ <p>
+ The filename is defined in mmap.h as <i>mmapfile</i>. You can
+ <i>cat</i> it any time to see what's in there. If you're
+ feeling brave, try writting some data into it. On my system it
+ causes unpleasant things to happen. I'd recommend that you
+ don't do that!
+<hr>
+<PRE>
+
+<font color=blue>#include</font> "<font color=green>mmap.h</font>"
+
+int
+main (int, char *[])
+{
+ <font color=red>/*
+ The default behavior of the memory map wrapper is to create
+ the file if it doesn't exist. This is a minor change from
+ the SV shared memory wrapper.
+ */</font>
+ ACE_Shared_Memory_MM shm_server (SHM_KEY, SHMSZ);
+ char *shm = (char *) shm_server.malloc ();
+ char *s = shm;
+
+ ACE_DEBUG ((LM_INFO, "<font color=green>(%P|%t) Memory Mapped file is at 0x%x\n</font>",
+ shm ));
+
+ for (char c = 'a'; c &lt;= 'z'; c++)
+ *s++ = c;
+
+ *s = '\0';
+
+ while (*shm != '*')
+ <font color=#008888>ACE_OS::sleep</font> (1);
+
+ for (char *s = shm; *s != '\0'; s++)
+ {
+ putchar (*s);
+ }
+
+ putchar ('\n');
+
+ if (shm_server.remove () &lt; 0)
+ ACE_ERROR ((LM_ERROR, "<font color=green>%p\n</font>", "<font color=green>remove</font>"));
+
+ return 0;
+}
+
+</PRE>
+<HR>
+BTW: In ACE 4.6.7 and prior there is a bug that prevents the remove()
+ method from actually removing the physical file.
+<P><HR WIDTH="100%">
+<CENTER>[<A HREF="../online-tutorials.html">Tutorial Index</A>] [<A HREF="page03.html">Continue This Tutorial</A>]</CENTER>
diff --git a/docs/tutorials/020/page03.html b/docs/tutorials/020/page03.html
new file mode 100644
index 00000000000..d7b41c8e51e
--- /dev/null
+++ b/docs/tutorials/020/page03.html
@@ -0,0 +1,51 @@
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+ <META NAME="Author" CONTENT="James CE Johnson">
+ <TITLE>ACE Tutorial 020</TITLE>
+</HEAD>
+<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#000FFF" VLINK="#FF0F0F">
+
+<CENTER><B><FONT SIZE=+2>ACE Tutorial 020</FONT></B></CENTER>
+
+<CENTER><B><FONT SIZE=+2>Sharing your Memories with persistence</FONT></B></CENTER>
+
+<P>
+<HR WIDTH="100%">
+There's no important difference between this and the SV client. Is
+ everybody thinking "template" here?
+<hr>
+<PRE>
+
+<font color=blue>#include</font> "<font color=green>mmap.h</font>"
+
+int main (int, char *[])
+{
+ ACE_Shared_Memory_MM shm_client (SHM_KEY, SHMSZ);
+ char *shm = (char *) shm_client.malloc ();
+
+ ACE_DEBUG ((LM_INFO, "<font color=green>(%P|%t) Memory Mapped file is at 0x%x\n</font>",
+ shm ));
+
+ if( ! shm )
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,"<font color=green>(%P|%t) Could not get the mmapped file!\n</font>"),100);
+ }
+
+ for (char *s = shm; *s != '\0'; s++)
+ {
+ putchar (*s);
+ *s = toupper(*s);
+ }
+
+ putchar ('\n');
+ *shm = '*';
+
+ shm_client.close();
+
+ return 0;
+}
+
+</PRE>
+<P><HR WIDTH="100%">
+<CENTER>[<A HREF="../online-tutorials.html">Tutorial Index</A>] [<A HREF="page04.html">Continue This Tutorial</A>]</CENTER>
diff --git a/docs/tutorials/020/page04.html b/docs/tutorials/020/page04.html
new file mode 100644
index 00000000000..037b820b63e
--- /dev/null
+++ b/docs/tutorials/020/page04.html
@@ -0,0 +1,83 @@
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+ <META NAME="Author" CONTENT="James CE Johnson">
+ <TITLE>ACE Tutorial 020</TITLE>
+</HEAD>
+<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#000FFF" VLINK="#FF0F0F">
+
+<CENTER><B><FONT SIZE=+2>ACE Tutorial 020</FONT></B></CENTER>
+
+<CENTER><B><FONT SIZE=+2>Sharing your Memories with persistence</FONT></B></CENTER>
+
+<P>
+<HR WIDTH="100%">
+I wanted to show placement new again & prove that you can use it with
+ a memory mapped file just as easily as with a shared memory
+ segment.
+ <p>
+Imagine if you had an object that contained an image & then you mapped
+ that to a file... Instead of a bunch of jpg files laying
+ around, you would actually have objects instead. Save the
+ image? No problem, it's already there!
+<hr>
+<HR width=50%><P><center>server2.cpp</center><HR width=50%>
+<PRE>
+
+<font color=blue>#include</font> "<font color=green>mmap.h</font>"
+
+int
+main (int, char *[])
+{
+ ACE_Shared_Memory_MM shm_server (SHM_KEY, sizeof(SharedData) );
+
+ char *shm = (char *) shm_server.malloc ();
+
+ ACE_DEBUG ((LM_INFO, "<font color=green>(%P|%t) Memory Mapped file is at 0x%x\n</font>",
+ shm ));
+
+ SharedData * sd = new(shm) SharedData;
+
+ sd->set();
+ sd->available(0);
+
+ while ( ! sd->available() )
+ <font color=#008888>ACE_OS::sleep</font> (1);
+
+ sd->show();
+
+ if (shm_server.remove () &lt; 0)
+ ACE_ERROR ((LM_ERROR, "<font color=green>%p\n</font>", "<font color=green>remove</font>"));
+
+ return 0;
+}
+
+</PRE>
+<HR width=50%><P><center>client2.cpp</center><HR width=50%>
+<PRE>
+
+<font color=blue>#include</font> "<font color=green>mmap.h</font>"
+
+int main (int, char *[])
+{
+ ACE_Shared_Memory_MM shm_client (SHM_KEY, sizeof(SharedData));
+
+ char *shm = (char *) shm_client.malloc ();
+
+ ACE_DEBUG ((LM_INFO, "<font color=green>(%P|%t) Memory Mapped file is at 0x%x\n</font>",
+ shm ));
+
+ SharedData * sd = new(shm) SharedData(0);
+
+ sd->show();
+ sd->set();
+ sd->available(1);
+
+ shm_client.close();
+
+ return 0;
+}
+
+</PRE>
+<P><HR WIDTH="100%">
+<CENTER>[<A HREF="../online-tutorials.html">Tutorial Index</A>] [<A HREF="page05.html">Continue This Tutorial</A>]</CENTER>
diff --git a/docs/tutorials/020/page05.html b/docs/tutorials/020/page05.html
new file mode 100644
index 00000000000..04016a34532
--- /dev/null
+++ b/docs/tutorials/020/page05.html
@@ -0,0 +1,94 @@
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+ <META NAME="Author" CONTENT="James CE Johnson">
+ <TITLE>ACE Tutorial 020</TITLE>
+</HEAD>
+<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#000FFF" VLINK="#FF0F0F">
+
+<CENTER><B><FONT SIZE=+2>ACE Tutorial 020</FONT></B></CENTER>
+
+<CENTER><B><FONT SIZE=+2>Sharing your Memories with persistence</FONT></B></CENTER>
+
+<P>
+<HR WIDTH="100%">
+The mmap.h where we define stuff that needs to be shared between the
+ apps at compile-time.
+<hr>
+<HR width=50%><P><center>mmap.h</center><HR width=50%>
+<PRE>
+
+<font color=blue>#ifndef</font> <font color=purple>MMAP_H</font>
+<font color=blue>#define</font> <font color=purple>MMAP_H</font>
+
+<font color=red>// The expected filename for ACE_Shared_Memory_MM.h</font>
+<font color=blue>#include</font> "<font color=green>ace/Shared_Memory_MM.h</font>"
+
+<font color=red>// Just enough for the alphabet...</font>
+<font color=blue>#define</font> <font color=purple>SHMSZ</font> 27
+
+<font color=red>/*
+ Here we use a real filename instead of an arbitrary number. This
+ actually will exist in the filesystem. You can 'cat' it and
+ everything!
+*/</font>
+<font color=blue>#define</font> <font color=purple>SHM_KEY</font> "<font color=green>mmapfile</font>"
+
+<font color=red>/*
+ The SV Shared Memory SharedData object returns. It is identical to
+ the one we used in that tutorial. I didn't even change the name.
+ */</font>
+class SharedData
+{
+public:
+ SharedData(int _initialize = 1);
+
+ void set(void);
+ void show(void);
+ int available(void);
+ void available(int _available);
+
+protected:
+ char buf_[128];
+ int available_;
+};
+
+<font color=blue>#endif</font> <font color=red>// MMAP_H</font>
+</PRE>
+<HR width=50%><P><center>mmap.cpp</center><HR width=50%>
+<PRE>
+
+<font color=blue>#include</font> "<font color=green>mmap.h</font>"
+
+<font color=#008888>SharedData::SharedData</font>(int _initialize)
+ : available_(0)
+{
+ if( _initialize )
+ {
+ <font color=#008888>ACE_OS::sprintf</font>(buf_,"<font color=green>UNSET\n</font>");
+ }
+}
+
+void <font color=#008888>SharedData::set</font>(void)
+{
+ <font color=#008888>ACE_OS::sprintf</font>(buf_,"<font color=green>My PID is (%d)\n</font>",ACE_OS::getpid());
+}
+
+void <font color=#008888>SharedData::show</font>(void)
+{
+ ACE_DEBUG ((LM_INFO, "<font color=green>(%P|%t) Shared Data text is (%s)\n</font>",
+ buf_ ));
+}
+
+int <font color=#008888>SharedData::available</font>(void)
+{
+ return available_;
+}
+
+void <font color=#008888>SharedData::available</font>(int _available)
+{
+ available_ = _available;
+}
+</PRE>
+<P><HR WIDTH="100%">
+<CENTER>[<A HREF="../online-tutorials.html">Tutorial Index</A>] [<A HREF="page06.html">Continue This Tutorial</A>]</CENTER>
diff --git a/docs/tutorials/020/page06.html b/docs/tutorials/020/page06.html
new file mode 100644
index 00000000000..af67e7754d6
--- /dev/null
+++ b/docs/tutorials/020/page06.html
@@ -0,0 +1,27 @@
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+ <META NAME="Author" CONTENT="James CE Johnson">
+ <TITLE>ACE Tutorial 020</TITLE>
+</HEAD>
+<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#000FFF" VLINK="#FF0F0F">
+
+<CENTER><B><FONT SIZE=+2>ACE Tutorial 020</FONT></B></CENTER>
+
+<CENTER><B><FONT SIZE=+2>Sharing your Memories with persistence</FONT></B></CENTER>
+
+<P>
+<HR WIDTH="100%">
+This one was even shorter than the last!
+
+ <ul>
+ <li><A HREF="server.cpp">server.cpp</A>
+ <li><A HREF="client.cpp">client.cpp</A>
+ <li><A HREF="server2.cpp">server2.cpp</A>
+ <li><A HREF="client2.cpp">client2.cpp</A>
+ <li><A HREF="mmap.h">mmap.h</A>
+ <li><A HREF="mmap.cpp">mmap.cpp</A>
+ <li><A HREF="Makefile">Makefile</A>
+ </ul>
+<P><HR WIDTH="100%">
+<CENTER>[<A HREF="../online-tutorials.html">Tutorial Index</A>] </CENTER>
diff --git a/docs/tutorials/020/server.cpp b/docs/tutorials/020/server.cpp
new file mode 100644
index 00000000000..83f95e104c1
--- /dev/null
+++ b/docs/tutorials/020/server.cpp
@@ -0,0 +1,41 @@
+
+// $Id$
+
+#include "mmap.h"
+
+int
+main (int, char *[])
+{
+ /*
+ The default behavior of the memory map wrapper is to create
+ the file if it doesn't exist. This is a minor change from
+ the SV shared memory wrapper.
+ */
+ ACE_Shared_Memory_MM shm_server (SHM_KEY, SHMSZ);
+ char *shm = (char *) shm_server.malloc ();
+ char *s = shm;
+
+ ACE_DEBUG ((LM_INFO, "(%P|%t) Memory Mapped file is at 0x%x\n",
+ shm ));
+
+ for (char c = 'a'; c <= 'z'; c++)
+ *s++ = c;
+
+ *s = '\0';
+
+ while (*shm != '*')
+ ACE_OS::sleep (1);
+
+ for (char *s = shm; *s != '\0'; s++)
+ {
+ putchar (*s);
+ }
+
+ putchar ('\n');
+
+ if (shm_server.remove () < 0)
+ ACE_ERROR ((LM_ERROR, "%p\n", "remove"));
+
+ return 0;
+}
+
diff --git a/docs/tutorials/020/server2.cpp b/docs/tutorials/020/server2.cpp
new file mode 100644
index 00000000000..9b5e6b21fee
--- /dev/null
+++ b/docs/tutorials/020/server2.cpp
@@ -0,0 +1,31 @@
+
+// $Id$
+
+#include "mmap.h"
+
+int
+main (int, char *[])
+{
+ ACE_Shared_Memory_MM shm_server (SHM_KEY, sizeof(SharedData) );
+
+ char *shm = (char *) shm_server.malloc ();
+
+ ACE_DEBUG ((LM_INFO, "(%P|%t) Memory Mapped file is at 0x%x\n",
+ shm ));
+
+ SharedData * sd = new(shm) SharedData;
+
+ sd->set();
+ sd->available(0);
+
+ while ( ! sd->available() )
+ ACE_OS::sleep (1);
+
+ sd->show();
+
+ if (shm_server.remove () < 0)
+ ACE_ERROR ((LM_ERROR, "%p\n", "remove"));
+
+ return 0;
+}
+
diff --git a/docs/tutorials/online-tutorials.html b/docs/tutorials/online-tutorials.html
index 1aef7a22000..e117f4521f5 100644
--- a/docs/tutorials/online-tutorials.html
+++ b/docs/tutorials/online-tutorials.html
@@ -119,6 +119,17 @@ Keeping yourself in synch</H4>
<A HREF="018/page01.html">Tokens & templates</A>
</OL>
+<P><HR WIDTH="50%" align=left><P>
+
+<H4>
+Do you remember...</H4>
+<OL>
+<LI>
+<A HREF="019/page01.html">Using System V Shared Memory for telepathy</A>
+<LI>
+<A HREF="020/page01.html">Never forget anything else again!</A>
+</OL>
+
<HR>
<P>Back to the <A