diff options
Diffstat (limited to 'docs/tutorials/021')
-rw-r--r-- | docs/tutorials/021/021-client.dsp | 105 | ||||
-rw-r--r-- | docs/tutorials/021/021-server.dsp | 105 | ||||
-rw-r--r-- | docs/tutorials/021/Makefile | 79 | ||||
-rw-r--r-- | docs/tutorials/021/client.cpp | 123 | ||||
-rw-r--r-- | docs/tutorials/021/combine.shar | 398 | ||||
-rw-r--r-- | docs/tutorials/021/mpool.cpp | 66 | ||||
-rw-r--r-- | docs/tutorials/021/mpool.h | 67 | ||||
-rw-r--r-- | docs/tutorials/021/page01.html | 66 | ||||
-rw-r--r-- | docs/tutorials/021/page02.html | 186 | ||||
-rw-r--r-- | docs/tutorials/021/page03.html | 150 | ||||
-rw-r--r-- | docs/tutorials/021/page04.html | 111 | ||||
-rw-r--r-- | docs/tutorials/021/page05.html | 88 | ||||
-rw-r--r-- | docs/tutorials/021/page06.html | 34 | ||||
-rw-r--r-- | docs/tutorials/021/server.cpp | 158 |
14 files changed, 0 insertions, 1736 deletions
diff --git a/docs/tutorials/021/021-client.dsp b/docs/tutorials/021/021-client.dsp deleted file mode 100644 index 052ba50237a..00000000000 --- a/docs/tutorials/021/021-client.dsp +++ /dev/null @@ -1,105 +0,0 @@ -# Microsoft Developer Studio Project File - Name="021 client" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Console Application" 0x0103
-
-CFG=021 client - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "021 client.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "021 client.mak" CFG="021 client - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "021 client - Win32 Release" (based on\
- "Win32 (x86) Console Application")
-!MESSAGE "021 client - Win32 Debug" (based on\
- "Win32 (x86) Console Application")
-!MESSAGE
-
-# Begin Project
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "021 client - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\.." /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
-# ADD LINK32 ace.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\ace"
-
-!ELSEIF "$(CFG)" == "021 client - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\.." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 aced.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\ace"
-
-!ENDIF
-
-# Begin Target
-
-# Name "021 client - Win32 Release"
-# Name "021 client - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\client.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\mpool.cpp
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\mpool.h
-# End Source File
-# End Group
-# End Target
-# End Project
diff --git a/docs/tutorials/021/021-server.dsp b/docs/tutorials/021/021-server.dsp deleted file mode 100644 index 3667e52aa5f..00000000000 --- a/docs/tutorials/021/021-server.dsp +++ /dev/null @@ -1,105 +0,0 @@ -# Microsoft Developer Studio Project File - Name="021 server" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Console Application" 0x0103
-
-CFG=021 server - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "021 server.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "021 server.mak" CFG="021 server - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "021 server - Win32 Release" (based on\
- "Win32 (x86) Console Application")
-!MESSAGE "021 server - Win32 Debug" (based on\
- "Win32 (x86) Console Application")
-!MESSAGE
-
-# Begin Project
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "021 server - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\.." /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
-# ADD LINK32 ace.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\ace"
-
-!ELSEIF "$(CFG)" == "021 server - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\.." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 aced.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\ace"
-
-!ENDIF
-
-# Begin Target
-
-# Name "021 server - Win32 Release"
-# Name "021 server - Win32 Debug"
-# Begin Group "Header Files"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\mpool.h
-# End Source File
-# End Group
-# Begin Group "Source Files"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\mpool.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\server.cpp
-# End Source File
-# End Group
-# End Target
-# End Project
diff --git a/docs/tutorials/021/Makefile b/docs/tutorials/021/Makefile deleted file mode 100644 index 9df7f7c3a25..00000000000 --- a/docs/tutorials/021/Makefile +++ /dev/null @@ -1,79 +0,0 @@ - -# $Id$ - -#---------------------------------------------------------------------------- -# Local macros -#---------------------------------------------------------------------------- - -BIN = client server - -FILES = mpool - -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) hdr bodies *.pre *.pst - -UNSHAR : # - sh combine.shar - -CLEAN : realclean - $(RM) hdr bodies *.pre *.pst .depend - -#---------------------------------------------------------------------------- -# Dependencies -#---------------------------------------------------------------------------- - -include .depend diff --git a/docs/tutorials/021/client.cpp b/docs/tutorials/021/client.cpp deleted file mode 100644 index 544f72b49fe..00000000000 --- a/docs/tutorials/021/client.cpp +++ /dev/null @@ -1,123 +0,0 @@ - -// $Id$ - -#include "mpool.h" - -#if defined(ACE_LACKS_SYSV_SHMEM) -int -main (int, char *[]) -{ - ACE_ERROR_RETURN ((LM_ERROR, - "System V Semaphores not available on this platform.\n"),100); -} -#else // ACE_LACKS_SYSV_SHMEM -int -main (int, char *[]) -{ - /* - Use the same pool name used by the server when we create our - Allocator. This assures us that we don't create a whole new - pool. - */ - Allocator allocator (Constants::PoolName); - - /* - You can put anything in the memory pool. Not just the - character array we want. The find() method till, therefore, - return a void* that we will have to cast. - */ - void *region; - - /* - We use find() to locate a named region in the pool. This is - the counterpart to bind() used in the server. - Here, we go try to find the region that the server has created - and filled with data. If there was a problem getting the pool - or finding the region, we'll get back -1 from find(). - */ - if (allocator.pool ().find (Constants::RegionName,region) == -1) - ACE_ERROR_RETURN ((LM_ERROR, - "Cannot find the name '%s'\n", - Constants::RegionName), - 100); - - /* - Since find() returns us a void*, we cast it here to the char* - that we want. - */ - char *shm = (char *) region; - - ACE_DEBUG ((LM_INFO, - "Shared memory is at 0x%x\n", - shm)); - - /* - The same pair of semaphores as used by the server are created - here. We probably don't need the CREATE flag since the server - should have already done that. There may be some very small - windows, however, where the server would have created the - memory pool but not yet gotten to the semaphores. - */ - ACE_SV_Semaphore_Complex mutex; - ACE_ASSERT (mutex.open (Constants::SEM_KEY_1, - ACE_SV_Semaphore_Complex::ACE_CREATE, - 0) != -1); - - ACE_SV_Semaphore_Complex synch; - ACE_ASSERT (synch.open (Constants::SEM_KEY_2, - ACE_SV_Semaphore_Complex::ACE_CREATE, - 0) != -1); - - /* - It doesn't matter if we created 'mutex' or if the server did. - In either case, it was created in a locked state and we will - block here until somebody unlocks it. In our scenario, that - will have to be the server. - */ - if (mutex.acquire () == -1) - ACE_ERROR_RETURN ((LM_ERROR, - "(%P) client mutex.acquire"), - 1); - - /* - Now that we know it is safe to access the data, we'll run - through and make sure that it contains what we think the server - supplied. - */ - for (int i = 0; i < Constants::SHMSZ; i++) - ACE_ASSERT (Constants::SHMDATA[i] == shm[i]); - - /* - Look back at the server. After filling the region, it will - attempt to acquire the lock on 'synch'. It will wait there - until we release() the semaphore. That will allow it to remove - the pool and cleanup. We can simply exit once we perform the - release. (Ok, a free() of the region would probably be polite...) - */ - if (synch.release () == -1) - ACE_ERROR_RETURN ((LM_ERROR, - "(%P) client synch.release"), - 1); - - return 0; -} - -/* - Again, we have the necessary explicit template instantiations - because I based this on an ACE example instead of creating it from scratch. - */ -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -template class ACE_Malloc<ACE_MMAP_MEMORY_POOL, ACE_SV_Semaphore_Simple>; -template class ACE_Malloc_T<ACE_MMAP_MEMORY_POOL, ACE_SV_Semaphore_Simple, ACE_Control_Block>; -template class ACE_Guard<ACE_SV_Semaphore_Simple>; -template class ACE_Write_Guard<ACE_SV_Semaphore_Simple>; -template class ACE_Read_Guard<ACE_SV_Semaphore_Simple>; -#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) -#pragma instantiate ACE_Malloc<ACE_MMAP_MEMORY_POOL, ACE_SV_Semaphore_Simple> -#pragma instantiate ACE_Malloc_T<ACE_MMAP_MEMORY_POOL, ACE_SV_Semaphore_Simple, ACE_Control_Block> -#pragma instantiate ACE_Guard<ACE_SV_Semaphore_Simple> -#pragma instantiate ACE_Write_Guard<ACE_SV_Semaphore_Simple> -#pragma instantiate ACE_Read_Guard<ACE_SV_Semaphore_Simple> -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ - -#endif /* ACE_LACKS_SYSV_SHMEM */ diff --git a/docs/tutorials/021/combine.shar b/docs/tutorials/021/combine.shar deleted file mode 100644 index 1c720b3abfa..00000000000 --- a/docs/tutorials/021/combine.shar +++ /dev/null @@ -1,398 +0,0 @@ -#!/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 2000-03-19 15:00 EST by <jcej@chiroptera.tragus.org>. -# Source directory was `/home/jcej/projects/ACE_wrappers/docs/tutorials/021'. -# -# Existing files will *not* be overwritten unless `-c' is specified. -# -# This shar contains: -# length mode name -# ------ ---------- ------------------------------------------ -# 409 -rw-rw-r-- hdr -# 47 -rw-rw-r-- bodies -# 2293 -rw-rw-r-- page01.pre -# 282 -rw-rw-r-- page02.pre -# 207 -rw-rw-r-- page03.pre -# 295 -rw-rw-r-- page04.pre -# 61 -rw-rw-r-- page05.pre -# 616 -rw-rw-r-- page06.pre -# 785 -rw-rw-r-- page04.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 _sh00446; 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 021</TITLE> -</HEAD> -<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#000FFF" VLINK="#FF0F0F"> -X -<CENTER><B><FONT SIZE=+2>ACE Tutorial 021</FONT></B></CENTER> -X -<CENTER><B><FONT SIZE=+2>Pooling your memories</FONT></B></CENTER> -X -<P> -<HR WIDTH="100%"> -SHAR_EOF - $shar_touch -am 03191459100 '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' -9ffa6eb1308f4872f390b30f74a6de3b hdr -SHAR_EOF - else - shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'hdr'`" - test 409 -eq "$shar_count" || - $echo 'hdr:' 'original size' '409,' '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 -mpool.h -mpool.cpp -SHAR_EOF - $shar_touch -am 0106135399 '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' -470abefc6e5e401ad9ffdfa76e3ca143 bodies -SHAR_EOF - else - shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'bodies'`" - test 47 -eq "$shar_count" || - $echo 'bodies:' 'original size' '47,' '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 The previous two tutorials were very primitive & basic. They -X showed very simple uses of shared memory and memory mapped -X files. -X <p> -X If we move the level of abstraction up just a bit, the next -X thing we encounter is memory pools. ACE_Malloc<> provides -X this to us. -X <p> -X In this tutorial, we'll use ACE_Malloc<> to create a -X memory pool that is sharable between a client and server. We'll -X use a memory mapped file to provide the physical storage but -X shared memory works just as well. -<P> -Kirthika's abstract: -<UL> -The ACE_Malloc class is templatised by the type of memory pool -and the lock for it. The name of the memory pool provided can be used -in the "bind" call made by the server. This helps the other party -wanting to access it do so by a "find" call. The ACE_Malloc will -allocate -memory and on a "malloc" will return memory chunks from its reserve. -When the memory chunk is freed by the user, it will be appended to the -free list maintained by the class. Unless a "remove" is done explicitly, -the memory wont be returned to the OS. Various memory pool types can be -used, -X ACE_MMap_Memory_Pool,ACE_Sbrk_Memory_Pool to name a few. -For further details: <A HREF="../../ace/Memory_Pool.h">ace/Memory_Pool.h</A>. -<P> -In this tutorial, a ACE_Malloc class with ACE_MMAP_MEMORY_POOL -and a semophore for syncronisation has been used. This is locked by -the server initially and released after it writes into it so that -the client waiting for it can go ahead and do its job. There is yet -another semaphore used by the server to exit only after the client -has finished its task, which is locked by the client at the start -and released when its done. -<P> -Some more information regarding memory management: -ACE also provides the ACE_Allocator class which uses -dynamic binding and is flexible, though at a cost of using -virtual pointer tables. Also, there is an ACE_Allocator_Adapter class -which has an ACE_Allocator interface but ACE_Malloc functionality. -<P> -Bottomline: Memory can be managed either using the ACE_Allocator -set of classes which uses polymorphism and is thus flexible but not as -efficient as the templatised version which is the ACE_Malloc set of -classes which are more efficient but not as felxible. -X -</UL> -SHAR_EOF - $shar_touch -am 03191459100 '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' -24cacb4803303b37ae4871ff0aae141b page01.pre -SHAR_EOF - else - shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'page01.pre'`" - test 2293 -eq "$shar_count" || - $echo 'page01.pre:' 'original size' '2293,' '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 The key components for creating the memory pool are: -X <ul> -X <li>Create and name the pool -X <li>Allocate a chunk (region) of memory from the pool -X <li>Name the allocated region -X </ul> -X The rest of it is just critical sections and data manipulation. -<hr> -SHAR_EOF - $shar_touch -am 03191459100 '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' -6742359e1f990299bdab5992d0629d96 page02.pre -SHAR_EOF - else - shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'page02.pre'`" - test 282 -eq "$shar_count" || - $echo 'page02.pre:' 'original size' '282,' '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' && -X The client side is a little simpler than the server. Mainly -X because we don't try to delete the pool: -X <ul> -X <li>Create an Allocator to access the pool -X <li>Find the named region -X </ul> -<hr> -SHAR_EOF - $shar_touch -am 03191459100 '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' -9929e87d376461c200ea8d6ad819c2b0 page03.pre -SHAR_EOF - else - shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'page03.pre'`" - test 207 -eq "$shar_count" || - $echo 'page03.pre:' 'original size' '207,' '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' && -X Everything common the server & client is kept here. In -X particular, the Constants class where we keep the names & -X semaphore keys. -X <p> -X The Allocator class is just a thin wrapper around -X ACE_Malloc<> that moves some of the details out of the -X application logic. -<hr> -SHAR_EOF - $shar_touch -am 03191459100 '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' -82e8c15a608311faae46c4a2c6b0a5e1 page04.pre -SHAR_EOF - else - shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'page04.pre'`" - test 295 -eq "$shar_count" || - $echo 'page04.pre:' 'original size' '295,' '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' && -And here we have the implementation of the Allocator... -<hr> -SHAR_EOF - $shar_touch -am 03191459100 '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' -eef6d56514a448ce6cd962b7d34dd50f page05.pre -SHAR_EOF - else - shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'page05.pre'`" - test 61 -eq "$shar_count" || - $echo 'page05.pre:' 'original size' '61,' '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' && -X As you can see, using a memory pool is really rather easy. The -X most difficult part, as always, is with the synch mechanisms. -X <P> -X The other nice thing about ACE_Malloc<> is that you can swap -X between System V shared memory and memory mapped files just by -X changing the template parameters. The truly adventurous will -X likely find a runtime way of doing this. -X <p> -X -X <ul> -X <li><A HREF="Makefile">Makefile</A> -X <li><A HREF="server.cpp">server.cpp</A> -X <li><A HREF="client.cpp">client.cpp</A> -X <li><A HREF="mpool.h">mpool.h</A> -X <li><A HREF="mpool.cpp">mpool.cpp</A> -X </ul> -SHAR_EOF - $shar_touch -am 03191459100 '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' -0814cb31bbfbb6ff19abba9087cb6c6c page06.pre -SHAR_EOF - else - shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'page06.pre'`" - test 616 -eq "$shar_count" || - $echo 'page06.pre:' 'original size' '616,' 'current size' "$shar_count!" - fi -fi -# ============= page04.pst ============== -if test -f 'page04.pst' && test "$first_param" != -c; then - $echo 'x -' SKIPPING 'page04.pst' '(file already exists)' -else - $echo 'x -' extracting 'page04.pst' '(text)' - sed 's/^X//' << 'SHAR_EOF' > 'page04.pst' && -<HR> -X The really hard stuff is done by the ACE_Malloc<> template. This -X template takes two parameters.<sup>*</sup> The first is a -X memory pool class to use. ACE has several, I've choosen one -X that uses a memory-mapped file. The second parameter is a lock -X class of some sort. This is needed so that the ACE_Malloc<> can -X protect its internal data. Note that you still have to -X provide your own mutex around the data you put into the -X malloc'd area. -X -<P> -X * Actually, some implementations may require a different -X number of parameters. -X That's why ACE uses those funky macros. ACE_MMAP_MEMORY_POOL -X for instance turns into ACE_MMAP_Memory_Pool on Linux but may -X do other things on your platform. -SHAR_EOF - $shar_touch -am 03191459100 'page04.pst' && - chmod 0664 'page04.pst' || - $echo 'restore of' 'page04.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 'page04.pst:' 'MD5 check failed' -e2274ca81b8b99472c556ff05a090737 page04.pst -SHAR_EOF - else - shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'page04.pst'`" - test 785 -eq "$shar_count" || - $echo 'page04.pst:' 'original size' '785,' 'current size' "$shar_count!" - fi -fi -rm -fr _sh00446 -exit 0 diff --git a/docs/tutorials/021/mpool.cpp b/docs/tutorials/021/mpool.cpp deleted file mode 100644 index 7e55555e5bb..00000000000 --- a/docs/tutorials/021/mpool.cpp +++ /dev/null @@ -1,66 +0,0 @@ - -// $Id$ - -#include "mpool.h" - -#if !defined (ACE_LACKS_SYSV_SHMEM) - -/* - Set the values of all of the constants. This guarantees that client - and server don't get confused. - */ -const int Constants::SEM_KEY_1 = ACE_DEFAULT_SEM_KEY + 1; -const int Constants::SEM_KEY_2 = ACE_DEFAULT_SEM_KEY + 2; - -const int Constants::SHMSZ = 27; -const char * Constants::SHMDATA = "abcdefghijklmnopqrstuvwxyz"; - -const char * Constants::PoolName = "SharedMemoryPool"; -const char * Constants::RegionName = "Alphabet"; - -/* - We have to create a copy of the _name parameter in case the caller - has dynamically allocated it. The pool_ is set to NULL & will be - allocated by the accessor. - */ -Allocator::Allocator (const char *_name) - : name_ (ACE_OS::strdup (_name)), - pool_ (0) -{ - if (name_ == 0) - ACE_ERROR ((LM_ERROR, "(%P) %p", - "Allocator::Allocator cannot strdup pool name")); -} - -Allocator::~Allocator (void) -{ - /* - strdup() uses malloc(), so we must use free() to clean up. - */ - if (name_) - ACE_OS::free (name_); - - // delete doesn't really care if you give it a NULL pointer. - delete pool_; -} - -/* - Allocate the pool. Since we return a reference, we'll be in really - bad shape if the new fails. This is a great place to throw an - exception! - The other concern is thread safety. If two threads call here at - about the same time, we may create the pool twice. We can't use a - Singleton because we want to have multiple Allocator instances. The - Singleton techniques can be used though. - */ - -Allocator::pool_t & -Allocator::pool (void) -{ - if (pool_ == 0) - pool_ = new pool_t (name_); - - return *pool_; -} - -#endif /* ACE_LACKS_SYSV_SHMEM */ diff --git a/docs/tutorials/021/mpool.h b/docs/tutorials/021/mpool.h deleted file mode 100644 index fbb18e21e57..00000000000 --- a/docs/tutorials/021/mpool.h +++ /dev/null @@ -1,67 +0,0 @@ - -// $Id$ - -#ifndef MPOOL_H -#define MPOOL_H - -// Everything else we need is in this one header -#include "ace/Malloc.h" - -#if !defined (ACE_LACKS_SYSV_SHMEM) - -/* - With this we will abstract away some of the details of the memory - pool. Note that we don't treat this as a singleton because an - application may need more than one pool. Each would have a - different name and be used for different purposes. - */ - -class Allocator -{ -public: - // The pool name will be used to create a unique semaphore to - // keep this pool separate from others. - Allocator (const char * _name = "MemoryPool"); - ~Allocator (void); - - typedef ACE_Malloc<ACE_MMAP_MEMORY_POOL, ACE_SV_Semaphore_Simple> pool_t; - - // Provide an accessor to the pool. This will also allocate the - // pool when first invoked. - pool_t &pool (void); - -protected: - - // The name we gave to the pool - char *name_; - - pool_t *pool_; -}; - -/* - The client and server need to agree on a certain set of values. By - placing them in the Constants class we can eliminate a bit of confusion. - */ -class Constants -{ -public: - // The semaphore keys are needed for the two semaphores that - // synch access to the shared memory area. - static const int SEM_KEY_1; - static const int SEM_KEY_2; - - // How big the pool will be and what we'll put into it. A real - // app wouldn't need SHMDATA of course. - static const int SHMSZ; - static const char *SHMDATA; - - // The name assigned to the memory pool by the server is needed - // by the client. Without it, the pool cannot be found. - // Likewise, the name the server will bind() to the region of the - // pool must be available to the client. - static const char *PoolName; - static const char *RegionName; -}; - -#endif /* ACE_LACKS_SYSV_SHMEM */ -#endif /* MPOOL_H */ diff --git a/docs/tutorials/021/page01.html b/docs/tutorials/021/page01.html deleted file mode 100644 index 93d2d2ad407..00000000000 --- a/docs/tutorials/021/page01.html +++ /dev/null @@ -1,66 +0,0 @@ -<!-- $Id$ --> -<HTML> -<HEAD> - <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"> - <META NAME="Author" CONTENT="James CE Johnson"> - <TITLE>ACE Tutorial 021</TITLE> -</HEAD> -<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#000FFF" VLINK="#FF0F0F"> - -<CENTER><B><FONT SIZE=+2>ACE Tutorial 021</FONT></B></CENTER> - -<CENTER><B><FONT SIZE=+2>Pooling your memories</FONT></B></CENTER> - -<P> -<HR WIDTH="100%"> - The previous two tutorials were very primitive & basic. They - showed very simple uses of shared memory and memory mapped - files. - <p> - If we move the level of abstraction up just a bit, the next - thing we encounter is memory pools. ACE_Malloc<> provides - this to us. - <p> - In this tutorial, we'll use ACE_Malloc<> to create a - memory pool that is sharable between a client and server. We'll - use a memory mapped file to provide the physical storage but - shared memory works just as well. -<P> -Kirthika's abstract: -<UL> -The ACE_Malloc class is templatised by the type of memory pool -and the lock for it. The name of the memory pool provided can be used -in the "bind" call made by the server. This helps the other party -wanting to access it do so by a "find" call. The ACE_Malloc will -allocate -memory and on a "malloc" will return memory chunks from its reserve. -When the memory chunk is freed by the user, it will be appended to the -free list maintained by the class. Unless a "remove" is done explicitly, -the memory wont be returned to the OS. Various memory pool types can be -used, - ACE_MMap_Memory_Pool,ACE_Sbrk_Memory_Pool to name a few. -For further details: <A HREF="../../../ace/Memory_Pool.h">ace/Memory_Pool.h</A>. -<P> -In this tutorial, a ACE_Malloc class with ACE_MMAP_MEMORY_POOL -and a semophore for syncronisation has been used. This is locked by -the server initially and released after it writes into it so that -the client waiting for it can go ahead and do its job. There is yet -another semaphore used by the server to exit only after the client -has finished its task, which is locked by the client at the start -and released when its done. -<P> -Some more information regarding memory management: -ACE also provides the ACE_Allocator class which uses -dynamic binding and is flexible, though at a cost of using -virtual pointer tables. Also, there is an ACE_Allocator_Adapter class -which has an ACE_Allocator interface but ACE_Malloc functionality. -<P> -Bottomline: Memory can be managed either using the ACE_Allocator -set of classes which uses polymorphism and is thus flexible but not as -efficient as the templatised version which is the ACE_Malloc set of -classes which are more efficient but not as felxible. - -</UL> -<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/021/page02.html b/docs/tutorials/021/page02.html deleted file mode 100644 index 1310357d60d..00000000000 --- a/docs/tutorials/021/page02.html +++ /dev/null @@ -1,186 +0,0 @@ -<!-- $Id$ --> -<HTML> -<HEAD> - <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"> - <META NAME="Author" CONTENT="James CE Johnson"> - <TITLE>ACE Tutorial 021</TITLE> -</HEAD> -<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#000FFF" VLINK="#FF0F0F"> - -<CENTER><B><FONT SIZE=+2>ACE Tutorial 021</FONT></B></CENTER> - -<CENTER><B><FONT SIZE=+2>Pooling your memories</FONT></B></CENTER> - -<P> -<HR WIDTH="100%"> - The key components for creating the memory pool are: - <ul> - <li>Create and name the pool - <li>Allocate a chunk (region) of memory from the pool - <li>Name the allocated region - </ul> - The rest of it is just critical sections and data manipulation. -<hr> -<PRE> - -<font color=red>// $Id$</font> - -<font color=red>/* - I've hidden the details in an Allocator class declared in mpool.h - We'll come to that a little later. -*/</font> -<font color=blue>#include</font> "<font color=green>mpool.h</font>" - -<font color=blue>#if defined</font>(<font color=purple>ACE_LACKS_SYSV_SHMEM</font>) -int -main (int, char *[]) -{ - ACE_ERROR_RETURN ((LM_ERROR, - "<font color=green>System V Semaphores not available on this platform.\n</font>"),100); -} -#else <font color=red>// ACE_LACKS_SYSV_SHMEM</font> -int -main (int, char *[]) -{ - <font color=red>/* - Construction of an Allocator will create the memory pool and - provide it with a name. The Constants class is also - declared in mpool.h to keep server and client on the same - page. The name is used to generate a unique semaphore which - prevents simultaneous access to the pools housekeeping - information. (Note that you still have to provide your own - synch mechanisms for the data *you* put in the poo.) - */</font> - Allocator allocator (<font color=#008888>Constants::PoolName</font>); - - <font color=red>/* - The Allocator class provides the pool() member so that you - have access to the actual memory pool. A more robust - implementation would behave more as a bridge class but this - is good enough for what we're doing here. - Once you have a reference to the pool, the malloc() method - can be used to get some bytes. If successful, shm will - point to the data. Otherwise, it will be zero. - */</font> - char *shm = (char *) allocator.pool ().malloc (27); - - ACE_ASSERT (shm != 0); - - <font color=red>/// FYI</font> - ACE_DEBUG ((LM_INFO, - "<font color=green>Shared memory is at 0x%x\n</font>", - shm)); - - <font color=red>/* - Something that we can do with a memory pool is map a name to - a region provided by malloc. By doing this, we can - communicate that name to the client as a rendezvous - location. Again, a member of Constants is used to keep the - client and server coordinated. - */</font> - if (allocator.pool ().bind(<font color=#008888>Constants::RegionName</font>,shm) == -1) - ACE_ERROR_RETURN ((LM_ERROR, - "<font color=green>Cannot bind the name '%s' to the pointer 0x%x\n</font>", - <font color=#008888>Constants::RegionName</font>, - shm), - 100); - - <font color=red>/* - One of the best ways to synch between different processes is - through the use of semaphores. ACE_SV_Semaphore_Complex - hides the gory details and lets us use them rather easily. - - Here, we'll create two semaphores: mutex and synch. mutex - will be used to provide mutually exclusive access to the - shared region for writting/reading. synch will be used to - prevent the server from removing the memory pool before the - client is done with it. - - Both semaphores are created in an initially locked state. - */</font> - - ACE_SV_Semaphore_Complex mutex; - ACE_ASSERT (mutex.open (<font color=#008888>Constants::SEM_KEY_1</font>, - <font color=#008888>ACE_SV_Semaphore_Complex::ACE_CREATE</font>, - 0) != -1); - - ACE_SV_Semaphore_Complex synch; - ACE_ASSERT (synch.open (<font color=#008888>Constants::SEM_KEY_2</font>, - <font color=#008888>ACE_SV_Semaphore_Complex::ACE_CREATE</font>, - 0) != -1); - - <font color=red>/* - We know the mutex is locked because we created it that way. - Take a moment to write some data into the shared region. - */</font> - for (int i = 0; i < <font color=#008888>Constants::SHMSZ</font>; i++) - shm[i] = <font color=#008888>Constants::SHMDATA</font>[i]; - - <font color=red>/* - The client will be blocking on an acquire() of mutex. By - releasing it here, the client can go look at the shared data. - */</font> - if (mutex.release () == -1) - ACE_ERROR ((LM_ERROR, - "<font color=green>(%P) %p</font>", - "<font color=green>server mutex.release</font>")); - <font color=red>/* - Even though we created the synch semaphore in a locked - state, if we attempt to acquire() it, we will block. Our - design requires that the client release() synch when it is - OK for us to remove the shared memory. - */</font> - else if (synch.acquire () == -1) - ACE_ERROR ((LM_ERROR, - "<font color=green>(%P) %p</font>", - "<font color=green>server synch.acquire</font>")); - <font color=red>/* - This will remove all of the memory pool's resources. In the - case where a memory mapped file is used, the physical file - will also be removed. - */</font> - if (allocator.pool ().remove () == -1) - ACE_ERROR ((LM_ERROR, - "<font color=green>(%P) %p\n</font>", - "<font color=green>server allocator.remove</font>")); - <font color=red>/* - We now have to cleanup the semaphores we created. Use the - ipcs command to see that they did, indeed, go away after the - server exits. - */</font> - - if (mutex.remove () == -1) - ACE_ERROR ((LM_ERROR, - "<font color=green>(%P) %p\n</font>", - "<font color=green>server mutex.remove</font>")); - else if (synch.remove () == -1) - ACE_ERROR ((LM_ERROR, - "<font color=green>(%P) %p\n</font>", - "<font color=green>server synch.remove</font>")); - return 0; -} - -<font color=red>/* - This tutorial was created by shamelessly modifying one of the ACE - examples. Someone there had already created the necessary explicit - template instantiations & I don't want them to go to waste... - */</font> -<font color=blue>#if defined</font> (<font color=purple>ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION</font>) -template class ACE_Malloc<ACE_MMAP_MEMORY_POOL, ACE_SV_Semaphore_Simple>; -template class ACE_Malloc_T<ACE_MMAP_MEMORY_POOL, ACE_SV_Semaphore_Simple, ACE_Control_Block>; -template class ACE_Guard<ACE_SV_Semaphore_Simple>; -template class ACE_Write_Guard<ACE_SV_Semaphore_Simple>; -template class ACE_Read_Guard<ACE_SV_Semaphore_Simple>; -<font color=blue>#elif defined</font> (<font color=purple>ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA</font>) -<font color=blue>#pragma</font> <font color=purple>instantiate</font> ACE_Malloc<ACE_MMAP_MEMORY_POOL, ACE_SV_Semaphore_Simple> -<font color=blue>#pragma</font> <font color=purple>instantiate</font> ACE_Malloc_T<ACE_MMAP_MEMORY_POOL, ACE_SV_Semaphore_Simple, ACE_Control_Block> -<font color=blue>#pragma</font> <font color=purple>instantiate</font> ACE_Guard<ACE_SV_Semaphore_Simple> -<font color=blue>#pragma</font> <font color=purple>instantiate</font> ACE_Write_Guard<ACE_SV_Semaphore_Simple> -<font color=blue>#pragma</font> <font color=purple>instantiate</font> ACE_Read_Guard<ACE_SV_Semaphore_Simple> -<font color=blue>#endif</font> <font color=red>/* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */</font> - -<font color=blue>#endif</font> <font color=red>/* ACE_LACKS_SYSV_SHMEM */</font> -</PRE> -<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/021/page03.html b/docs/tutorials/021/page03.html deleted file mode 100644 index 03347b633c0..00000000000 --- a/docs/tutorials/021/page03.html +++ /dev/null @@ -1,150 +0,0 @@ -<!-- $Id$ --> -<HTML> -<HEAD> - <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"> - <META NAME="Author" CONTENT="James CE Johnson"> - <TITLE>ACE Tutorial 021</TITLE> -</HEAD> -<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#000FFF" VLINK="#FF0F0F"> - -<CENTER><B><FONT SIZE=+2>ACE Tutorial 021</FONT></B></CENTER> - -<CENTER><B><FONT SIZE=+2>Pooling your memories</FONT></B></CENTER> - -<P> -<HR WIDTH="100%"> - The client side is a little simpler than the server. Mainly - because we don't try to delete the pool: - <ul> - <li>Create an Allocator to access the pool - <li>Find the named region - </ul> -<hr> -<PRE> - -<font color=red>// $Id$</font> - -<font color=blue>#include</font> "<font color=green>mpool.h</font>" - -<font color=blue>#if defined</font>(<font color=purple>ACE_LACKS_SYSV_SHMEM</font>) -int -main (int, char *[]) -{ - ACE_ERROR_RETURN ((LM_ERROR, - "<font color=green>System V Semaphores not available on this platform.\n</font>"),100); -} -#else <font color=red>// ACE_LACKS_SYSV_SHMEM</font> -int -main (int, char *[]) -{ - <font color=red>/* - Use the same pool name used by the server when we create our - Allocator. This assures us that we don't create a whole new - pool. - */</font> - Allocator allocator (<font color=#008888>Constants::PoolName</font>); - - <font color=red>/* - You can put anything in the memory pool. Not just the - character array we want. The find() method till, therefore, - return a void* that we will have to cast. - */</font> - void *region; - - <font color=red>/* - We use find() to locate a named region in the pool. This is - the counterpart to bind() used in the server. - Here, we go try to find the region that the server has created - and filled with data. If there was a problem getting the pool - or finding the region, we'll get back -1 from find(). - */</font> - if (allocator.pool ().find (<font color=#008888>Constants::RegionName</font>,region) == -1) - ACE_ERROR_RETURN ((LM_ERROR, - "<font color=green>Cannot find the name '%s'\n</font>", - <font color=#008888>Constants::RegionName</font>), - 100); - - <font color=red>/* - Since find() returns us a void*, we cast it here to the char* - that we want. - */</font> - char *shm = (char *) region; - - ACE_DEBUG ((LM_INFO, - "<font color=green>Shared memory is at 0x%x\n</font>", - shm)); - - <font color=red>/* - The same pair of semaphores as used by the server are created - here. We probably don't need the CREATE flag since the server - should have already done that. There may be some very small - windows, however, where the server would have created the - memory pool but not yet gotten to the semaphores. - */</font> - ACE_SV_Semaphore_Complex mutex; - ACE_ASSERT (mutex.open (<font color=#008888>Constants::SEM_KEY_1</font>, - <font color=#008888>ACE_SV_Semaphore_Complex::ACE_CREATE</font>, - 0) != -1); - - ACE_SV_Semaphore_Complex synch; - ACE_ASSERT (synch.open (<font color=#008888>Constants::SEM_KEY_2</font>, - <font color=#008888>ACE_SV_Semaphore_Complex::ACE_CREATE</font>, - 0) != -1); - - <font color=red>/* - It doesn't matter if we created 'mutex' or if the server did. - In either case, it was created in a locked state and we will - block here until somebody unlocks it. In our scenario, that - will have to be the server. - */</font> - if (mutex.acquire () == -1) - ACE_ERROR_RETURN ((LM_ERROR, - "<font color=green>(%P) client mutex.acquire</font>"), - 1); - - <font color=red>/* - Now that we know it is safe to access the data, we'll run - through and make sure that it contains what we think the server - supplied. - */</font> - for (int i = 0; i < <font color=#008888>Constants::SHMSZ</font>; i++) - ACE_ASSERT (<font color=#008888>Constants::SHMDATA</font>[i] == shm[i]); - - <font color=red>/* - Look back at the server. After filling the region, it will - attempt to acquire the lock on 'synch'. It will wait there - until we release() the semaphore. That will allow it to remove - the pool and cleanup. We can simply exit once we perform the - release. (Ok, a free() of the region would probably be polite...) - */</font> - if (synch.release () == -1) - ACE_ERROR_RETURN ((LM_ERROR, - "<font color=green>(%P) client synch.release</font>"), - 1); - - return 0; -} - -<font color=red>/* - Again, we have the necessary explicit template instantiations - because I based this on an ACE example instead of creating it from scratch. - */</font> -<font color=blue>#if defined</font> (<font color=purple>ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION</font>) -template class ACE_Malloc<ACE_MMAP_MEMORY_POOL, ACE_SV_Semaphore_Simple>; -template class ACE_Malloc_T<ACE_MMAP_MEMORY_POOL, ACE_SV_Semaphore_Simple, ACE_Control_Block>; -template class ACE_Guard<ACE_SV_Semaphore_Simple>; -template class ACE_Write_Guard<ACE_SV_Semaphore_Simple>; -template class ACE_Read_Guard<ACE_SV_Semaphore_Simple>; -<font color=blue>#elif defined</font> (<font color=purple>ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA</font>) -<font color=blue>#pragma</font> <font color=purple>instantiate</font> ACE_Malloc<ACE_MMAP_MEMORY_POOL, ACE_SV_Semaphore_Simple> -<font color=blue>#pragma</font> <font color=purple>instantiate</font> ACE_Malloc_T<ACE_MMAP_MEMORY_POOL, ACE_SV_Semaphore_Simple, ACE_Control_Block> -<font color=blue>#pragma</font> <font color=purple>instantiate</font> ACE_Guard<ACE_SV_Semaphore_Simple> -<font color=blue>#pragma</font> <font color=purple>instantiate</font> ACE_Write_Guard<ACE_SV_Semaphore_Simple> -<font color=blue>#pragma</font> <font color=purple>instantiate</font> ACE_Read_Guard<ACE_SV_Semaphore_Simple> -<font color=blue>#endif</font> <font color=red>/* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */</font> - -<font color=blue>#endif</font> <font color=red>/* ACE_LACKS_SYSV_SHMEM */</font> -</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/021/page04.html b/docs/tutorials/021/page04.html deleted file mode 100644 index 2886b87e19e..00000000000 --- a/docs/tutorials/021/page04.html +++ /dev/null @@ -1,111 +0,0 @@ -<!-- $Id$ --> -<HTML> -<HEAD> - <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"> - <META NAME="Author" CONTENT="James CE Johnson"> - <TITLE>ACE Tutorial 021</TITLE> -</HEAD> -<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#000FFF" VLINK="#FF0F0F"> - -<CENTER><B><FONT SIZE=+2>ACE Tutorial 021</FONT></B></CENTER> - -<CENTER><B><FONT SIZE=+2>Pooling your memories</FONT></B></CENTER> - -<P> -<HR WIDTH="100%"> - Everything common the server & client is kept here. In - particular, the Constants class where we keep the names & - semaphore keys. - <p> - The Allocator class is just a thin wrapper around - ACE_Malloc<> that moves some of the details out of the - application logic. -<hr> -<PRE> - -<font color=red>// $Id$</font> - -<font color=blue>#ifndef</font> <font color=purple>MPOOL_H</font> -<font color=blue>#define</font> <font color=purple>MPOOL_H</font> - -<font color=red>// Everything else we need is in this one header</font> -<font color=blue>#include</font> "<A HREF="../../../ace/Malloc.h">ace/Malloc.h</A>" - -<font color=blue>#if !defined</font> (<font color=purple>ACE_LACKS_SYSV_SHMEM</font>) - -<font color=red>/* - With this we will abstract away some of the details of the memory - pool. Note that we don't treat this as a singleton because an - application may need more than one pool. Each would have a - different name and be used for different purposes. - */</font> - -class Allocator -{ -public: - <font color=red>// The pool name will be used to create a unique semaphore to</font> - <font color=red>// keep this pool separate from others.</font> - Allocator (const char * _name = "<font color=green>MemoryPool</font>"); - ~Allocator (void); - - typedef ACE_Malloc<ACE_MMAP_MEMORY_POOL, ACE_SV_Semaphore_Simple> pool_t; - - <font color=red>// Provide an accessor to the pool. This will also allocate the</font> - <font color=red>// pool when first invoked.</font> - pool_t &pool (void); - -protected: - - <font color=red>// The name we gave to the pool</font> - char *name_; - - pool_t *pool_; -}; - -<font color=red>/* - The client and server need to agree on a certain set of values. By - placing them in the Constants class we can eliminate a bit of confusion. - */</font> -class Constants -{ -public: - <font color=red>// The semaphore keys are needed for the two semaphores that</font> - <font color=red>// synch access to the shared memory area.</font> - static const int SEM_KEY_1; - static const int SEM_KEY_2; - - <font color=red>// How big the pool will be and what we'll put into it. A real</font> - <font color=red>// app wouldn't need SHMDATA of course.</font> - static const int SHMSZ; - static const char *SHMDATA; - - <font color=red>// The name assigned to the memory pool by the server is needed</font> - <font color=red>// by the client. Without it, the pool cannot be found.</font> - <font color=red>// Likewise, the name the server will bind() to the region of the</font> - <font color=red>// pool must be available to the client.</font> - static const char *PoolName; - static const char *RegionName; -}; - -<font color=blue>#endif</font> <font color=red>/* ACE_LACKS_SYSV_SHMEM */</font> -<font color=blue>#endif</font> <font color=red>/* MPOOL_H */</font> -</PRE> -<HR> - The really hard stuff is done by the ACE_Malloc<> template. This - template takes two parameters.<sup>*</sup> The first is a - memory pool class to use. ACE has several, I've choosen one - that uses a memory-mapped file. The second parameter is a lock - class of some sort. This is needed so that the ACE_Malloc<> can - protect its internal data. Note that you still have to - provide your own mutex around the data you put into the - malloc'd area. - -<P> - * Actually, some implementations may require a different - number of parameters. - That's why ACE uses those funky macros. ACE_MMAP_MEMORY_POOL - for instance turns into ACE_MMAP_Memory_Pool on Linux but may - do other things on your platform. -<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/021/page05.html b/docs/tutorials/021/page05.html deleted file mode 100644 index c72b87ac570..00000000000 --- a/docs/tutorials/021/page05.html +++ /dev/null @@ -1,88 +0,0 @@ -<!-- $Id$ --> -<HTML> -<HEAD> - <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"> - <META NAME="Author" CONTENT="James CE Johnson"> - <TITLE>ACE Tutorial 021</TITLE> -</HEAD> -<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#000FFF" VLINK="#FF0F0F"> - -<CENTER><B><FONT SIZE=+2>ACE Tutorial 021</FONT></B></CENTER> - -<CENTER><B><FONT SIZE=+2>Pooling your memories</FONT></B></CENTER> - -<P> -<HR WIDTH="100%"> -And here we have the implementation of the Allocator... -<hr> -<PRE> - -<font color=red>// $Id$</font> - -<font color=blue>#include</font> "<font color=green>mpool.h</font>" - -<font color=blue>#if !defined</font> (<font color=purple>ACE_LACKS_SYSV_SHMEM</font>) - -<font color=red>/* - Set the values of all of the constants. This guarantees that client - and server don't get confused. - */</font> -const int <font color=#008888>Constants::SEM_KEY_1</font> = ACE_DEFAULT_SEM_KEY + 1; -const int <font color=#008888>Constants::SEM_KEY_2</font> = ACE_DEFAULT_SEM_KEY + 2; - -const int <font color=#008888>Constants::SHMSZ</font> = 27; -const char * <font color=#008888>Constants::SHMDATA</font> = "<font color=green>abcdefghijklmnopqrstuvwxyz</font>"; - -const char * <font color=#008888>Constants::PoolName</font> = "<font color=green>SharedMemoryPool</font>"; -const char * <font color=#008888>Constants::RegionName</font> = "<font color=green>Alphabet</font>"; - -<font color=red>/* - We have to create a copy of the _name parameter in case the caller - has dynamically allocated it. The pool_ is set to NULL & will be - allocated by the accessor. - */</font> -<font color=#008888>Allocator::Allocator</font> (const char *_name) - : name_ (<font color=#008888>ACE_OS::strdup</font> (_name)), - pool_ (0) -{ - if (name_ == 0) - ACE_ERROR ((LM_ERROR, "<font color=green>(%P) %p</font>", - "<font color=green><font color=#008888>Allocator::Allocator</font> cannot strdup pool name</font>")); -} - -<font color=#008888>Allocator::~Allocator</font> (void) -{ - <font color=red>/* - strdup() uses malloc(), so we must use free() to clean up. - */</font> - if (name_) - <font color=#008888>ACE_OS::free</font> (name_); - - <font color=red>// delete doesn't really care if you give it a NULL pointer.</font> - delete pool_; -} - -<font color=red>/* - Allocate the pool. Since we return a reference, we'll be in really - bad shape if the new fails. This is a great place to throw an - exception! - The other concern is thread safety. If two threads call here at - about the same time, we may create the pool twice. We can't use a - Singleton because we want to have multiple Allocator instances. The - Singleton techniques can be used though. - */</font> - -<font color=#008888>Allocator::pool_t</font> & -<font color=#008888>Allocator::pool</font> (void) -{ - if (pool_ == 0) - pool_ = new pool_t (name_); - - return *pool_; -} - -<font color=blue>#endif</font> <font color=red>/* ACE_LACKS_SYSV_SHMEM */</font> -</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/021/page06.html b/docs/tutorials/021/page06.html deleted file mode 100644 index 6fef55a7bbf..00000000000 --- a/docs/tutorials/021/page06.html +++ /dev/null @@ -1,34 +0,0 @@ -<!-- $Id$ --> -<HTML> -<HEAD> - <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"> - <META NAME="Author" CONTENT="James CE Johnson"> - <TITLE>ACE Tutorial 021</TITLE> -</HEAD> -<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#000FFF" VLINK="#FF0F0F"> - -<CENTER><B><FONT SIZE=+2>ACE Tutorial 021</FONT></B></CENTER> - -<CENTER><B><FONT SIZE=+2>Pooling your memories</FONT></B></CENTER> - -<P> -<HR WIDTH="100%"> - As you can see, using a memory pool is really rather easy. The - most difficult part, as always, is with the synch mechanisms. - <P> - The other nice thing about ACE_Malloc<> is that you can swap - between System V shared memory and memory mapped files just by - changing the template parameters. The truly adventurous will - likely find a runtime way of doing this. - <p> - - <ul> - <li><A HREF="Makefile">Makefile</A> - <li><A HREF="server.cpp">server.cpp</A> - <li><A HREF="client.cpp">client.cpp</A> - <li><A HREF="mpool.h">mpool.h</A> - <li><A HREF="mpool.cpp">mpool.cpp</A> - </ul> -<P><HR WIDTH="100%"> -<CENTER>[<A HREF="../online-tutorials.html">Tutorial Index</A>] </CENTER> - diff --git a/docs/tutorials/021/server.cpp b/docs/tutorials/021/server.cpp deleted file mode 100644 index 78e9e161171..00000000000 --- a/docs/tutorials/021/server.cpp +++ /dev/null @@ -1,158 +0,0 @@ - -// $Id$ - -/* - I've hidden the details in an Allocator class declared in mpool.h - We'll come to that a little later. -*/ -#include "mpool.h" - -#if defined(ACE_LACKS_SYSV_SHMEM) -int -main (int, char *[]) -{ - ACE_ERROR_RETURN ((LM_ERROR, - "System V Semaphores not available on this platform.\n"),100); -} -#else // ACE_LACKS_SYSV_SHMEM -int -main (int, char *[]) -{ - /* - Construction of an Allocator will create the memory pool and - provide it with a name. The Constants class is also - declared in mpool.h to keep server and client on the same - page. The name is used to generate a unique semaphore which - prevents simultaneous access to the pools housekeeping - information. (Note that you still have to provide your own - synch mechanisms for the data *you* put in the poo.) - */ - Allocator allocator (Constants::PoolName); - - /* - The Allocator class provides the pool() member so that you - have access to the actual memory pool. A more robust - implementation would behave more as a bridge class but this - is good enough for what we're doing here. - Once you have a reference to the pool, the malloc() method - can be used to get some bytes. If successful, shm will - point to the data. Otherwise, it will be zero. - */ - char *shm = (char *) allocator.pool ().malloc (27); - - ACE_ASSERT (shm != 0); - - /// FYI - ACE_DEBUG ((LM_INFO, - "Shared memory is at 0x%x\n", - shm)); - - /* - Something that we can do with a memory pool is map a name to - a region provided by malloc. By doing this, we can - communicate that name to the client as a rendezvous - location. Again, a member of Constants is used to keep the - client and server coordinated. - */ - if (allocator.pool ().bind(Constants::RegionName,shm) == -1) - ACE_ERROR_RETURN ((LM_ERROR, - "Cannot bind the name '%s' to the pointer 0x%x\n", - Constants::RegionName, - shm), - 100); - - /* - One of the best ways to synch between different processes is - through the use of semaphores. ACE_SV_Semaphore_Complex - hides the gory details and lets us use them rather easily. - - Here, we'll create two semaphores: mutex and synch. mutex - will be used to provide mutually exclusive access to the - shared region for writting/reading. synch will be used to - prevent the server from removing the memory pool before the - client is done with it. - - Both semaphores are created in an initially locked state. - */ - - ACE_SV_Semaphore_Complex mutex; - ACE_ASSERT (mutex.open (Constants::SEM_KEY_1, - ACE_SV_Semaphore_Complex::ACE_CREATE, - 0) != -1); - - ACE_SV_Semaphore_Complex synch; - ACE_ASSERT (synch.open (Constants::SEM_KEY_2, - ACE_SV_Semaphore_Complex::ACE_CREATE, - 0) != -1); - - /* - We know the mutex is locked because we created it that way. - Take a moment to write some data into the shared region. - */ - for (int i = 0; i < Constants::SHMSZ; i++) - shm[i] = Constants::SHMDATA[i]; - - /* - The client will be blocking on an acquire() of mutex. By - releasing it here, the client can go look at the shared data. - */ - if (mutex.release () == -1) - ACE_ERROR ((LM_ERROR, - "(%P) %p", - "server mutex.release")); - /* - Even though we created the synch semaphore in a locked - state, if we attempt to acquire() it, we will block. Our - design requires that the client release() synch when it is - OK for us to remove the shared memory. - */ - else if (synch.acquire () == -1) - ACE_ERROR ((LM_ERROR, - "(%P) %p", - "server synch.acquire")); - /* - This will remove all of the memory pool's resources. In the - case where a memory mapped file is used, the physical file - will also be removed. - */ - if (allocator.pool ().remove () == -1) - ACE_ERROR ((LM_ERROR, - "(%P) %p\n", - "server allocator.remove")); - /* - We now have to cleanup the semaphores we created. Use the - ipcs command to see that they did, indeed, go away after the - server exits. - */ - - if (mutex.remove () == -1) - ACE_ERROR ((LM_ERROR, - "(%P) %p\n", - "server mutex.remove")); - else if (synch.remove () == -1) - ACE_ERROR ((LM_ERROR, - "(%P) %p\n", - "server synch.remove")); - return 0; -} - -/* - This tutorial was created by shamelessly modifying one of the ACE - examples. Someone there had already created the necessary explicit - template instantiations & I don't want them to go to waste... - */ -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -template class ACE_Malloc<ACE_MMAP_MEMORY_POOL, ACE_SV_Semaphore_Simple>; -template class ACE_Malloc_T<ACE_MMAP_MEMORY_POOL, ACE_SV_Semaphore_Simple, ACE_Control_Block>; -template class ACE_Guard<ACE_SV_Semaphore_Simple>; -template class ACE_Write_Guard<ACE_SV_Semaphore_Simple>; -template class ACE_Read_Guard<ACE_SV_Semaphore_Simple>; -#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) -#pragma instantiate ACE_Malloc<ACE_MMAP_MEMORY_POOL, ACE_SV_Semaphore_Simple> -#pragma instantiate ACE_Malloc_T<ACE_MMAP_MEMORY_POOL, ACE_SV_Semaphore_Simple, ACE_Control_Block> -#pragma instantiate ACE_Guard<ACE_SV_Semaphore_Simple> -#pragma instantiate ACE_Write_Guard<ACE_SV_Semaphore_Simple> -#pragma instantiate ACE_Read_Guard<ACE_SV_Semaphore_Simple> -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ - -#endif /* ACE_LACKS_SYSV_SHMEM */ |