#include <ace/ACE_SV_Semaphore_Complex.h>
class ACE_SV_Semaphore_Complex : private ACE_SV_Semaphore_Simple {
public:
enum{ ACE_CREATE = IPC_CREAT, ACE_OPEN = 0 };
ACE_SV_Semaphore_Complex (void);
ACE_SV_Semaphore_Complex ( key_t key, int create = ACE_SV_Semaphore_Complex::ACE_CREATE, int initial_value = 1, u_short nsems = 1, int perms = ACE_DEFAULT_FILE_PERMS );
ACE_SV_Semaphore_Complex ( const char *name, int create = ACE_SV_Semaphore_Complex::ACE_CREATE, int initial_value = 1, u_short nsems = 1, int perms = ACE_DEFAULT_FILE_PERMS );
~ACE_SV_Semaphore_Complex (void);
int open ( const char *name, int flags = ACE_SV_Semaphore_Simple::ACE_CREATE, int initial_value = 1, u_short nsems = 1, int perms = ACE_DEFAULT_FILE_PERMS );
int open ( key_t key, int flags = ACE_SV_Semaphore_Simple::ACE_CREATE, int initial_value = 1, u_short nsems = 1, int perms = ACE_DEFAULT_FILE_PERMS );
int close (void);
int acquire (u_short n = 0, int flags = 0) const;
int acquire_read (u_short n = 0, int flags = 0) const;
int acquire_write (u_short n = 0, int flags = 0) const;
int tryacquire (u_short n = 0, int flags = 0) const;
int tryacquire_read (u_short n = 0, int flags = 0) const;
int tryacquire_write (u_short n = 0, int flags = 0) const;
int release (u_short n = 0, int flags = 0) const;
int op (int val, u_short n = 0, int 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;
ACE_USING ACE_SV_Semaphore_Simple::get_id;
ACE_USING ACE_SV_Semaphore_Simple::remove;
void dump (void) const;
ACE_ALLOC_HOOK_DECLARE;
private:
static const int BIGCOUNT_;
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];
};
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.
ACE_SV_Semaphore_Complex (void);
ACE_SV_Semaphore_Complex (
key_t key,
int create = ACE_SV_Semaphore_Complex::ACE_CREATE,
int initial_value = 1,
u_short nsems = 1,
int perms = ACE_DEFAULT_FILE_PERMS
);
ACE_SV_Semaphore_Complex (
const char *name,
int create = ACE_SV_Semaphore_Complex::ACE_CREATE,
int initial_value = 1,
u_short nsems = 1,
int perms = ACE_DEFAULT_FILE_PERMS
);
~ACE_SV_Semaphore_Complex (void);
int open (
const char *name,
int flags = ACE_SV_Semaphore_Simple::ACE_CREATE,
int initial_value = 1,
u_short nsems = 1,
int perms = ACE_DEFAULT_FILE_PERMS
);
int open (
key_t key,
int flags = ACE_SV_Semaphore_Simple::ACE_CREATE,
int initial_value = 1,
u_short nsems = 1,
int perms = ACE_DEFAULT_FILE_PERMS
);
int close (void);
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 acquire (u_short n = 0, int flags = 0) const;
int acquire_read (u_short n = 0, int flags = 0) const;
int acquire_write (u_short n = 0, int flags = 0) const;
int tryacquire (u_short n = 0, int flags = 0) const;
int tryacquire_read (u_short n = 0, int flags = 0) const;
int tryacquire_write (u_short n = 0, int flags = 0) const;
int release (u_short n = 0, int flags = 0) const;
int op (int val, u_short n = 0, int 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;
ACE_USING ACE_SV_Semaphore_Simple::get_id;
ACE_USING ACE_SV_Semaphore_Simple::remove;
void dump (void) const;
ACE_ALLOC_HOOK_DECLARE;