vrpn
07.33
Virtual Reality Peripheral Network
|
#include <vrpn_Mutex.h>
Classes | |
struct | mutexCallback |
struct | peerData |
Public Member Functions | |
vrpn_PeerMutex (const char *name, int port, const char *NICaddress=NULL) | |
This constructor opens a new connection/port for the mutex. More... | |
~vrpn_PeerMutex (void) | |
If isHeldLocally(), calls release(). More... | |
vrpn_bool | isAvailable (void) const |
True from when release() is called or we receive a release message from another process until request() is called or we grant the lock to another process in response to its request message. More... | |
vrpn_bool | isHeldLocally (void) const |
True from when RequestGranted callbacks are triggered until release() is called. More... | |
vrpn_bool | isHeldRemotely (void) const |
True from when we grant the lock to another process in response to its request message until we receive a release message from another process. More... | |
int | numPeers (void) const |
void | mainloop (void) |
void | request (void) |
Request the distributed lock. Does not request the lock if !isAvailable(), instead automatically triggering DeniedCallbacks. More... | |
void | release (void) |
Release the distributed lock. Does nothing if !isHeldLocally() and there isn't a request pending. More... | |
void | addPeer (const char *stationName) |
Takes a VRPN station name of the form "<host>:<port>". More... | |
void | addRequestGrantedCallback (void *userdata, int(*)(void *)) |
These callbacks are triggered when OUR request is granted. More... | |
void | addRequestDeniedCallback (void *userdata, int(*)(void *)) |
These callbacks are triggered when OUR request is denied. More... | |
void | addTakeCallback (void *userdata, int(*)(void *)) |
These callbacks are triggered when ANY peer gets the mutex. (If several peers are competing for the mutex, and the implementation issues multiple "grants", these callbacks will only be triggered once between triggerings of ReleaseCallbacks.) More... | |
void | addReleaseCallback (void *userdata, int(*)(void *)) |
These callbacks are triggered when ANY peer releases the mutex. More... | |
Protected Types | |
enum | state { OURS, REQUESTING, AVAILABLE, HELD_REMOTELY } |
Protected Member Functions | |
void | sendRequest (vrpn_Connection *) |
void | sendRelease (vrpn_Connection *) |
void | sendGrantRequest (vrpn_Connection *, vrpn_uint32 IPnumber, vrpn_uint32 PortNumber) |
void | sendDenyRequest (vrpn_Connection *, vrpn_uint32 IPnumber, vrpn_uint32 PortNumber) |
void | triggerGrantCallbacks (void) |
void | triggerDenyCallbacks (void) |
void | triggerTakeCallbacks (void) |
void | triggerReleaseCallbacks (void) |
void | checkGrantMutex (void) |
void | init (const char *name) |
vrpn_PeerMutex (const char *name, vrpn_Connection *c) | |
This constructor reuses a SERVER connection for the mutex. BUG BUG BUG - do not use this constructor; it does not reliably resolve race conditions. More... | |
Static Protected Member Functions | |
static int VRPN_CALLBACK | handle_request (void *, vrpn_HANDLERPARAM) |
static int VRPN_CALLBACK | handle_release (void *, vrpn_HANDLERPARAM) |
static int VRPN_CALLBACK | handle_grantRequest (void *, vrpn_HANDLERPARAM) |
static int VRPN_CALLBACK | handle_denyRequest (void *, vrpn_HANDLERPARAM) |
static int VRPN_CALLBACK | handle_losePeer (void *, vrpn_HANDLERPARAM) |
Protected Attributes | |
char * | d_mutexName |
state | d_state |
int | d_numPeersGrantingLock |
Counts the number of "grants" we've received after issuing a request; when this reaches d_numPeers, the lock is ours. More... | |
vrpn_Connection * | d_server |
Receive on this connection. More... | |
vrpn_Connection ** | d_peer |
Send on these connections to other Mutex's well-known-ports. More... | |
int | d_numPeers |
int | d_numConnectionsAllocated |
Dynamic array size for d_peer and d_peerGrantedLock. More... | |
vrpn_uint32 | d_myIP |
vrpn_uint32 | d_myPort |
vrpn_uint32 | d_holderIP |
vrpn_int32 | d_holderPort |
vrpn_int32 | d_myId |
vrpn_int32 | d_request_type |
vrpn_int32 | d_release_type |
vrpn_int32 | d_grantRequest_type |
vrpn_int32 | d_denyRequest_type |
mutexCallback * | d_reqGrantedCB |
mutexCallback * | d_reqDeniedCB |
mutexCallback * | d_takeCB |
mutexCallback * | d_releaseCB |
peerData * | d_peerData |
Needed only to clean up when a peer shuts down (mid-request). It isn't currently feasible to have all this data, so instead we abort requests that were interrupted by a shutdown. More... | |
This class provides distributed mutual exclusion between every instance with the same name for which addPeer() has been called. If a process calls request() when isAvailable() returns true, the mutex will attempt to secure a lock to whatever resource it is governing; either RequestGranted or RequestDenied callbacks will be triggered. If RequestGranted callbacks are triggered, the process has the lock until it explicitly calls release() (and can verify this by checking isHeldLocally()). Once the lock-owner calls release(), Release callbacks at every peer will be triggered.
Like most vrpn classes, the mainloop() must be called frequently.
Note that none of isAvailable(), isHeldLocally(), and isHeldRemotely() are true between when request() is called and either RequestGranted or RequestDenied callbacks are triggered.
Definition at line 196 of file vrpn_Mutex.h.
|
protected |
Enumerator | |
---|---|
OURS | |
REQUESTING | |
AVAILABLE | |
HELD_REMOTELY |
Definition at line 251 of file vrpn_Mutex.h.
vrpn_PeerMutex::vrpn_PeerMutex | ( | const char * | name, |
int | port, | ||
const char * | NICaddress = NULL |
||
) |
This constructor opens a new connection/port for the mutex.
Definition at line 752 of file vrpn_Mutex.C.
vrpn_PeerMutex::~vrpn_PeerMutex | ( | void | ) |
If isHeldLocally(), calls release().
Definition at line 824 of file vrpn_Mutex.C.
References d_mutexName, d_numPeers, d_peer, d_server, isHeldLocally(), release(), and vrpn_Connection::removeReference().
|
protected |
This constructor reuses a SERVER connection for the mutex. BUG BUG BUG - do not use this constructor; it does not reliably resolve race conditions.
Definition at line 792 of file vrpn_Mutex.C.
void vrpn_PeerMutex::addPeer | ( | const char * | stationName | ) |
Takes a VRPN station name of the form "<host>:<port>".
Definition at line 965 of file vrpn_Mutex.C.
References d_numConnectionsAllocated, d_numPeers, d_peer, d_peerData, handle_losePeer(), vrpn_Connection::register_handler(), vrpn_Connection::register_message_type(), vrpn_Connection::register_sender(), vrpn_CONTROL, vrpn_dropped_connection, and vrpn_get_connection_by_name().
void vrpn_PeerMutex::addReleaseCallback | ( | void * | userdata, |
int(*)(void *) | f | ||
) |
These callbacks are triggered when ANY peer releases the mutex.
Definition at line 1065 of file vrpn_Mutex.C.
References d_releaseCB, vrpn_PeerMutex::mutexCallback::f, vrpn_PeerMutex::mutexCallback::next, and vrpn_PeerMutex::mutexCallback::userdata.
void vrpn_PeerMutex::addRequestDeniedCallback | ( | void * | userdata, |
int(*)(void *) | f | ||
) |
These callbacks are triggered when OUR request is denied.
Definition at line 1035 of file vrpn_Mutex.C.
References d_reqDeniedCB, vrpn_PeerMutex::mutexCallback::f, vrpn_PeerMutex::mutexCallback::next, and vrpn_PeerMutex::mutexCallback::userdata.
void vrpn_PeerMutex::addRequestGrantedCallback | ( | void * | userdata, |
int(*)(void *) | f | ||
) |
These callbacks are triggered when OUR request is granted.
Definition at line 1020 of file vrpn_Mutex.C.
References d_reqGrantedCB, vrpn_PeerMutex::mutexCallback::f, vrpn_PeerMutex::mutexCallback::next, and vrpn_PeerMutex::mutexCallback::userdata.
void vrpn_PeerMutex::addTakeCallback | ( | void * | userdata, |
int(*)(void *) | f | ||
) |
These callbacks are triggered when ANY peer gets the mutex. (If several peers are competing for the mutex, and the implementation issues multiple "grants", these callbacks will only be triggered once between triggerings of ReleaseCallbacks.)
Definition at line 1050 of file vrpn_Mutex.C.
References d_takeCB, vrpn_PeerMutex::mutexCallback::f, vrpn_PeerMutex::mutexCallback::next, and vrpn_PeerMutex::mutexCallback::userdata.
|
protected |
Definition at line 1374 of file vrpn_Mutex.C.
References d_numPeers, d_numPeersGrantingLock, d_state, OURS, REQUESTING, triggerGrantCallbacks(), and triggerTakeCallbacks().
Referenced by handle_grantRequest(), mainloop(), and request().
|
staticprotected |
Definition at line 1202 of file vrpn_Mutex.C.
References vrpn_HANDLERPARAM::buffer, d_myIP, d_myPort, d_numPeersGrantingLock, d_state, HELD_REMOTELY, triggerDenyCallbacks(), and vrpn_unbuffer().
|
staticprotected |
Definition at line 1169 of file vrpn_Mutex.C.
References vrpn_HANDLERPARAM::buffer, checkGrantMutex(), d_myIP, d_myPort, d_numPeersGrantingLock, and vrpn_unbuffer().
|
staticprotected |
Definition at line 1234 of file vrpn_Mutex.C.
References d_numPeers, d_peer, d_state, release(), vrpn_Connection::removeReference(), and REQUESTING.
Referenced by addPeer().
|
staticprotected |
Definition at line 1134 of file vrpn_Mutex.C.
References AVAILABLE, vrpn_HANDLERPARAM::buffer, d_holderIP, d_holderPort, d_state, triggerReleaseCallbacks(), and vrpn_unbuffer().
|
staticprotected |
Definition at line 1081 of file vrpn_Mutex.C.
References AVAILABLE, vrpn_HANDLERPARAM::buffer, d_holderIP, d_holderPort, d_numPeers, d_peer, d_state, HELD_REMOTELY, REQUESTING, sendDenyRequest(), sendGrantRequest(), triggerTakeCallbacks(), and vrpn_unbuffer().
|
protected |
Definition at line 1385 of file vrpn_Mutex.C.
References d_mutexName, d_myId, d_request_type, d_server, vrpn_Connection::register_message_type(), and vrpn_Connection::register_sender().
vrpn_bool vrpn_PeerMutex::isAvailable | ( | void | ) | const |
vrpn_bool vrpn_PeerMutex::isHeldLocally | ( | void | ) | const |
True from when RequestGranted callbacks are triggered until release() is called.
Definition at line 866 of file vrpn_Mutex.C.
Referenced by release(), and ~vrpn_PeerMutex().
vrpn_bool vrpn_PeerMutex::isHeldRemotely | ( | void | ) | const |
True from when we grant the lock to another process in response to its request message until we receive a release message from another process.
Definition at line 871 of file vrpn_Mutex.C.
References d_state, and HELD_REMOTELY.
void vrpn_PeerMutex::mainloop | ( | void | ) |
Definition at line 878 of file vrpn_Mutex.C.
References checkGrantMutex(), d_numPeers, d_peer, d_server, and vrpn_Connection::mainloop().
int vrpn_PeerMutex::numPeers | ( | void | ) | const |
Definition at line 876 of file vrpn_Mutex.C.
References d_numPeers.
void vrpn_PeerMutex::release | ( | void | ) |
Release the distributed lock. Does nothing if !isHeldLocally() and there isn't a request pending.
Definition at line 936 of file vrpn_Mutex.C.
References AVAILABLE, d_holderIP, d_holderPort, d_numPeers, d_peer, d_state, isHeldLocally(), sendRelease(), and triggerReleaseCallbacks().
Referenced by handle_losePeer(), and ~vrpn_PeerMutex().
void vrpn_PeerMutex::request | ( | void | ) |
Request the distributed lock. Does not request the lock if !isAvailable(), instead automatically triggering DeniedCallbacks.
Definition at line 890 of file vrpn_Mutex.C.
References checkGrantMutex(), d_holderIP, d_holderPort, d_myIP, d_myPort, d_numPeers, d_numPeersGrantingLock, d_peer, d_state, isAvailable(), REQUESTING, sendRequest(), and triggerDenyCallbacks().
|
protected |
Definition at line 1318 of file vrpn_Mutex.C.
References vrpn_Connection::pack_message(), vrpn_Connection::register_message_type(), vrpn_buffer(), and vrpn_gettimeofday.
Referenced by handle_request().
|
protected |
Definition at line 1302 of file vrpn_Mutex.C.
References vrpn_Connection::pack_message(), vrpn_Connection::register_message_type(), vrpn_buffer(), and vrpn_gettimeofday.
Referenced by handle_request().
|
protected |
Definition at line 1287 of file vrpn_Mutex.C.
References d_myIP, d_myPort, vrpn_Connection::pack_message(), vrpn_Connection::register_message_type(), vrpn_buffer(), and vrpn_gettimeofday.
Referenced by release().
|
protected |
Definition at line 1272 of file vrpn_Mutex.C.
References d_myIP, d_myPort, vrpn_Connection::pack_message(), vrpn_Connection::register_message_type(), vrpn_buffer(), and vrpn_gettimeofday.
Referenced by request().
|
protected |
Definition at line 1344 of file vrpn_Mutex.C.
References d_reqDeniedCB, vrpn_PeerMutex::mutexCallback::f, vrpn_PeerMutex::mutexCallback::next, and vrpn_PeerMutex::mutexCallback::userdata.
Referenced by handle_denyRequest(), and request().
|
protected |
Definition at line 1334 of file vrpn_Mutex.C.
References d_reqGrantedCB, vrpn_PeerMutex::mutexCallback::f, vrpn_PeerMutex::mutexCallback::next, and vrpn_PeerMutex::mutexCallback::userdata.
Referenced by checkGrantMutex().
|
protected |
Definition at line 1364 of file vrpn_Mutex.C.
References d_releaseCB, vrpn_PeerMutex::mutexCallback::f, vrpn_PeerMutex::mutexCallback::next, and vrpn_PeerMutex::mutexCallback::userdata.
Referenced by handle_release(), and release().
|
protected |
Definition at line 1354 of file vrpn_Mutex.C.
References d_takeCB, vrpn_PeerMutex::mutexCallback::f, vrpn_PeerMutex::mutexCallback::next, and vrpn_PeerMutex::mutexCallback::userdata.
Referenced by checkGrantMutex(), and handle_request().
|
protected |
Definition at line 279 of file vrpn_Mutex.h.
|
protected |
Definition at line 278 of file vrpn_Mutex.h.
|
protected |
Definition at line 272 of file vrpn_Mutex.h.
Referenced by handle_release(), handle_request(), release(), and request().
|
protected |
Definition at line 273 of file vrpn_Mutex.h.
Referenced by handle_release(), handle_request(), release(), and request().
|
protected |
Definition at line 253 of file vrpn_Mutex.h.
Referenced by init(), and ~vrpn_PeerMutex().
|
protected |
Definition at line 275 of file vrpn_Mutex.h.
Referenced by init().
|
protected |
Definition at line 270 of file vrpn_Mutex.h.
Referenced by handle_denyRequest(), handle_grantRequest(), request(), sendRelease(), and sendRequest().
|
protected |
Definition at line 271 of file vrpn_Mutex.h.
Referenced by handle_denyRequest(), handle_grantRequest(), request(), sendRelease(), and sendRequest().
|
protected |
Dynamic array size for d_peer and d_peerGrantedLock.
Definition at line 267 of file vrpn_Mutex.h.
Referenced by addPeer().
|
protected |
Definition at line 266 of file vrpn_Mutex.h.
Referenced by addPeer(), checkGrantMutex(), handle_losePeer(), handle_request(), mainloop(), numPeers(), release(), request(), and ~vrpn_PeerMutex().
|
protected |
Counts the number of "grants" we've received after issuing a request; when this reaches d_numPeers, the lock is ours.
Definition at line 257 of file vrpn_Mutex.h.
Referenced by checkGrantMutex(), handle_denyRequest(), handle_grantRequest(), and request().
|
protected |
Send on these connections to other Mutex's well-known-ports.
Definition at line 263 of file vrpn_Mutex.h.
Referenced by addPeer(), handle_losePeer(), handle_request(), mainloop(), release(), request(), and ~vrpn_PeerMutex().
|
protected |
Needed only to clean up when a peer shuts down (mid-request). It isn't currently feasible to have all this data, so instead we abort requests that were interrupted by a shutdown.
Definition at line 322 of file vrpn_Mutex.h.
Referenced by addPeer().
|
protected |
Definition at line 277 of file vrpn_Mutex.h.
|
protected |
Definition at line 314 of file vrpn_Mutex.h.
Referenced by addReleaseCallback(), and triggerReleaseCallbacks().
|
protected |
Definition at line 312 of file vrpn_Mutex.h.
Referenced by addRequestDeniedCallback(), and triggerDenyCallbacks().
|
protected |
Definition at line 311 of file vrpn_Mutex.h.
Referenced by addRequestGrantedCallback(), and triggerGrantCallbacks().
|
protected |
Definition at line 276 of file vrpn_Mutex.h.
Referenced by init().
|
protected |
Receive on this connection.
Definition at line 261 of file vrpn_Mutex.h.
Referenced by init(), mainloop(), and ~vrpn_PeerMutex().
|
protected |
Definition at line 255 of file vrpn_Mutex.h.
Referenced by checkGrantMutex(), handle_denyRequest(), handle_losePeer(), handle_release(), handle_request(), isAvailable(), isHeldLocally(), isHeldRemotely(), release(), and request().
|
protected |
Definition at line 313 of file vrpn_Mutex.h.
Referenced by addTakeCallback(), and triggerTakeCallbacks().