/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is the Netscape Portable Runtime (NSPR). * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1999-2000 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ /* ** 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___ */