ACE_SV_Semaphore_Complex Class ReferenceThis is a more complex semaphore wrapper that handles race conditions for initialization correctly...
More...
#include <SV_Semaphore_Complex.h>
List of all members.
|
Public Types |
enum | { ACE_CREATE = IPC_CREAT,
ACE_OPEN = 0
} |
Public Member Functions |
| ACE_SV_Semaphore_Complex (void) |
| ACE_SV_Semaphore_Complex (key_t key, short create=ACE_SV_Semaphore_Complex::ACE_CREATE, int initial_value=1, u_short nsems=1, mode_t perms=ACE_DEFAULT_FILE_PERMS) |
| ACE_SV_Semaphore_Complex (const char *name, short create=ACE_SV_Semaphore_Complex::ACE_CREATE, int initial_value=1, u_short nsems=1, mode_t perms=ACE_DEFAULT_FILE_PERMS) |
| ~ACE_SV_Semaphore_Complex (void) |
int | open (const char *name, short flags=ACE_SV_Semaphore_Simple::ACE_CREATE, int initial_value=1, u_short nsems=1, mode_t perms=ACE_DEFAULT_FILE_PERMS) |
int | open (key_t key, short flags=ACE_SV_Semaphore_Simple::ACE_CREATE, int initial_value=1, u_short nsems=1, mode_t perms=ACE_DEFAULT_FILE_PERMS) |
int | close (void) |
int | acquire (u_short n=0, short flags=0) const |
| Acquire the semaphore.
|
int | acquire_read (u_short n=0, short flags=0) const |
| Acquire a semaphore for reading.
|
int | acquire_write (u_short n=0, short flags=0) const |
| Acquire a semaphore for writing.
|
int | tryacquire (u_short n=0, short flags=0) const |
| Try to acquire the semaphore.
|
int | tryacquire_read (u_short n=0, short flags=0) const |
| Try to acquire the semaphore for reading.
|
int | tryacquire_write (u_short n=0, short flags=0) const |
| Try to acquire the semaphore for writing.
|
int | release (u_short n=0, short flags=0) const |
| Release the semaphore.
|
int | op (short val, u_short n=0, short flags=0) const |
int | op (sembuf op_vec[], u_short n) const |
| General ACE_SV_Semaphore operation on an array of SV_Semaphores.
|
int | control (int cmd, semun arg, u_short n=0) const |
int | control (int cmd, int value=0, u_short n=0) const |
void | dump (void) const |
| Dump the state of an object.
|
Public Attributes |
| ACE_ALLOC_HOOK_DECLARE |
| Declare the dynamic allocation hooks.
|
Static Private Attributes |
static const int | BIGCOUNT_ = 10000 |
static sembuf | op_lock_ [2] |
static sembuf | op_endcreate_ [2] |
static sembuf | op_open_ [1] |
static sembuf | op_close_ [3] |
static sembuf | op_unlock_ [1] |
Detailed Description
This is a more complex semaphore wrapper that handles race conditions for initialization correctly...
This code is a port to C++, inspired by: W. Richard Stevens from his book: UNIX Network Programming (Prentice Hall, ISBN 0-13-949876-1 - 1990). We provide a simpler and easier to understand interface to the System V Semaphore system calls. We create and use a 2 + n-member set for the requested <ACE_SV_Semaphore_Complex>. The first member, [0], is a counter used to know when all processes have finished with the <ACE_SV_Semaphore_Complex>. The counter is initialized to a large number, decremented on every create or open and incremented on every close. This way we can use the "adjust" feature provided by System V so that any process that exit's without calling <close> is accounted for. It doesn't help us if the last process does this (as we have no way of getting control to remove the <ACE_SV_Semaphore_Complex>) but it will work if any process other than the last does an exit (intentional or unintentional). The second member, [1], of the semaphore is used as a lock variable to avoid any race conditions in the <create> and <close> functions. The members beyond [1] are actual semaphore values in the array of semaphores, which may be sized by the user in the constructor.
Member Enumeration Documentation
Constructor & Destructor Documentation
ACE_SV_Semaphore_Complex::ACE_SV_Semaphore_Complex |
( |
void |
|
) |
|
ACE_SV_Semaphore_Complex::ACE_SV_Semaphore_Complex |
( |
key_t |
key, |
|
|
short |
create = ACE_SV_Semaphore_Complex::ACE_CREATE , |
|
|
int |
initial_value = 1 , |
|
|
u_short |
nsems = 1 , |
|
|
mode_t |
perms = ACE_DEFAULT_FILE_PERMS | |
|
) |
| | |
ACE_SV_Semaphore_Complex::ACE_SV_Semaphore_Complex |
( |
const char * |
name, |
|
|
short |
create = ACE_SV_Semaphore_Complex::ACE_CREATE , |
|
|
int |
initial_value = 1 , |
|
|
u_short |
nsems = 1 , |
|
|
mode_t |
perms = ACE_DEFAULT_FILE_PERMS | |
|
) |
| | |
ACE_SV_Semaphore_Complex::~ACE_SV_Semaphore_Complex |
( |
void |
|
) |
|
Member Function Documentation
int ACE_SV_Semaphore_Complex::open |
( |
const char * |
name, |
|
|
short |
flags = ACE_SV_Semaphore_Simple::ACE_CREATE , |
|
|
int |
initial_value = 1 , |
|
|
u_short |
nsems = 1 , |
|
|
mode_t |
perms = ACE_DEFAULT_FILE_PERMS | |
|
) |
| | |
Open or create an array of SV_Semaphores. We return 0 if all is OK, else -1.
Reimplemented from ACE_SV_Semaphore_Simple.
int ACE_SV_Semaphore_Complex::open |
( |
key_t |
key, |
|
|
short |
flags = ACE_SV_Semaphore_Simple::ACE_CREATE , |
|
|
int |
initial_value = 1 , |
|
|
u_short |
nsems = 1 , |
|
|
mode_t |
perms = ACE_DEFAULT_FILE_PERMS | |
|
) |
| | |
Open or create an array of SV_Semaphores. We return 0 if all is OK, else -1.
Reimplemented from ACE_SV_Semaphore_Simple.
int ACE_SV_Semaphore_Complex::close |
( |
void |
|
) |
|
Close an ACE_SV_Semaphore. Unlike the <remove> method, this method is for a process to call before it exits, when it is done with the ACE_SV_Semaphore. We "decrement" the counter of processes using the ACE_SV_Semaphore, and if this was the last one, we can remove the ACE_SV_Semaphore.
Reimplemented from ACE_SV_Semaphore_Simple.
ACE_BEGIN_VERSIONED_NAMESPACE_DECL ACE_INLINE int ACE_SV_Semaphore_Complex::acquire |
( |
u_short |
n = 0 , |
|
|
short |
flags = 0 | |
|
) |
| | const |
ACE_INLINE int ACE_SV_Semaphore_Complex::acquire_read |
( |
u_short |
n = 0 , |
|
|
short |
flags = 0 | |
|
) |
| | const |
ACE_INLINE int ACE_SV_Semaphore_Complex::acquire_write |
( |
u_short |
n = 0 , |
|
|
short |
flags = 0 | |
|
) |
| | const |
ACE_INLINE int ACE_SV_Semaphore_Complex::tryacquire |
( |
u_short |
n = 0 , |
|
|
short |
flags = 0 | |
|
) |
| | const |
ACE_INLINE int ACE_SV_Semaphore_Complex::tryacquire_read |
( |
u_short |
n = 0 , |
|
|
short |
flags = 0 | |
|
) |
| | const |
ACE_INLINE int ACE_SV_Semaphore_Complex::tryacquire_write |
( |
u_short |
n = 0 , |
|
|
short |
flags = 0 | |
|
) |
| | const |
ACE_INLINE int ACE_SV_Semaphore_Complex::release |
( |
u_short |
n = 0 , |
|
|
short |
flags = 0 | |
|
) |
| | const |
ACE_INLINE int ACE_SV_Semaphore_Complex::op |
( |
short |
val, |
|
|
u_short |
semnum = 0 , |
|
|
short |
flags = 0 | |
|
) |
| | const |
General ACE_SV_Semaphore operation. Increment or decrement by a specific amount (positive or negative; amount can`t be zero).
Reimplemented from ACE_SV_Semaphore_Simple.
ACE_INLINE int ACE_SV_Semaphore_Complex::op |
( |
sembuf |
op_vec[], |
|
|
u_short |
nsems | |
|
) |
| | const |
ACE_INLINE int ACE_SV_Semaphore_Complex::control |
( |
int |
cmd, |
|
|
semun |
arg, |
|
|
u_short |
n = 0 | |
|
) |
| | const |
ACE_INLINE int ACE_SV_Semaphore_Complex::control |
( |
int |
cmd, |
|
|
int |
value = 0 , |
|
|
u_short |
n = 0 | |
|
) |
| | const |
ACE_BEGIN_VERSIONED_NAMESPACE_DECL void ACE_SV_Semaphore_Complex::dump |
( |
void |
|
) |
const |
Member Data Documentation
The documentation for this class was generated from the following files:
Generated on Mon Sep 15 07:17:24 2008 for ACE by
1.5.5
|