nsprpub/pr/include/prshm.h

Fri, 16 Jan 2015 04:50:19 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Fri, 16 Jan 2015 04:50:19 +0100
branch
TOR_BUG_9701
changeset 13
44a2da4a2ab2
permissions
-rw-r--r--

Replace accessor implementation with direct member state manipulation, by
request https://trac.torproject.org/projects/tor/ticket/9701#comment:32

     1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 /*
     7 ** prshm.h -- NSPR Shared Memory
     8 **
     9 ** NSPR Named Shared Memory API provides a cross-platform named
    10 ** shared-memory interface. NSPR Named Shared Memory is modeled on
    11 ** similar constructs in Unix and Windows operating systems. Shared
    12 ** memory allows multiple processes to access one or more common shared
    13 ** memory regions, using it as an inter-process communication channel.
    14 **
    15 ** Notes on Platform Independence:
    16 **   NSPR Named Shared Memory is built on the native services offered
    17 **   by most platforms. The NSPR Named Shared Memory API tries to
    18 **   provide a least common denominator interface so that it works
    19 **   across all supported platforms. To ensure that it works everywhere,
    20 **   some platform considerations must be accomodated and the protocol
    21 **   for using NSPR Shared Memory API must be observed.
    22 **
    23 ** Protocol:
    24 **   Multiple shared memories can be created using NSPR's Shared Memory
    25 **   feature. For each named shared memory, as defined by the name
    26 **   given in the PR_OpenSharedMemory() call, a protocol for using the
    27 **   shared memory API is required to ensure desired behavior. Failing
    28 **   to follow the protocol may yield unpredictable results.
    29 **   
    30 **   PR_OpenSharedMemory() will create the shared memory segment, if it
    31 **   does not already exist, or open a connection that the existing
    32 **   shared memory segment if it already exists.
    33 **   
    34 **   PR_AttachSharedMemory() should be called following
    35 **   PR_OpenSharedMemory() to map the memory segment to an address in
    36 **   the application's address space.
    37 **   
    38 **   PR_AttachSharedMemory() may be called to re-map a shared memory
    39 **   segment after detaching the same PRSharedMemory object. Be
    40 **   sure to detach it when done.
    41 **   
    42 **   PR_DetachSharedMemory() should be called to un-map the shared
    43 **   memory segment from the application's address space.
    44 **   
    45 **   PR_CloseSharedMemory() should be called when no further use of the
    46 **   PRSharedMemory object is required within a process. Following a
    47 **   call to  PR_CloseSharedMemory() the PRSharedMemory object is
    48 **   invalid and cannot be reused.
    49 **   
    50 **   PR_DeleteSharedMemory() should be called before process
    51 **   termination. After calling PR_DeleteSharedMemory() any further use
    52 **   of the shared memory associated with the name may cause
    53 **   unpredictable results.
    54 **   
    55 ** Files:
    56 **   The name passed to PR_OpenSharedMemory() should be a valid filename
    57 **   for a unix platform. PR_OpenSharedMemory() creates file using the
    58 **   name passed in. Some platforms may mangle the name before creating
    59 **   the file and the shared memory.
    60 **   
    61 **   The unix implementation may use SysV IPC shared memory, Posix
    62 **   shared memory, or memory mapped files; the filename may used to
    63 **   define the namespace. On Windows, the name is significant, but
    64 **   there is no file associated with name.
    65 **   
    66 **   No assumptions about the persistence of data in the named file
    67 **   should be made. Depending on platform, the shared memory may be
    68 **   mapped onto system paging space and be discarded at process
    69 **   termination.
    70 **   
    71 **   All names provided to PR_OpenSharedMemory() should be valid
    72 **   filename syntax or name syntax for shared memory for the target
    73 **   platform. Referenced directories should have permissions 
    74 **   appropriate for writing.
    75 **
    76 ** Limits:
    77 **   Different platforms have limits on both the number and size of
    78 **   shared memory resources. The default system limits on some
    79 **   platforms may be smaller than your requirements. These limits may
    80 **   be adjusted on some platforms either via boot-time options or by
    81 **   setting the size of the system paging space to accomodate more
    82 **   and/or larger shared memory segment(s).
    83 **
    84 ** Security:
    85 **   On unix platforms, depending on implementation, contents of the
    86 **   backing store for the shared memory can be exposed via the file
    87 **   system. Set permissions and or access controls at create and attach
    88 **   time to ensure you get the desired security.
    89 **
    90 **   On windows platforms, no special security measures are provided.
    91 **
    92 ** Example:
    93 **   The test case pr/tests/nameshm1.c provides an example of use as
    94 **   well as testing the operation of NSPR's Named Shared Memory.
    95 **
    96 ** lth. 18-Aug-1999.
    97 */
    99 #ifndef prshm_h___
   100 #define prshm_h___
   102 #include "prtypes.h"
   103 #include "prio.h"
   105 PR_BEGIN_EXTERN_C
   107 /*
   108 ** Declare opaque type PRSharedMemory.
   109 */
   110 typedef struct PRSharedMemory PRSharedMemory;
   112 /*
   113 ** FUNCTION: PR_OpenSharedMemory()
   114 **
   115 ** DESCRIPTION:
   116 **   PR_OpenSharedMemory() creates a new shared-memory segment or
   117 **   associates a previously created memory segment with name.
   118 **
   119 **   When parameter create is (PR_SHM_EXCL | PR_SHM_CREATE) and the
   120 **   shared memory already exists, the function returns NULL with the
   121 **   error set to PR_FILE_EXISTS_ERROR.
   122 **
   123 **   When parameter create is PR_SHM_CREATE and the shared memory
   124 **   already exists, a handle to that memory segment is returned. If
   125 **   the segment does not exist, it is created and a pointer to the
   126 **   related PRSharedMemory structure is returned.
   127 **
   128 **   When parameter create is 0, and the shared memory exists, a
   129 **   pointer to a PRSharedMemory is returned. If the shared memory does
   130 **   not exist, NULL is returned with the error set to
   131 **   PR_FILE_NOT_FOUND_ERROR.
   132 **
   133 ** INPUTS:
   134 **   name -- the name the shared-memory segment is known as.
   135 **   size -- the size of the shared memory segment. 
   136 **   flags -- Options for creating the shared memory
   137 **   mode -- Same as is passed to PR_Open()
   138 **
   139 ** OUTPUTS: 
   140 **   The shared memory is allocated.
   141 **
   142 ** RETURNS: Pointer to opaque structure PRSharedMemory or NULL.
   143 **   NULL is returned on error. The reason for the error can be
   144 **   retrieved via PR_GetError() and PR_GetOSError();
   145 **
   146 */
   147 NSPR_API( PRSharedMemory * )
   148     PR_OpenSharedMemory(
   149         const char *name,
   150         PRSize      size,
   151         PRIntn      flags,
   152         PRIntn      mode
   153 );
   154 /* Define values for PR_OpenShareMemory(...,create) */
   155 #define PR_SHM_CREATE 0x1  /* create if not exist */
   156 #define PR_SHM_EXCL   0x2  /* fail if already exists */
   158 /*
   159 ** FUNCTION: PR_AttachSharedMemory()
   160 **
   161 ** DESCRIPTION:
   162 ** PR_AttachSharedMemory() maps the shared-memory described by
   163 ** shm to the current process. 
   164 **
   165 ** INPUTS: 
   166 **   shm -- The handle returned from PR_OpenSharedMemory().
   167 **   flags -- options for mapping the shared memory.
   168 **   PR_SHM_READONLY causes the memory to be attached 
   169 **   read-only.
   170 **
   171 ** OUTPUTS:
   172 **   On success, the shared memory segment represented by shm is mapped
   173 **   into the process' address space.
   174 **
   175 ** RETURNS: Address where shared memory is mapped, or NULL.
   176 **   NULL is returned on error. The reason for the error can be
   177 **   retrieved via PR_GetError() and PR_GetOSError();
   178 **
   179 **
   180 */
   181 NSPR_API( void * )
   182     PR_AttachSharedMemory(
   183         PRSharedMemory *shm,
   184         PRIntn  flags
   185 );
   186 /* Define values for PR_AttachSharedMemory(...,flags) */ 
   187 #define PR_SHM_READONLY 0x01
   189 /*
   190 ** FUNCTION: PR_DetachSharedMemory()
   191 **
   192 ** DESCRIPTION:
   193 **   PR_DetachSharedMemory() detaches the shared-memory described
   194 **   by shm. 
   195 **
   196 ** INPUTS: 
   197 **   shm -- The handle returned from PR_OpenSharedMemory().
   198 **   addr -- The address at which the memory was attached.
   199 **
   200 ** OUTPUTS:
   201 **   The shared memory mapped to an address via a previous call to
   202 **   PR_AttachSharedMemory() is unmapped.
   203 **
   204 ** RETURNS: PRStatus
   205 **
   206 */
   207 NSPR_API( PRStatus )
   208     PR_DetachSharedMemory(
   209         PRSharedMemory *shm,
   210         void  *addr
   211 );
   213 /*
   214 ** FUNCTION: PR_CloseSharedMemory()
   215 **
   216 ** DESCRIPTION:
   217 **   PR_CloseSharedMemory() closes the shared-memory described by
   218 **   shm.
   219 ** 
   220 ** INPUTS:
   221 **   shm -- The handle returned from PR_OpenSharedMemory().
   222 **
   223 ** OUTPUTS:
   224 **   the shared memory represented by shm is closed
   225 **
   226 ** RETURNS: PRStatus
   227 **
   228 */
   229 NSPR_API( PRStatus )
   230     PR_CloseSharedMemory(
   231         PRSharedMemory *shm
   232 );
   234 /*
   235 ** FUNCTION: PR_DeleteSharedMemory()
   236 **
   237 ** DESCRIPTION:
   238 **   The shared memory resource represented by name is released.
   239 **
   240 ** INPUTS:
   241 **   name -- the name the shared-memory segment
   242 **
   243 ** OUTPUTS:
   244 **   depending on platform, resources may be returned to the underlying
   245 **   operating system.
   246 **
   247 ** RETURNS: PRStatus
   248 **
   249 */
   250 NSPR_API( PRStatus )
   251     PR_DeleteSharedMemory( 
   252         const char *name
   253 );
   255 PR_END_EXTERN_C
   257 #endif /* prshm_h___ */

mercurial