ACE  6.4.2
Public Types | Public Member Functions | Public Attributes | Static Private Attributes | List of all members
ACE_SV_Semaphore_Complex Class Reference

This is a more complex semaphore wrapper that handles race conditions for initialization correctly... More...

#include <SV_Semaphore_Complex.h>

Inheritance diagram for ACE_SV_Semaphore_Complex:
Inheritance graph
[legend]
Collaboration diagram for ACE_SV_Semaphore_Complex:
Collaboration graph
[legend]

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. More...
 
int acquire_read (u_short n=0, short flags=0) const
 Acquire a semaphore for reading. More...
 
int acquire_write (u_short n=0, short flags=0) const
 Acquire a semaphore for writing. More...
 
int tryacquire (u_short n=0, short flags=0) const
 Try to acquire the semaphore. More...
 
int tryacquire_read (u_short n=0, short flags=0) const
 Try to acquire the semaphore for reading. More...
 
int tryacquire_write (u_short n=0, short flags=0) const
 Try to acquire the semaphore for writing. More...
 
int release (u_short n=0, short flags=0) const
 Release the semaphore. More...
 
int op (short val, u_short n=0, short flags=0) const
 
int op (sembuf op_vec[], u_short n) const
 
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. More...
 

Public Attributes

 ACE_ALLOC_HOOK_DECLARE
 Declare the dynamic allocation hooks. More...
 

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]
 

Additional Inherited Members

- Private Types inherited from ACE_SV_Semaphore_Simple
enum  { ACE_CREATE = IPC_CREAT, ACE_EXCL = IPC_EXCL, ACE_OPEN = 0 }
 
- Private Member Functions inherited from ACE_SV_Semaphore_Simple
 ACE_SV_Semaphore_Simple (void)
 
 ACE_SV_Semaphore_Simple (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)
 
 ACE_SV_Semaphore_Simple (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)
 
 ACE_SV_Semaphore_Simple (const wchar_t *name, short flags=ACE_SV_Semaphore_Simple::ACE_CREATE, int initial_value=1, u_short nsems=1, mode_t perms=ACE_DEFAULT_FILE_PERMS)
 
 ~ACE_SV_Semaphore_Simple (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 (const wchar_t *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 remove (void) const
 
int acquire (u_short n=0, short flags=0) const
 
int acquire_read (u_short n=0, short flags=0) const
 Acquire a semaphore for reading. More...
 
int acquire_write (u_short n=0, short flags=0) const
 Acquire a semaphore for writing. More...
 
int tryacquire (u_short n=0, short flags=0) const
 Non-blocking version of <acquire>. More...
 
int tryacquire_read (u_short n=0, short flags=0) const
 Try to acquire the semaphore for reading. More...
 
int tryacquire_write (u_short n=0, short flags=0) const
 Try to acquire the semaphore for writing. More...
 
int release (u_short n=0, short flags=0) const
 
int op (short val, u_short semnum=0, short flags=SEM_UNDO) const
 
int op (sembuf op_vec[], u_short nsems) const
 General ACE_SV_Semaphore operation on an array of SV_Semaphores. More...
 
int control (int cmd, semun arg, u_short n=0) const
 
int control (int cmd, int value=0, u_short n=0) const
 
int get_id (void) const
 Get underlying internal id. More...
 
void dump (void) const
 Dump the state of an object. More...
 
key_t name_2_key (const char *name)
 
- Private Attributes inherited from ACE_SV_Semaphore_Simple
 ACE_ALLOC_HOOK_DECLARE
 Declare the dynamic allocation hooks. More...
 
key_t key_
 Semaphore key. More...
 
int internal_id_
 Internal ID to identify the semaphore group within this process. More...
 
int sem_number_
 Number of semaphores we're creating. More...
 

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

anonymous enum
Enumerator
ACE_CREATE 
ACE_OPEN 

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::acquire ( u_short  n = 0,
short  flags = 0 
) const
inline

Acquire the semaphore.

int ACE_SV_Semaphore_Complex::acquire_read ( u_short  n = 0,
short  flags = 0 
) const
inline

Acquire a semaphore for reading.

int ACE_SV_Semaphore_Complex::acquire_write ( u_short  n = 0,
short  flags = 0 
) const
inline

Acquire a semaphore for writing.

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.

int ACE_SV_Semaphore_Complex::control ( int  cmd,
semun  arg,
u_short  n = 0 
) const
inline
int ACE_SV_Semaphore_Complex::control ( int  cmd,
int  value = 0,
u_short  n = 0 
) const
inline
void ACE_SV_Semaphore_Complex::dump ( void  ) const

Dump the state of an object.

int ACE_SV_Semaphore_Complex::op ( short  val,
u_short  n = 0,
short  flags = 0 
) const
inline
int ACE_SV_Semaphore_Complex::op ( sembuf  op_vec[],
u_short  n 
) const
inline
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.

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.

int ACE_SV_Semaphore_Complex::release ( u_short  n = 0,
short  flags = 0 
) const
inline

Release the semaphore.

int ACE_SV_Semaphore_Complex::tryacquire ( u_short  n = 0,
short  flags = 0 
) const
inline

Try to acquire the semaphore.

int ACE_SV_Semaphore_Complex::tryacquire_read ( u_short  n = 0,
short  flags = 0 
) const
inline

Try to acquire the semaphore for reading.

int ACE_SV_Semaphore_Complex::tryacquire_write ( u_short  n = 0,
short  flags = 0 
) const
inline

Try to acquire the semaphore for writing.

Member Data Documentation

ACE_SV_Semaphore_Complex::ACE_ALLOC_HOOK_DECLARE

Declare the dynamic allocation hooks.

const int ACE_SV_Semaphore_Complex::BIGCOUNT_ = 10000
staticprivate
sembuf ACE_SV_Semaphore_Complex::op_close_
staticprivate
Initial value:
=
{
{0, 0, 0},
{0, 1, SEM_UNDO},
{1, 1, SEM_UNDO},
}
sembuf ACE_SV_Semaphore_Complex::op_endcreate_
staticprivate
Initial value:
=
{
{1, -1, SEM_UNDO},
{0, -1, SEM_UNDO},
}
sembuf ACE_SV_Semaphore_Complex::op_lock_
staticprivate
Initial value:
=
{
{0, 0, 0},
{0, 1, SEM_UNDO},
}
sembuf ACE_SV_Semaphore_Complex::op_open_
staticprivate
Initial value:
=
{
{1, -1, SEM_UNDO},
}
sembuf ACE_SV_Semaphore_Complex::op_unlock_
staticprivate
Initial value:
=
{
{0, -1, SEM_UNDO},
}

The documentation for this class was generated from the following files: