summaryrefslogtreecommitdiff
path: root/shmem/unix/mm/mm.pod
diff options
context:
space:
mode:
Diffstat (limited to 'shmem/unix/mm/mm.pod')
-rw-r--r--shmem/unix/mm/mm.pod633
1 files changed, 0 insertions, 633 deletions
diff --git a/shmem/unix/mm/mm.pod b/shmem/unix/mm/mm.pod
deleted file mode 100644
index b98fcfa04..000000000
--- a/shmem/unix/mm/mm.pod
+++ /dev/null
@@ -1,633 +0,0 @@
-## ====================================================================
-## Copyright (c) 1999 Ralf S. Engelschall. All rights reserved.
-##
-## Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions
-## are met:
-##
-## 1. Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-##
-## 2. Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-##
-## 3. All advertising materials mentioning features or use of this
-## software must display the following acknowledgment:
-## "This product includes software developed by
-## Ralf S. Engelschall <rse@engelschall.com>."
-##
-## 4. Redistributions of any form whatsoever must retain the following
-## acknowledgment:
-## "This product includes software developed by
-## Ralf S. Engelschall <rse@engelschall.com>."
-##
-## THIS SOFTWARE IS PROVIDED BY RALF S. ENGELSCHALL ``AS IS'' AND ANY
-## EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-## PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RALF S. ENGELSCHALL OR
-## ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-## NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-## HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-## STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-## ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
-## OF THE POSSIBILITY OF SUCH DAMAGE.
-## ====================================================================
-
-##
-## mm.pod -- Manpage
-##
-
-=pod
-
-=head1 NAME
-
-B<MM - Shared Memory Library>
-
-=head1 VERSION
-
-MM MM_VERSION_STR
-
-=head1 SYNOPSIS
-
- #include "mm.h"
-
-B< Global Malloc-Replacement API>
-
- int MM_create(size_t size, const char *file);
- int MM_permission(mode_t mode, uid_t owner, gid_t group);
- void MM_destroy(void);
- int MM_lock(mm_lock_mode mode);
- int MM_unlock(void);
- void *MM_malloc(size_t size);
- void *MM_realloc(void *ptr, size_t size);
- void MM_free(void *ptr);
- void *MM_calloc(size_t number, size_t size);
- char *MM_strdup(const char *str);
- size_t MM_sizeof(void *ptr);
- size_t MM_maxsize(void);
- size_t MM_available(void);
- char *MM_error(void);
-
-B< Standard Malloc-Style API>
-
- MM *mm_create(size_t size, char *file);
- int mm_permission(MM *mm, mode_t mode, uid_t owner, gid_t group);
- void mm_destroy(MM *mm);
- int mm_lock(MM *mm, mm_lock_mode mode);
- int mm_unlock(MM *mm);
- void *mm_malloc(MM *mm, size_t size);
- void *mm_realloc(MM *mm, void *ptr, size_t size);
- void mm_free(MM *mm, void *ptr);
- void *mm_calloc(MM *mm, size_t number, size_t size);
- char *mm_strdup(MM *mm, const char *str);
- size_t mm_sizeof(void *ptr);
- size_t mm_maxsize(void);
- size_t mm_available(MM *mm);
- char *mm_error(void);
- void mm_display_info(MM *mm);
-
-B< Low-level Shared Memory API>
-
- void *mm_core_create(size_t size, char *file);
- int mm_core_permission(void *core, mode_t mode, uid_t owner, gid_t group);
- void mm_core_delete(void *core);
- int mm_core_lock(void *core, mm_lock_mode mode);
- int mm_core_unlock(void *core);
- size_t mm_core_size(void *core);
- size_t mm_core_maxsegsize(void);
- size_t mm_core_align2page(size_t size);
- size_t mm_core_align2click(size_t size);
-
-B< Internal Library API>
-
- void mm_lib_error_set(unsigned int, const char *str);
- char *mm_lib_error_get(void);
- int mm_lib_version(void);
-
-=head1 DESCRIPTION
-
-The B<MM> library is a 2-layer abstraction library which simplifies the usage
-of shared memory between forked (and this way strongly related) processes
-under Unix platforms. On the first (lower) layer it hides all platform
-dependent implementation details (allocation and locking) when dealing with
-shared memory segments and on the second (higher) layer it provides a
-high-level malloc(3)-style API for a convenient and well known way to work
-with data-structures inside those shared memory segments.
-
-The abbreviation B<MM> is historically and originally comes from the phrase
-``I<memory mapped>'' as used by the POSIX.1 mmap(2) function. Because this
-facility is internally used by this library on most platforms to create the
-shared memory segments.
-
-=head2 LIBRARY STRUCTURE
-
-This library is structured into three main APIs which are internally based on
-each other:
-
-=over 4
-
-=item B<Global Malloc-Replacement API>
-
-This is the most high-level API which directly can be used as replacement API
-for the POSIX.1 memory allocation API (malloc(2) and friends). This is
-useful when converting I<heap> based data structures to I<shared memory>
-based data structures without the need to change the code dramatically. All
-which is needed is to prefix the POSIX.1 memory allocation functions with
-C<MM_>, i.e. C<malloc> becomes C<MM_malloc>, C<strdup> becomes C<MM_strdup>,
-etc. This API internally uses just a global C<MM*> pool for calling the
-corresponding functions (with prefix C<mm_>) of the I<Standard Malloc-Style
-API>.
-
-=item B<Standard Malloc-Style API>
-
-This is the standard high-level memory allocation API. It's interface is
-similar to the I<Global Malloc-Replacement API> but it uses an explicit C<MM*>
-pool to operate on. That's why every function of this API has an argument of
-type C<MM*> as the first argument. This API provides a comfortable way to
-work with small dynamically allocated shared memory chunks inside large
-statically allocated shared memory segments. It's internally based on the
-I<Low-Level Shared Memory API> for creating the underlaying shared memory
-segment.
-
-=item B<Low-Level Shared Memory API>
-
-This is the basis of the whole B<MM> library. It provides low-level functions
-for creating shared memory segments with mutual exclusion (in short: I<mutex>)
-capabilities in a portable way. Internally the shared memory and mutex
-facility is implemented in various platform-dependent ways. A list of
-implementation variants follows under the next topic.
-
-=back
-
-=head2 SHARED MEMORY IMPLEMENTATION
-
-Internally the shared memory facility is implemented in various
-platform-dependent variants. Each has it's own advantages and disadvantages
-(in addition to the fact that some variants aren't available at all on some
-platforms). The MM libraries configuration procedure tried hard to make a good
-decision. The implemented variants are now given for overview and background
-reasons with their advantages and disadvantages and in an ascending order,
-i.e. the MM configuration mechanism chooses the last available one in the list
-as the preferred variant.
-
-=over 4
-
-=item Classical mmap(2) on temporary file (MMFILE)
-
-I<Advantage:> maximum portable.
-I<Disadvantage:> needs a temporary file on the filesystem
-
-=item mmap(2) via POSIX.1 shm_open(3) on temporary file (MMPOSX)
-
-I<Advantage:> standardized by POSIX.1 and theoretically portable.
-I<Disadvantage:> needs a temporary file on the filesystem and is
-is usually not available on existing Unix platform.
-
-=item SVR4-style mmap(2) on C</dev/zero> device (MMZERO)
-
-I<Advantage:> widely available on mostly portable on SVR4 platforms.
-I<Disadvantage:> needs the C</dev/zero/> device and an mmap(2)
-which supports memory mapping through it.
-
-=item 4.4BSD-style mmap(2) via C<MAP_ANON> facility (MMANON)
-
-I<Advantage:> doesn't need a temporary file or external device
-I<Disadvantage:> usually only available on BSD platforms and derivatives.
-
-=item SysV IPC shmget(2) (IPCSHM)
-
-I<Advantage:> doesn't need a temporary file or external device
-I<Disadvantage:> although available on mostly all modern Unix platforms it has
-hard restrictions like the maximum size of a single shared memory segment (can
-be as small as 100KB, but depends on the platform).
-
-=back
-
-=head2 LOCKING IMPLEMENTATION
-
-As for the shared memory facility, internally the locking facility is
-implemented in various platform-dependent variants. A short overview of
-implemented variants is given:
-
-=over 4
-
-=item 4.2BSD-style flock(2) on temporary file (FLOCK)
-
-I<Advantage:> exists on a lot of platforms, especially on older Unix
-derivates. I<Disadvantage:> needs a temporary file on the filesystem and has
-to reopen filedescriptors to it in each(!) fork(2)ed child process.
-
-=item SysV IPC semget(2) (IPCSEM)
-
-I<Advantage:> exists on a lot of platforms and doesn't need a temporary file.
-I<Disadvantage:> an unmeant termination of the application leads to a
-semaphore leak because the facility doesn't allow an "remove in advance" trick
-(as the IPC shared memory facility does!) for safe cleanups.
-
-=item SVR4-style fcntl(2) on temporary file (FCNTL)
-
-I<Advantage:> exists on a lot of platforms and is also the most powerful
-variant (although not always the fastest one). I<Disadvantage:> needs a
-temporary file.
-
-=back
-
-=head2 MEMORY ALLOCATION STRATEGY
-
-The memory allocation strategy the I<Standard Malloc-Style API> functions use
-internally is the following:
-
-=over 4
-
-=item B<Allocation>
-
-When a chunk of memory has to be allocated, the internal list of free chunks
-is searched for a minimal-sized chunk which is larger or equal than the size
-of the to be allocated chunk (some sort of a I<best fit algorithm>).
-
-When a chunk is found which matches this best-fit criteria, but is still a lot
-larger than the requested size, it is split into two chunks: One with exactly
-the requested size (which is the resulting chunk) and one with the remaining
-size (which is immediately re-inserted into the list of free chunks).
-
-When no fitting chunk is found at all in the list of free chunks, a new one is
-created from the spare area of the shared memory segment until the segment is
-full (in which case an I<out of memory> error occurs).
-
-=item B<Deallocation>
-
-When a chunk of memory has to be deallocated, it is inserted in sorted manner
-into the internal list of free chunks. The insertion operation automatically
-merges the chunk with a previous and/or next free chunk when possible, i.e.
-the free chunks stay physically seamless (one after another) in memory, to
-automatically form larger free chunks out of smaller ones.
-
-This way the shared memory segment is automatically defragmented when memory
-is deallocated.
-
-=back
-
-This strategy reduces memory waste and fragmentation caused by small and
-frequent allocations and deallocations to a minimum.
-
-The internal implementation of the list of free chunks is not specially
-optimized (for instance by using binary search trees or even splay trees,
-etc.), because it's assumed that the total amount of entries in the list of
-free chunks is always small (caused both by the fact that shared memory
-segments are usually a lot smaller than heaps and the fact that we always
-defragment by merging the free chunks when possible).
-
-=head1 API FUNCTIONS
-
-In the following all API functions are described in detail.
-The order directly follows the one in the SYNOPSIS.
-
-=head2 Global Malloc-Replacement API
-
-=over 4
-
-=item int B<MM_create>(size_t I<size>, const char *I<file>);
-
-This initialized the global shared memory pool with I<size> and I<file> and
-has be called I<before> any fork(2) operations are performed by the
-application.
-
-=item int B<MM_permission>(mode_t I<mode>, uid_t I<owner>, gid_t I<group>);
-
-This sets the filesystem I<mode>, I<owner> and I<group> for the global shared
-memory pool (has effects only when the underlaying shared memory segment
-implementation is actually based on external auxiliary files). The arguments
-are directly passed through to chmod(2) and chown(2).
-
-=item void B<MM_destroy>(void);
-
-This destroys the global shared memory pool and should be called I<after> all
-child processes were killed.
-
-=item int B<MM_lock>(mm_lock_mode I<mode>);
-
-This locks the global shared memory pool for the current process in order to
-perform either shared/read-only (I<mode> is C<MM_LOCK_RD>) or
-exclusive/read-write (I<mode> is C<MM_LOCK_RW>) operations inside the global
-shared memory pool.
-
-=item int B<MM_unlock>(void);
-
-This unlocks the global shared memory pool for the current process after
-mutual exclusion operations were performed inside the global shared memory
-pool.
-
-=item void *B<MM_malloc>(size_t I<size>);
-
-Identical to the POSIX.1 malloc(3) function but instead of allocating
-memory from the I<heap> it allocates it from the global shared memory pool.
-
-=item void B<MM_free>(void *I<ptr>);
-
-Identical to the POSIX.1 free(3) function but instead of deallocating
-memory in the I<heap> it deallocates it in the global shared memory pool.
-
-=item void *B<MM_realloc>(void *I<ptr>, size_t I<size>);
-
-Identical to the POSIX.1 realloc(3) function but instead of reallocating
-memory in the I<heap> it reallocates it inside the global shared memory pool.
-
-=item void *B<MM_calloc>(size_t I<number>, size_t I<size>);
-
-Identical to the POSIX.1 calloc(3) function but instead of allocating and
-initializing memory from the I<heap> it allocates and initializes it from the
-global shared memory pool.
-
-=item char *B<MM_strdup>(const char *I<str>);
-
-Identical to the POSIX.1 strdup(3) function but instead of creating the
-string copy in the I<heap> it creates it in the global shared memory pool.
-
-=item size_t B<MM_sizeof>(const void *I<ptr>);
-
-This function returns the size in bytes of the chunk starting at I<ptr> when
-I<ptr> was previously allocated with MM_malloc(3). The result is undefined
-when I<ptr> was not previously allocated with MM_malloc(3).
-
-=item size_t B<MM_maxsize>(void);
-
-This function returns the maximum size which is allowed
-as the first argument to the MM_create(3) function.
-
-=item size_t B<MM_available>(void);
-
-Returns the amount in bytes of still available (free) memory in the global
-shared memory pool.
-
-=item char *B<MM_error>(void);
-
-Returns the last error message which occurred inside the B<MM> library.
-
-=back
-
-=head2 Standard Malloc-Style API
-
-=over 4
-
-=item MM *B<mm_create>(size_t I<size>, const char *I<file>);
-
-This creates a shared memory pool which has space for approximately a total of
-I<size> bytes with the help of I<file>. Here I<file> is a filesystem path to a
-file which need not to exist (and perhaps is never created because this
-depends on the platform and chosen shared memory and mutex implementation).
-The return value is a pointer to an C<MM> structure which should be treated as
-opaque by the application. It describes the internals of the created shared
-memory pool. In case of an error C<NULL> is returned. A I<size> of 0 means to
-allocate the maximum allowed size which is platform dependent and between a
-few KB and the soft limit of 64MB.
-
-=item int B<mm_permission>(MM *I<mm>, mode_t I<mode>, uid_t I<owner>, gid_t I<group>);
-
-This sets the filesystem I<mode>, I<owner> and I<group> for the shared memory
-pool I<mm> (has effects only when the underlaying shared memory segment
-implementation is actually based on external auxiliary files). The arguments
-are directly passed through to chmod(2) and chown(2).
-
-=item void B<mm_destroy>(MM *I<mm>);
-
-This destroys the complete shared memory pool I<mm> and with it all chunks
-which were allocated in this pool. Additionally any created files on the
-filesystem corresponding the to shared memory pool are unlinked.
-
-=item int B<mm_lock>(MM *I<mm>, mm_lock_mode I<mode>);
-
-This locks the shared memory pool I<mm> for the current process in order to
-perform either shared/read-only (I<mode> is C<MM_LOCK_RD>) or
-exclusive/read-write (I<mode> is C<MM_LOCK_RW>) operations inside the global
-shared memory pool.
-
-=item int B<MM_unlock>(MM *I<mm>);
-
-This unlocks the shared memory pool I<mm> for the current process after mutual
-exclusion operations were performed inside the global shared memory pool.
-
-=item void *B<mm_malloc>(MM *I<mm>, size_t I<size>);
-
-This function allocates I<size> bytes from the shared memory pool I<mm> and
-returns either a (virtual memory word aligned) pointer to it or C<NULL> in
-case of an error (out of memory). It behaves like the POSIX.1 malloc(3)
-function but instead of allocating memory from the I<heap> it allocates it
-from the shared memory segment underlaying I<mm>.
-
-=item void B<mm_free>(MM *I<mm>, void *I<ptr>);
-
-This deallocates the chunk starting at I<ptr> in the shared memory pool I<mm>.
-It behaves like the POSIX.1 free(3) function but instead of deallocating
-memory from the I<heap> it deallocates it from the shared memory segment
-underlaying I<mm>.
-
-=item void *B<mm_realloc>(MM *I<mm>, void *I<ptr>, size_t I<size>);
-
-This function reallocates the chunk starting at I<ptr> inside the shared
-memory pool I<mm> with the new size of I<size> bytes. It behaves like the
-POSIX.1 realloc(3) function but instead of reallocating memory in the
-I<heap> it reallocates it in the shared memory segment underlaying I<mm>.
-
-=item void *B<mm_calloc>(MM *I<mm>, size_t I<number>, size_t I<size>);
-
-This is similar to mm_malloc(3), but additionally clears the chunk. It behaves
-like the POSIX.1 calloc(3) function. It allocates space for I<number>
-objects, each I<size> bytes in length from the shared memory pool I<mm>. The
-result is identical to calling mm_malloc(3) with an argument of ``I<number> *
-I<size>'', with the exception that the allocated memory is initialized to nul
-bytes.
-
-=item char *B<mm_strdup>(MM *I<mm>, const char *I<str>);
-
-This function behaves like the POSIX.1 strdup(3) function. It allocates
-sufficient memory inside the shared memory pool I<mm> for a copy of the string
-I<str>, does the copy, and returns a pointer to it. The pointer may
-subsequently be used as an argument to the function mm_free(3). If
-insufficient shared memory is available, C<NULL> is returned.
-
-=item size_t B<mm_sizeof>(const void *I<ptr>);
-
-This function returns the size in bytes of the chunk starting at I<ptr> when
-I<ptr> was previously allocated with mm_malloc(3). The result is undefined
-when I<ptr> was not previously allocated with mm_malloc(3).
-
-=item size_t B<mm_maxsize>(void);
-
-This function returns the maximum size which is allowed as the first argument
-to the mm_create(3) function.
-
-=item size_t B<mm_available>(MM *I<mm>);
-
-Returns the amount in bytes of still available (free) memory in the
-shared memory pool I<mm>.
-
-=item char *B<mm_error>(void);
-
-Returns the last error message which occurred inside the B<MM> library.
-
-=item void B<mm_display_info>(MM *I<mm>);
-
-This is debugging function which displays a summary page for the shared memory
-pool I<mm> describing various internal sizes and counters.
-
-=back
-
-=head2 Low-Level Shared Memory API
-
-=over 4
-
-=item void *B<mm_core_create>(size_t I<size>, const char *I<file>);
-
-This creates a shared memory area which is at least I<size> bytes in size with
-the help of I<file>. The value I<size> has to be greater than 0 and less or
-equal the value returned by mm_core_maxsegsize(3). Here I<file> is a
-filesystem path to a file which need not to exist (and perhaps is never
-created because this depends on the platform and chosen shared memory and
-mutex implementation). The return value is either a (virtual memory word
-aligned) pointer to the shared memory segment or C<NULL> in case of an error.
-The application is guaranteed to be able to access the shared memory segment
-from byte 0 to byte I<size>-1 starting at the returned address.
-
-=item int B<mm_core_permission>(void *I<core>, mode_t I<mode>, uid_t I<owner>, gid_t I<group>);
-
-This sets the filesystem I<mode>, I<owner> and I<group> for the shared memory
-segment I<code> (has effects only when the underlaying shared memory segment
-implementation is actually based on external auxiliary files). The arguments
-are directly passed through to chmod(2) and chown(2).
-
-=item void B<mm_core_delete>(void *I<core>);
-
-This deletes a shared memory segment I<core> (as previously returned by a
-mm_core_create(3) call). After this operation, accessing the segment starting
-at I<core> is no longer allowed and will usually lead to a segmentation fault.
-
-=item int B<mm_core_lock>(const void *I<core>, mm_lock_mode I<mode>);
-
-This function acquires an advisory lock for the current process on the shared
-memory segment I<core> for either shared/read-only (I<mode> is C<MM_LOCK_RD>)
-or exclusive/read-write (I<mode> is C<MM_LOCK_RW>) operations between
-fork(2)'ed child processes.
-
-=item int B<mm_core_unlock>(const void *I<core>);
-
-This function releases a previously acquired advisory lock for the current
-process on the shared memory segment I<core>.
-
-=item size_t B<mm_core_size>(const void *I<core>);
-
-This returns the size in bytes of I<core>. This size is exactly the size which
-was used for creating the shared memory area via mm_core_create(3). The
-function is provided just for convenience reasons to not require the
-application to remember the memory size behind I<core> itself.
-
-=item size_t B<mm_core_maxsegsize>(void);
-
-This returns the number of bytes of a maximum-size shared memory segment which
-is allowed to allocate via the MM library. It is between a few KB and the soft
-limit of 64MB.
-
-=item size_t B<mm_core_align2page>(size_t I<size>);
-
-This is just a utility function which can be used to align the number I<size>
-to the next virtual memory I<page> boundary used by the underlaying platform.
-The memory page boundary under Unix platforms is usually somewhere between
-2048 and 16384 bytes. You don't have to align the I<size> arguments of other
-B<MM> library functions yourself, because this is already done internally.
-This function is exported by the B<MM> library just for convenience reasons in
-case an application wants to perform simular calculations for other purposes.
-
-=item size_t B<mm_core_align2word>(size_t I<size>);
-
-This is another utility function which can be used to align the number I<size>
-to the next virtual memory I<word> boundary used by the underlaying platform.
-The memory word boundary under Unix platforms is usually somewhere between 4
-and 16 bytes. You don't have to align the I<size> arguments of other B<MM>
-library functions yourself, because this is already done internally. This
-function is exported by the B<MM> library just for convenience reasons in case
-an application wants to perform simular calculations for other purposes.
-
-=back
-
-=head2 Low-Level Shared Memory API
-
-=over 4
-
-=item void B<mm_lib_error_set>(unsigned int, const char *str);
-
-This is a function which is used internally by the various MM function to set
-an error string. It's usually not called directly from applications.
-
-=item char *B<mm_lib_error_get>(void);
-
-This is a function which is used internally by MM_error(3) and mm_error(3)
-functions to get the current error string. It's usually not called directly
-from applications.
-
-=item int B<mm_lib_version>(void);
-
-This function returns a hex-value ``0xI<V>I<RR>I<T>I<LL>'' which describes the
-current MM library version. I<V> is the version, I<RR> the revisions, I<LL>
-the level and I<T> the type of the level (alphalevel=0, betalevel=1,
-patchlevel=2, etc). For instance MM version 1.0.4 is encoded as 0x100204. The
-reason for this unusual mapping is that this way the version number is
-steadily I<increasing>.
-
-=back
-
-=head1 RESTRICTIONS
-
-The maximum size of a continuous shared memory segment one can allocate
-depends on the underlaying platform. This cannot be changed, of course. But
-currently the high-level malloc(3)-style API just uses a single shared memory
-segment as the underlaying data structure for an C<MM> object which means that
-the maximum amount of memory a C<MM> object represents also depends on the
-platform.
-
-This should be changed in later versions by allowing the high-level
-malloc(3)-style API to internally use multiple shared memory segments to form
-the C<MM> object. This way C<MM> objects could have arbitrary sizes, although
-the maximum size of an allocatable chunk still is bounded by the maximum size
-of a shared memory segment.
-
-=head1 SEE ALSO
-
-mm-config(1).
-
-malloc(3), calloc(3), realloc(3), strdup(3), free(3), mmap(2), shmget(2),
-shmctl(2), flock(2), fcntl(2), semget(2), semctl(2), semop(2).
-
-=head1 HOME
-
-=for html
-<a href="http://www.engelschall.com/sw/mm/">http://www.engelschall.com/sw/mm/</a>
-
-=for text
-http://www.engelschall.com/sw/mm/
-
-=for man
-http://www.engelschall.com/sw/mm/
-
-=head1 HISTORY
-
-This library was originally written in January 1999 by I<Ralf S. Engelschall>
-<rse@engelschall.com> for use in the B<Extended API> (EAPI) of the B<Apache>
-HTTP server project (see www.apache.org), which was originally invented for
-B<mod_ssl> (see http://www.modssl.org/).
-
-It's base idea (a malloc-style API for handling shared memory) was originally
-derived from the non-publically available I<mm_malloc> library written in
-October 1997 by I<Charles Randall> <crandall@matchlogic.com> for MatchLogic,
-Inc.
-
-=head1 AUTHOR
-
- Ralf S. Engelschall
- rse@engelschall.com
- www.engelschall.com
-
-=cut
-