ACE_Token Class ReferenceClass that acquires, renews, and releases a synchronization token that is serviced in strict FIFO/LIFO ordering and that also supports (1) recursion and (2) readers/writer semantics. More...
Collaboration diagram for ACE_Token:
![]()
Detailed DescriptionClass that acquires, renews, and releases a synchronization token that is serviced in strict FIFO/LIFO ordering and that also supports (1) recursion and (2) readers/writer semantics.This class is a more general-purpose synchronization mechanism than many native OS mutexes. For example, it implements "recursive mutex" semantics, where a thread that owns the token can reacquire it without deadlocking. If the same thread calls <acquire> multiple times, however, it must call <release> an equal number of times before the token is actually released. Threads that are blocked awaiting the token are serviced in strict FIFO/LIFO order as other threads release the token (Solaris and Pthread mutexes don't strictly enforce an acquisition order). There are two lists within the class. Write acquires always have higher priority over read acquires. Which means, if you use both write/read operations, care must be taken to avoid starvation on the readers. Notice that the read/write acquire operations do not have the usual semantic of reader/writer locks. Only one reader can acquire the token at a time (which is different from the usual reader/writer locks where several readers can acquire a lock at the same time as long as there is no writer waiting for the lock). We choose the names to (1) borrow the semantic to give writers higher priority and (2) support a common interface for all locking classes in ACE. Member Enumeration Documentation
Constructor & Destructor Documentation
Constructor.
Destructor.
Member Function Documentation
Retrieve the current queueing strategy.
Set the queueing strategy.
Acquire the token, sleeping until it is obtained or until the expiration of timeout, which is treated as "absolute" time. If some other thread currently holds the token then <sleep_hook> is called before our thread goes to sleep. This <sleep_hook> can be used by the requesting thread to unblock a token-holder that is sleeping, e.g., by means of writing to a pipe (the ACE ACE_Reactor uses this functionality). Return values: 0 if acquires without calling <sleep_hook> 1 if <sleep_hook> is called. 2 if the token is signaled. -1 if failure or timeout occurs (if timeout occurs errno == ETIME) If timeout == <&ACE_Time_Value::zero> then acquire has polling semantics (and does *not* call <sleep_hook>).
This behaves just like the previous <acquire> method, except that it invokes the virtual function called <sleep_hook> that can be overridden by a subclass of ACE_Token.
This should be overridden by a subclass to define the appropriate behavior before <acquire> goes to sleep. By default, this is a no-op...
An optimized method that efficiently reacquires the token if no other threads are waiting. This is useful for situations where you don't want to degrade the quality of service if there are other threads waiting to get the token. If <requeue_position> == -1 and there are other threads waiting to obtain the token we are queued according to the queueing strategy. If <requeue_position> > -1 then it indicates how many entries to skip over before inserting our thread into the list of waiters (e.g., <requeue_position> == 0 means "insert at front of the queue"). Renew has the rather odd semantics such that if there are other waiting threads it will give up the token even if the nesting_level_ > 1. I'm not sure if this is really the right thing to do (since it makes it possible for shared data to be changed unexpectedly) so use with caution... This method maintians the original token priority. As in <acquire>, the timeout value is an absolute time.
Become interface-compliant with other lock mechanisms (implements a non-blocking <acquire>).
Shuts down the ACE_Token instance.
Relinquish the token. If there are any waiters then the next one in line gets it.
Behaves like acquire() but at a lower priority. It should probably be called acquire_yield() since the semantics aren't really what's commonly expected for readers/writer locks. See the class documentation above for more details.
Behaves like acquire() but at a lower priority. It should probably be called acquire_yield() since the semantics aren't really what's commonly expected for readers/writer locks. See the class documentation above for more details.
Calls acquire().
Calls acquire().
Lower priority try_acquire().
Just calls <tryacquire>.
Assumes the caller has acquired the token and returns 0.
Return the number of threads that are currently waiting to get the token.
Return the id of the current thread that owns the token.
Dump the state of an object.
Implements the <acquire> and <tryacquire> methods above.
Wake next in line for ownership.
Member Data DocumentationDeclare the dynamic allocation hooks.
A queue of writer threads.
A queue of reader threads.
ACE_Thread_Mutex used to lock internal data structures.
Current owner of the token.
Some thread (i.e., <owner_>) is using the token. We need this extra variable to deal with POSIX pthreads madness...
Number of waiters.
Current nesting level.
The attributes for the condition variables, optimizes lock time.
Queueing strategy, LIFO/FIFO.
The documentation for this class was generated from the following files: Generated on Mon Sep 15 07:17:57 2008 for ACE by ![]() |