| /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ | 
 | /* This Source Code Form is subject to the terms of the Mozilla Public | 
 |  * License, v. 2.0. If a copy of the MPL was not distributed with this | 
 |  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 
 |  | 
 | /* | 
 | ** prshm.h -- NSPR Shared Memory | 
 | ** | 
 | ** NSPR Named Shared Memory API provides a cross-platform named | 
 | ** shared-memory interface. NSPR Named Shared Memory is modeled on | 
 | ** similar constructs in Unix and Windows operating systems. Shared | 
 | ** memory allows multiple processes to access one or more common shared | 
 | ** memory regions, using it as an inter-process communication channel. | 
 | ** | 
 | ** Notes on Platform Independence: | 
 | **   NSPR Named Shared Memory is built on the native services offered | 
 | **   by most platforms. The NSPR Named Shared Memory API tries to | 
 | **   provide a least common denominator interface so that it works | 
 | **   across all supported platforms. To ensure that it works everywhere, | 
 | **   some platform considerations must be accomodated and the protocol | 
 | **   for using NSPR Shared Memory API must be observed. | 
 | ** | 
 | ** Protocol: | 
 | **   Multiple shared memories can be created using NSPR's Shared Memory | 
 | **   feature. For each named shared memory, as defined by the name | 
 | **   given in the PR_OpenSharedMemory() call, a protocol for using the | 
 | **   shared memory API is required to ensure desired behavior. Failing | 
 | **   to follow the protocol may yield unpredictable results. | 
 | **    | 
 | **   PR_OpenSharedMemory() will create the shared memory segment, if it | 
 | **   does not already exist, or open a connection that the existing | 
 | **   shared memory segment if it already exists. | 
 | **    | 
 | **   PR_AttachSharedMemory() should be called following | 
 | **   PR_OpenSharedMemory() to map the memory segment to an address in | 
 | **   the application's address space. | 
 | **    | 
 | **   PR_AttachSharedMemory() may be called to re-map a shared memory | 
 | **   segment after detaching the same PRSharedMemory object. Be | 
 | **   sure to detach it when done. | 
 | **    | 
 | **   PR_DetachSharedMemory() should be called to un-map the shared | 
 | **   memory segment from the application's address space. | 
 | **    | 
 | **   PR_CloseSharedMemory() should be called when no further use of the | 
 | **   PRSharedMemory object is required within a process. Following a | 
 | **   call to  PR_CloseSharedMemory() the PRSharedMemory object is | 
 | **   invalid and cannot be reused. | 
 | **    | 
 | **   PR_DeleteSharedMemory() should be called before process | 
 | **   termination. After calling PR_DeleteSharedMemory() any further use | 
 | **   of the shared memory associated with the name may cause | 
 | **   unpredictable results. | 
 | **    | 
 | ** Files: | 
 | **   The name passed to PR_OpenSharedMemory() should be a valid filename | 
 | **   for a unix platform. PR_OpenSharedMemory() creates file using the | 
 | **   name passed in. Some platforms may mangle the name before creating | 
 | **   the file and the shared memory. | 
 | **    | 
 | **   The unix implementation may use SysV IPC shared memory, Posix | 
 | **   shared memory, or memory mapped files; the filename may used to | 
 | **   define the namespace. On Windows, the name is significant, but | 
 | **   there is no file associated with name. | 
 | **    | 
 | **   No assumptions about the persistence of data in the named file | 
 | **   should be made. Depending on platform, the shared memory may be | 
 | **   mapped onto system paging space and be discarded at process | 
 | **   termination. | 
 | **    | 
 | **   All names provided to PR_OpenSharedMemory() should be valid | 
 | **   filename syntax or name syntax for shared memory for the target | 
 | **   platform. Referenced directories should have permissions  | 
 | **   appropriate for writing. | 
 | ** | 
 | ** Limits: | 
 | **   Different platforms have limits on both the number and size of | 
 | **   shared memory resources. The default system limits on some | 
 | **   platforms may be smaller than your requirements. These limits may | 
 | **   be adjusted on some platforms either via boot-time options or by | 
 | **   setting the size of the system paging space to accomodate more | 
 | **   and/or larger shared memory segment(s). | 
 | ** | 
 | ** Security: | 
 | **   On unix platforms, depending on implementation, contents of the | 
 | **   backing store for the shared memory can be exposed via the file | 
 | **   system. Set permissions and or access controls at create and attach | 
 | **   time to ensure you get the desired security. | 
 | ** | 
 | **   On windows platforms, no special security measures are provided. | 
 | ** | 
 | ** Example: | 
 | **   The test case pr/tests/nameshm1.c provides an example of use as | 
 | **   well as testing the operation of NSPR's Named Shared Memory. | 
 | ** | 
 | ** lth. 18-Aug-1999. | 
 | */ | 
 |  | 
 | #ifndef prshm_h___ | 
 | #define prshm_h___ | 
 |  | 
 | #include "prtypes.h" | 
 | #include "prio.h" | 
 |  | 
 | PR_BEGIN_EXTERN_C | 
 |  | 
 | /* | 
 | ** Declare opaque type PRSharedMemory. | 
 | */ | 
 | typedef struct PRSharedMemory PRSharedMemory; | 
 |  | 
 | /* | 
 | ** FUNCTION: PR_OpenSharedMemory() | 
 | ** | 
 | ** DESCRIPTION: | 
 | **   PR_OpenSharedMemory() creates a new shared-memory segment or | 
 | **   associates a previously created memory segment with name. | 
 | ** | 
 | **   When parameter create is (PR_SHM_EXCL | PR_SHM_CREATE) and the | 
 | **   shared memory already exists, the function returns NULL with the | 
 | **   error set to PR_FILE_EXISTS_ERROR. | 
 | ** | 
 | **   When parameter create is PR_SHM_CREATE and the shared memory | 
 | **   already exists, a handle to that memory segment is returned. If | 
 | **   the segment does not exist, it is created and a pointer to the | 
 | **   related PRSharedMemory structure is returned. | 
 | ** | 
 | **   When parameter create is 0, and the shared memory exists, a | 
 | **   pointer to a PRSharedMemory is returned. If the shared memory does | 
 | **   not exist, NULL is returned with the error set to | 
 | **   PR_FILE_NOT_FOUND_ERROR. | 
 | ** | 
 | ** INPUTS: | 
 | **   name -- the name the shared-memory segment is known as. | 
 | **   size -- the size of the shared memory segment.  | 
 | **   flags -- Options for creating the shared memory | 
 | **   mode -- Same as is passed to PR_Open() | 
 | ** | 
 | ** OUTPUTS:  | 
 | **   The shared memory is allocated. | 
 | ** | 
 | ** RETURNS: Pointer to opaque structure PRSharedMemory or NULL. | 
 | **   NULL is returned on error. The reason for the error can be | 
 | **   retrieved via PR_GetError() and PR_GetOSError(); | 
 | ** | 
 | */ | 
 | NSPR_API( PRSharedMemory * ) | 
 |     PR_OpenSharedMemory( | 
 |         const char *name, | 
 |         PRSize      size, | 
 |         PRIntn      flags, | 
 |         PRIntn      mode | 
 | ); | 
 | /* Define values for PR_OpenShareMemory(...,create) */ | 
 | #define PR_SHM_CREATE 0x1  /* create if not exist */ | 
 | #define PR_SHM_EXCL   0x2  /* fail if already exists */ | 
 |  | 
 | /* | 
 | ** FUNCTION: PR_AttachSharedMemory() | 
 | ** | 
 | ** DESCRIPTION: | 
 | ** PR_AttachSharedMemory() maps the shared-memory described by | 
 | ** shm to the current process.  | 
 | ** | 
 | ** INPUTS:  | 
 | **   shm -- The handle returned from PR_OpenSharedMemory(). | 
 | **   flags -- options for mapping the shared memory. | 
 | **   PR_SHM_READONLY causes the memory to be attached  | 
 | **   read-only. | 
 | ** | 
 | ** OUTPUTS: | 
 | **   On success, the shared memory segment represented by shm is mapped | 
 | **   into the process' address space. | 
 | ** | 
 | ** RETURNS: Address where shared memory is mapped, or NULL. | 
 | **   NULL is returned on error. The reason for the error can be | 
 | **   retrieved via PR_GetError() and PR_GetOSError(); | 
 | ** | 
 | ** | 
 | */ | 
 | NSPR_API( void * ) | 
 |     PR_AttachSharedMemory( | 
 |         PRSharedMemory *shm, | 
 |         PRIntn  flags | 
 | ); | 
 | /* Define values for PR_AttachSharedMemory(...,flags) */  | 
 | #define PR_SHM_READONLY 0x01 | 
 |  | 
 | /* | 
 | ** FUNCTION: PR_DetachSharedMemory() | 
 | ** | 
 | ** DESCRIPTION: | 
 | **   PR_DetachSharedMemory() detaches the shared-memory described | 
 | **   by shm.  | 
 | ** | 
 | ** INPUTS:  | 
 | **   shm -- The handle returned from PR_OpenSharedMemory(). | 
 | **   addr -- The address at which the memory was attached. | 
 | ** | 
 | ** OUTPUTS: | 
 | **   The shared memory mapped to an address via a previous call to | 
 | **   PR_AttachSharedMemory() is unmapped. | 
 | ** | 
 | ** RETURNS: PRStatus | 
 | ** | 
 | */ | 
 | NSPR_API( PRStatus ) | 
 |     PR_DetachSharedMemory( | 
 |         PRSharedMemory *shm, | 
 |         void  *addr | 
 | ); | 
 |  | 
 | /* | 
 | ** FUNCTION: PR_CloseSharedMemory() | 
 | ** | 
 | ** DESCRIPTION: | 
 | **   PR_CloseSharedMemory() closes the shared-memory described by | 
 | **   shm. | 
 | **  | 
 | ** INPUTS: | 
 | **   shm -- The handle returned from PR_OpenSharedMemory(). | 
 | ** | 
 | ** OUTPUTS: | 
 | **   the shared memory represented by shm is closed | 
 | ** | 
 | ** RETURNS: PRStatus | 
 | ** | 
 | */ | 
 | NSPR_API( PRStatus ) | 
 |     PR_CloseSharedMemory( | 
 |         PRSharedMemory *shm | 
 | ); | 
 |  | 
 | /* | 
 | ** FUNCTION: PR_DeleteSharedMemory() | 
 | ** | 
 | ** DESCRIPTION: | 
 | **   The shared memory resource represented by name is released. | 
 | ** | 
 | ** INPUTS: | 
 | **   name -- the name the shared-memory segment | 
 | ** | 
 | ** OUTPUTS: | 
 | **   depending on platform, resources may be returned to the underlying | 
 | **   operating system. | 
 | ** | 
 | ** RETURNS: PRStatus | 
 | ** | 
 | */ | 
 | NSPR_API( PRStatus ) | 
 |     PR_DeleteSharedMemory(  | 
 |         const char *name | 
 | ); | 
 |  | 
 | PR_END_EXTERN_C | 
 |  | 
 | #endif /* prshm_h___ */ |