diff options
author | jcej <jcej@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1998-12-28 23:00:59 +0000 |
---|---|---|
committer | jcej <jcej@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1998-12-28 23:00:59 +0000 |
commit | 986dcd3013fe2b4b8ae52db80abd5717576e2316 (patch) | |
tree | 905370482340b1c304440e7c0908351a70150c47 | |
parent | 4e58ead845a74368f8902ddf50fc2c55213e1c86 (diff) | |
download | ATCD-986dcd3013fe2b4b8ae52db80abd5717576e2316.tar.gz |
*** empty log message ***
-rw-r--r-- | ChangeLog-98b | 9 | ||||
-rw-r--r-- | docs/tutorials/020/Makefile | 76 | ||||
-rw-r--r-- | docs/tutorials/020/client.cpp | 32 | ||||
-rw-r--r-- | docs/tutorials/020/client2.cpp | 25 | ||||
-rw-r--r-- | docs/tutorials/020/combine.shar | 343 | ||||
-rw-r--r-- | docs/tutorials/020/mmap.cpp | 34 | ||||
-rw-r--r-- | docs/tutorials/020/mmap.h | 39 | ||||
-rw-r--r-- | docs/tutorials/020/mmapfile | 8 | ||||
-rw-r--r-- | docs/tutorials/020/page01.html | 26 | ||||
-rw-r--r-- | docs/tutorials/020/page02.html | 71 | ||||
-rw-r--r-- | docs/tutorials/020/page03.html | 51 | ||||
-rw-r--r-- | docs/tutorials/020/page04.html | 83 | ||||
-rw-r--r-- | docs/tutorials/020/page05.html | 94 | ||||
-rw-r--r-- | docs/tutorials/020/page06.html | 27 | ||||
-rw-r--r-- | docs/tutorials/020/server.cpp | 41 | ||||
-rw-r--r-- | docs/tutorials/020/server2.cpp | 31 | ||||
-rw-r--r-- | docs/tutorials/online-tutorials.html | 11 |
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 <= '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 () < 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 () < 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 |