summaryrefslogtreecommitdiff
path: root/ace/Local_Tokens.h
diff options
context:
space:
mode:
Diffstat (limited to 'ace/Local_Tokens.h')
-rw-r--r--ace/Local_Tokens.h999
1 files changed, 0 insertions, 999 deletions
diff --git a/ace/Local_Tokens.h b/ace/Local_Tokens.h
deleted file mode 100644
index 40536b09396..00000000000
--- a/ace/Local_Tokens.h
+++ /dev/null
@@ -1,999 +0,0 @@
-/* -*- C++ -*- */
-// $Id$
-
-// ============================================================================
-//
-// = LIBRARY
-// ace
-//
-// = FILENAME
-// Local_Tokens.h
-//
-// = AUTHOR
-// Karl-Heinz Dorn (kdorn@erlh.siemens.de)
-// Douglas C. Schmidt (schmidt@cs.wustl.edu)
-// Tim Harrison (harrison@cs.wustl.edu)
-//
-// = DESCRIPTION
-// This file contains definitions for the following classes:
-//
-// public:
-// 7. ACE_Token_Proxy
-// 8. ACE_Null_Token : public ACE_Token_Proxy
-// 9. ACE_Local_Mutex : public ACE_Token_Proxy
-// *. ACE_Local_RLock : public ACE_Local_Mutex
-// &. ACE_Local_WLock : public ACE_Local_Mutex
-// private:
-// 1. ACE_TOKEN_CONST
-// 3. ACE_TPQ_Entry
-// b. ACE_TSS_TPQ_Entry
-// c. ACE_TPQ_Iterator
-// 4. ACE_Token_Proxy_Queue
-// 5. ACE_Tokens
-// 6. ACE_Mutex_Token : public ACE_Tokens
-// 12. ACE_RW_Token : public ACE_Tokens
-// a. ACE_Token_Name
-//
-// ============================================================================
-
-#if !defined (ACE_LOCAL_MUTEX_H)
-#define ACE_LOCAL_MUTEX_H
-
-#include "ace/Synch_T.h"
-#include "ace/Containers.h"
-#include "ace/Synch_Options.h"
-#include "ace/Map_Manager.h"
-
-// 1.
-class ACE_Export ACE_TOKEN_CONST
-{
- // = TITLE
- // Not a public interface.
- //
- // = DESCRIPTION
- // Constant definitions and typdefs for Token library. Mostly,
- // this class is necessary to fight the compiler with order of
- // declaration errors.
-public:
-#if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
- // ACE platform supports some form of threading.
- typedef ACE_Condition_Thread_Mutex COND_VAR;
- typedef ACE_Thread_Mutex MUTEX;
- typedef ACE_Thread_Mutex_Guard GUARD;
-#else
- typedef ACE_Null_Condition COND_VAR;
- typedef ACE_Null_Mutex MUTEX;
- typedef ACE_Null_Mutex_Guard GUARD;
-#endif /* ACE_HAS_THREADS */
-};
-
-// Forward decl.
-class ACE_Token_Proxy;
-
-// 3..
-class ACE_Export ACE_TPQ_Entry
-{
- // = TITLE
- // Token Proxy Queue entry. Used in the ACE_Token_Proxy_Queue
- //
- // = DESCRIPTION
- // Not a public interface.
-friend class ACE_Token_Manager;
-public:
- typedef void (*PTVF) (void *);
-
- ACE_TPQ_Entry (void);
- // Null constructor.
-
- ACE_TPQ_Entry (const ACE_Token_Proxy *proxy,
- const char *client_id);
- // Construction.
-
- ACE_TPQ_Entry (const ACE_TPQ_Entry &rhs);
- // Copy constructor.
-
- ~ACE_TPQ_Entry (void);
- // Death.
-
- void operator= (const ACE_TPQ_Entry &rhs);
- // Copy operator use by the queue.
-
- // = Set/get top of the queue.
- ACE_Token_Proxy *proxy (void) const;
- void proxy (ACE_Token_Proxy *);
-
- // = Delta/get nesting level of the entry.
- int nesting_level (void) const;
- void nesting_level (int delta);
-
- // = Set/get client_id of the entry.
- const char *client_id (void) const;
- void client_id (const char *);
-
- int equal_client_id (const char *id);
- // Returns 1 if <id> == client id. Does not check for <id> == 0.
-
- void set (void (*sleep_hook)(void *));
- // One method for arg and sleep_hook.
-
- // = Set/get sleep hook of the entry.
- void sleep_hook (void (*sh)(void *));
- PTVF sleep_hook (void) const;
-
- void call_sleep_hook (void);
- // Call the sleep hook function or method passing arg.
-
- void dump (void) const;
- // Dump the state of the class.
-
- // = Used to block the thread if an acquire fails with EWOULDBLOCK.
- ACE_TOKEN_CONST::COND_VAR cond_var_;
- ACE_TOKEN_CONST::MUTEX lock_;
-
- ACE_TPQ_Entry *next_;
- // Pointer to next in list.
-
- // = Get/set whether this client is blocked waiting for a token.
- int waiting (void) const;
- void waiting (int w);
-
-private:
- int waiting_;
- // This client is waiting for a token.
-
- ACE_Token_Proxy *proxy_;
- // Proxy.
-
- int nesting_level_;
- // Nesting level.
-
- void *arg_;
- // Arg.
-
- char client_id_[ACE_MAXCLIENTIDLEN];
- // Client id.
-
- void (*sleep_hook_)(void *);
- // Sleep hook.
-};
-
-// ************************************************************
-
-// b..
-#if defined (ACE_NO_TSS_TOKENS)
-typedef ACE_TPQ_Entry ACE_TPQ_ENTRY;
-#else
-typedef ACE_TSS<ACE_TPQ_Entry> ACE_TPQ_ENTRY;
-#endif /* ACE_NO_TSS_TOKENS */
-
-class ACE_Export ACE_TSS_TPQ_Entry : public ACE_TPQ_ENTRY
-{
- // = TITLE
- // ACE_TSS_TPQ_Entry
- //
- // = DESCRIPTION
- // Not a public interface.
-public:
- ACE_TSS_TPQ_Entry (const ACE_Token_Proxy *proxy,
- const char *client_id);
- // These are passed to the constructor of ACE_TPQ_Entry in
- // make_TSS_TYPE
-
- virtual ACE_TPQ_Entry *make_TSS_TYPE (void) const;
- // Allows us to pass args to the construction of the TSS object.
-
- operator ACE_TPQ_Entry *(void);
- // Operator overloading and inheritence don't mix.
-
- void dump (void) const;
- // Dump the state of the class.
-
-#if defined (ACE_NO_TSS_TOKENS)
- ACE_TSS_TPQ_Entry *operator-> (void)
- {
- return this;
- }
-#endif /* ACE_NO_TSS_TOKENS */
-
-private:
- ACE_TSS_TPQ_Entry (const ACE_TSS_TPQ_Entry &);
- void operator= (const ACE_TSS_TPQ_Entry &);
- // Private: should not be used
-
- // = These are passed to the constructor of ACE_TPQ_Entry in
- // make_TSS_TYPE
- const ACE_Token_Proxy *proxy_;
- // Proxy.
- const char *client_id_;
- // Client_id.
-};
-
-// ************************************************************
-
-class ACE_Token_Proxy_Queue;
-
-// c..
-class ACE_Export ACE_TPQ_Iterator
-{
- // = TITLE
- // Iterates through ACE_Token_Proxy_Queues.
- //
- // = DESCRIPTION
- // Not a public interface.
-public:
- ACE_TPQ_Iterator (ACE_Token_Proxy_Queue &q);
- // Construction.
-
- int next (ACE_TPQ_Entry *&next_item);
- // Pass back the <next_item>.
-
- int done (void) const;
- // Returns 1 when all items have been seen, else 0.
-
- void advance (void);
- // Move forward by one element in the queue.
-
- void dump (void) const;
- // Dump the state of an object.
-
-private:
- ACE_TPQ_Entry *current_;
-};
-
-// 4..
-class ACE_Export ACE_Token_Proxy_Queue
-{
- // = TITLE
- // Token waiter list.
- //
- // = DESCRIPTION
- // Not a public interface.
- //
- // This queue holds all the token proxies waiting for ownership
- // of a token. Along with the proxy reference, it also stores
- // the nesting level, client id, and a magic cookie from the
- // proxy. This queue stores the ACE_TPQ_Entries by pointer
- // values. It DOES NOT make copies. Thus, the user is
- // responsible to ensure that the TPQ's stick around. This is
- // motivated by the need to reduce dynamic memory allocation.
-public:
- friend class ACE_TPQ_Iterator;
-
- ACE_Token_Proxy_Queue (void);
- // Construction.
-
- void enqueue (ACE_TPQ_Entry* new_entry,
- int position);
- // Enqueue a proxy, nesting level, client_id, and a magic cookie at
- // the given position in the list. If the position is -1, we
- // enqueue at the end of the list (I think).
-
- const ACE_TPQ_Entry* head (void);
- // Top of the queue.
-
-// int member (const char *id);
- // Is this id in the waiter list?
-
- void dequeue (void);
- // Remove the top waiter.
-
- void remove (const ACE_TPQ_Entry *remove_me);
- // Remove the waiter whose proxy ref matches remove_me.
-
- int size (void);
- // The number of waiters.
-
- void dump (void) const;
- // Dump the state of the class.
-
-protected:
- ACE_TPQ_Entry *head_;
- // Head.
- ACE_TPQ_Entry *tail_;
- // Tail.
- int size_;
- // Size.
-};
-
-// 5..
-class ACE_Export ACE_Tokens
-{
- // = TITLE
- // Abstract representation of ACE tokens.
- //
- // = DESCRIPTION
- // Not a public interface.
- //
- // Currently, I don't see a reason for providing an abstract
- // interface at this level of the library. As of yet, no one
- // uses <ACE_Tokens< derivatives through this abstract interface
- // except for <ACE_Token_Manager>. It only uses the statistical
- // methods which are shared by all Tokens. For that reason, it
- // still makes since to have a common base class. However,
- // acquire, renew, and release do not need to have matching
- // interfaces throughout all Tokens.
- //
- // To add a new type of token (e.g. semaphore), this class must
- // be subtyped to define the new semantics. See
- // <ACE_Token_Manager> for details.
-public:
-
- ACE_Tokens (void);
- // Null constructor.
-
- virtual int acquire (ACE_TPQ_Entry *caller,
- int ignore_deadlock,
- int notify) = 0;
- // No implementation.
-
- virtual int tryacquire (ACE_TPQ_Entry *caller) = 0;
- // No implementation.
-
- virtual int renew (ACE_TPQ_Entry *caller,
- int requeue_position) = 0;
- // No implementation.
-
- virtual int release (ACE_TPQ_Entry *caller) = 0;
- // No implementation.
-
- void make_owner (ACE_TPQ_Entry *caller);
- // Move the caller to the front of the waiter list. This is for use
- // with remote mutexes and shadow mutexes.
-
- void remove (ACE_TPQ_Entry *caller);
- // Remove the caller from the waiter list.
-
- // = Accessor methods.
-
- typedef ACE_Unbounded_Stack<ACE_TPQ_Entry *> OWNER_STACK;
- // Stack of owners.
-
- virtual int owners (OWNER_STACK &o, const char *id) = 0;
- // Returns a stack of the current owners. Returns -1 on error, 0 on
- // success. If <id> is non-zero, returns 1 if id is an owner.
-
- virtual int is_waiting_for (const char *id) = 0;
- // Returns 1 if <id> is waiting for this token. 0 otherwise.
-
- virtual int is_owner (const char *id) = 0;
- // Returns 1 if <id> is an owner of this token. 0 otherwise.
-
- virtual ACE_Token_Proxy_Queue *waiters (void);
- // Return the queue of waiters.
-
- virtual int no_of_waiters (void);
- // Return the number of proxies that are currently waiting to get
- // the token.
-
- const char *owner_id (void);
- // The current owner.
-
- const char* name (void);
- // Token name.
-
- // = Reference counting. These are only called by the
- // Token_Manager.
- void inc_reference (void);
- int dec_reference (void);
-
- void dump (void) const;
- // Dump the state of the class.
-
- enum TOKEN_TYPES { MUTEX, RWLOCK };
- // These are the Token types supported by the library at ship time.
- // There is no restriction on the number of Token types added by
- // "3rd parties." These are only necessary for the Token Server.
-
- virtual int type (void) const = 0;
- // Provides a manual RTTI mechanism. This method is used only by
- // ACE_Token_Request so that the type of a token can be sent to a
- // remote Token Server.
-
- // = The following methods allow the deadlock detection algorithm to
- // check if this token has been visited.
-
- void visit (int v);
- // Mark or unmark the token as visited.
-
- int visited (void);
- // Check if the token has been visited.
-
- ACE_TPQ_Entry *owner (void);
- // All the data of the current owner.
-
-protected:
-
- int visited_;
- // For the deadlock detection algorithm.
-
- int reference_count_;
- // Reference count.
-
- ACE_Token_Proxy_Queue waiters_;
- // List of client's owning and waiting the token.
-
- char token_name_[ACE_MAXTOKENNAMELEN];
- // Name of token.
-};
-
-class ACE_Local_Mutex;
-
-// 6..
-class ACE_Export ACE_Mutex_Token : public ACE_Tokens
-{
- // = TITLE
- // Class that acquires, renews, and releases a process-local
- // synchronization token.
- //
- // = DESCRIPTION
- // Not a public interface.
- //
- // This class is a more general-purpose synchronization mechanism
- // than SunOS 5.x mutexes. For example, it implements "recursive
- // mutex" semantics, where a thread that owns the token can
- // reacquire it without deadlocking. In addition, threads that
- // are blocked awaiting the token are serviced in strict FIFO
- // order as other threads release the token (SunOS 5.x mutexes
- // don't strictly enforce an acquisition order).
-public:
- ACE_Mutex_Token (const char* name);
- // life
-
- virtual ~ACE_Mutex_Token (void);
- // death
-
- // = Synchronization operations.
- // With acquire, renew, and release, the caller must be specified so
- // that multiple proxies (e.g. ACE_Local_Mutex) can use the same
- // token.
-
- virtual int acquire (ACE_TPQ_Entry *caller,
- int ignore_deadlock,
- int notify);
- // Returns 0 on success, -1 on failure with ACE_LOG_MSG->errnum() as
- // the reason. If errnum == EWOULDBLOCK, and notify == 1,
- // ACE_Token_Proxy::sleep_hook() has been called on the current owner
- // of the token. If ignore_deadlock is passed as 1 and errnum ==
- // EDEADLK, then deadlock was detected via ace_token_manager.
-
- virtual int tryacquire (ACE_TPQ_Entry *caller);
- // same as acquire, but fails if would block
-
- virtual int renew (ACE_TPQ_Entry *caller,
- int requeue_position);
- // 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 at the end of the list of waiters. 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...
- // Returns 0 on success, -1 on failure with ACE_LOG_MSG->errnum() as
- // the reason. If errnum == EWOULDBLOCK, and notify == 1,
- // ACE_Token_Proxy::sleep_hook() has been called on the current owner
- // of the token.
-
- virtual int release (ACE_TPQ_Entry *caller);
- // Relinquish the token. If there are any waiters then the next one
- // in line gets it. If the caller is not the owner, caller is
- // removed from the waiter list.
-
- void dump (void) const;
- // Dump the state of the class.
-
- virtual int type (void) const;
- // Returns ACE_Tokens::MUTEX.
-
- virtual int owners (OWNER_STACK &o, const char *id);
- // Returns a stack of the current owners. Returns -1 on error, 0 on
- // success. If <id> is non-zero, returns 1 if id is an owner.
-
- virtual int is_waiting_for (const char *id);
- // Returns 1 if <id> is waiting for this token. 0 otherwise.
-
- virtual int is_owner (const char *id);
- // Returns 1 if <id> is an owner of this token. 0 otherwise.
-
-private:
- ACE_TOKEN_CONST::MUTEX lock_;
- // ACE_Mutex_Token used to lock internal data structures.
-};
-
-// 12..
-class ACE_Export ACE_RW_Token : public ACE_Tokens
-{
- // = TITLE
- // Class that acquires, renews, and releases a process-local
- // synchronization token.
- //
- // = DESCRIPTION
- // Not a public interface.
- //
- // This class is a more general-purpose synchronization mechanism
- // than SunOS 5.x mutexes. For example, it implements "recursive
- // mutex" semantics, where a thread that owns the token can
- // reacquire it without deadlocking. In addition, threads that are
- // blocked awaiting the token are serviced in strict FIFO order as
- // other threads release the token (SunOS 5.x mutexes don't strictly
- // enforce an acquisition order).
-public:
- ACE_RW_Token (const char* name);
- // Life.
-
- virtual ~ACE_RW_Token (void);
- // Death.
-
- // = Synchronization operations.
- // With acquire, renew, and release, the caller must be specified so
- // that multiple proxies (e.g. ACE_Local_Mutex) can use the same
- // token.
-
- virtual int acquire (ACE_TPQ_Entry *caller,
- int ignore_deadlock,
- int notify);
- // Returns 0 on success, -1 on failure with ACE_LOG_MSG->errnum() as
- // the reason. If errnum == EWOULDBLOCK, and notify == 1,
- // ACE_Token_Proxy::sleep_hook() has been called on the current owner
- // of the token. If ignore_deadlock is passed as 1 and errnum ==
- // EDEADLK, then deadlock was detected via ace_token_manager.
-
- virtual int tryacquire (ACE_TPQ_Entry *caller);
- // same as acquire except fails on would block
-
- virtual int renew (ACE_TPQ_Entry *caller,
- int requeue_position);
- // 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 at the end of the list of waiters. 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...
- // Returns 0 on success, -1 on failure with ACE_LOG_MSG->errnum() as
- // the reason. If errnum == EWOULDBLOCK, and notify == 1,
- // ACE_Token_Proxy::sleep_hook() has been called on the current owner
- // of the token.
-
- virtual int release (ACE_TPQ_Entry *caller);
- // Relinquish the token. If there are any waiters then the next one
- // in line gets it. If the caller is not the owner, caller is
- // removed from the waiter list.
-
- void dump (void) const;
- // Dump the state of the class.
-
- enum PROXY_TYPE { READER, WRITER };
- // These are the types that proxies can be.
-
- virtual int type (void) const;
- // Returns READER or WRITER.
-
- virtual int owners (OWNER_STACK &o, const char *id);
- // Returns a stack of the current owners. Returns -1 on error, 0 on
- // success. If <id> is non-zero, returns 1 if id is an owner.
-
- virtual int is_waiting_for (const char *id);
- // Returns 1 if <id> is waiting for this token. 0 otherwise.
-
- virtual int is_owner (const char *id);
- // Returns 1 if <id> is an owner of this token. 0 otherwise.
-
-protected:
- int num_writers_;
- // the number of waiting writers.
-
- ACE_TOKEN_CONST::MUTEX lock_;
- // ACE_Mutex_Token used to lock internal data structures.
-
- void notify_new_owner (ACE_TPQ_Entry *caller);
- // Sets the new owner.
-};
-
-// a..
-class ACE_Token_Name
-{
- // = TITLE
- // Allows Token_Manger to identify tokens.
- //
- // = DESCRIPTION
- // For now, this is just a string. We need a string class
- // anyway to use in <ACE_Map_Manager>. Having this class
- // (instead of <ACE_SString>) allows us to easily change if
- // needed. For instance, we may choose to identify tokens by
- // name and *type* in the future.
-public:
- ACE_Token_Name (const char *token_name = 0);
- // Construction.
-
- ACE_Token_Name (const ACE_Token_Name &rhs);
- // Copy construction.
-
- virtual ~ACE_Token_Name (void);
- // Death.
-
- void operator= (const ACE_Token_Name &rhs);
- // Copy.
-
- int operator== (const ACE_Token_Name &rhs) const;
- // Comparison.
-
- const char *name (void) const;
- // Token name.
-
- void name (const char *new_name);
- // Token name.
-
- void dump (void) const;
- // Dump the state of the class.
-
-private:
- char token_name_[ACE_MAXTOKENNAMELEN];
- // Name of the token.
-};
-
-// 7..
-class ACE_Export ACE_Token_Proxy
-{
- // = TITLE
- // Abstract representation of ACE tokens.
- //
- // = DESCRIPTION
- // Interface for all Tokens in ACE. This class implements the
- // synchronization needed for tokens (condition variables etc.)
- // The algorithms for the operations (acquire, release, etc.)
- // operate on the generic ACE_Tokens interface. Thus, the _type_
- // of token (mutex, rwlock) can be set at construction of
- // ACE_Token_Proxy. You can use all Tokens in ACE through the
- // ACE_Token_Proxy by passing the proper values at construction.
- // Alternatively, there are class definitions which "know" how to
- // do this (ACE_Local_Mutex, ACE_Local_RLock, ACE_Local_WLock).
- //
- // To add a new type of token (e.g. semaphore), this class is not
- // changed. See ACE_Token_Manager for details.
- //
- // Tokens (e.g. ACE_Mutex_Token) assume that it can always call
- // ACE_Token_Proxy::token_acquired () on a new token owner. This
- // is not a problem for synchronous use of token proxies (that is,
- // when acquires block until successful.) However, for
- // implementations of the Token Server, which may use asynch
- // operations, the proxy can not go away after an acquire until
- // the token is acquired. This is not really a problem, but
- // should be understood.
-public:
- friend class ACE_Token_Manager;
- friend class ACE_Token_Invariant_Manager; // For testing.
-
- // Initialization and termination methods.
- ACE_Token_Proxy (void);
- // Construction.
-
- virtual ~ACE_Token_Proxy (void);
- // Death.
-
- virtual int open (const char *name,
- int ignore_deadlock = 0,
- int debug = 0);
- // <name> is the string uniquely identifying the token.
- // <ignore_deadlock> can be 1 to disable deadlock notifications.
- // <debug> prints debug messages.
-
- // = The following methods have implementations which are
- // independent of the token semantics (mutex, rwlock, etc.) They
- // forward operations to the underlying token and perform the
- // necessary blocking semantics for operations (condition variables
- // etc.) This allows reuse of the blocking code as well as having
- // multiple proxies to the same token.
-
- virtual int acquire (int notify = 0,
- void (*sleep_hook)(void *) = 0,
- ACE_Synch_Options &options =
- ACE_Synch_Options::defaults);
- // Calls acquire on the token. Blocks the calling thread if would
- // block.
-
- virtual int renew (int requeue_position = -1,
- ACE_Synch_Options &options =
- ACE_Synch_Options::defaults);
- // Calls renew on the token. Blocks the calling thread if would
- // block.
-
- virtual int tryacquire (void (*sleep_hook)(void *) = 0);
- // Calls renew on the token.
-
- virtual int release (ACE_Synch_Options &options =
- ACE_Synch_Options::defaults);
- // Calls release on the token.
-
- virtual int remove (ACE_Synch_Options &options =
- ACE_Synch_Options::defaults);
- // Calls remove on the token.
-
- virtual int acquire_read (int notify = 0,
- void (*sleep_hook)(void *) = 0,
- ACE_Synch_Options &options =
- ACE_Synch_Options::defaults);
- // Since the locking mechanism doesn't support read locks then this
- // just calls <acquire>.
-
- virtual int acquire_write (int notify = 0,
- void (*sleep_hook)(void *) = 0,
- ACE_Synch_Options &options =
- ACE_Synch_Options::defaults);
- // Since the locking mechanism doesn't support write locks then this
- // just calls <acquire>.
-
- virtual int tryacquire_read (void (*sleep_hook)(void *) = 0);
- // Since the locking mechanism doesn't support read locks then this
- // just calls <tryacquire>.
-
- virtual int tryacquire_write (void (*sleep_hook)(void *) = 0);
- // Since the locking mechanism doesn't support write locks then this
- // just calls <tryacquire>.
-
- // = Utility methods.
-
- virtual const char *client_id (void) const;
- // Get the client id of the proxy. This is implemented as
- // thread-specific data.
-
- virtual void client_id (const char *client_id);
- // Set the client_id for the calling thread. I strongly recommend
- // that this not be used unless you really know what you're doing.
- // I use this in the Token Server, and it caused many headaches.
-
- virtual const char *name (void) const;
- // Return the name of the token. This is important for use within
- // the token servers (local and remote) as well as with token
- // collections. So, all derivations of ACE_Token_Proxy must be able to
- // stringify some name. The name must uniquely identify a token.
- // So, for instance, the token within the reactor should probably be
- // called "Reactor Token."
-
- virtual void sleep_hook (void);
- // This should really be called someone_waiting ().
- // This is called by ACE_Token_xx's when another proxy enters the
- // waiting list and requests that the current token holder be notified.
-
- virtual void token_acquired (ACE_TPQ_Entry *);
- // This is called when a queued (waiting) proxy is removed from the
- // waiters list and given the token.
-
- virtual const char *owner_id (void);
- // the client id of the current token holder
-
- virtual ACE_Token_Proxy *clone (void) const = 0;
- // Return a dynamically allocated clone of the derived class.
-
- void dump (void) const;
- // Dump the state of the class.
-
- virtual int type (void) const;
- // This method can be used be Tokens (e.g. Readers/Writer Tokens) to
- // distinguish between Proxy types. For instance a Reader proxy
- // should return a different type value than a Writer proxy. The
- // default implementation returns 0.
-
-protected:
- ACE_Token_Proxy (const ACE_Token_Proxy &);
- // Duplication.
-
- int ignore_deadlock_;
- // If this is set, we ignore deadlock.
-
- int debug_;
- // Print a bunch of debug messages.
-
- ACE_Tokens *token_;
- // Reference to the actual logical token. Many ACE_Local_Mutex
- // proxies can reference the same ACE_Mutex_Token.
-
- int handle_options (ACE_Synch_Options &options,
- ACE_TOKEN_CONST::COND_VAR &cv);
- // Handles cond_var waits.
-
- ACE_TSS_TPQ_Entry waiter_;
- // Waiter info used for asynchronous transactions.
-
- virtual ACE_Tokens *create_token (const char *name) = 0;
- // Make the correct type of ACE_Tokens. This is called by the Token
- // Manager.
-};
-
-// 8..
-class ACE_Export ACE_Null_Token : public ACE_Token_Proxy
-{
- // = TITLE
- // No op class for nonthreaded platform protocols.
-public:
- ACE_Null_Token (void) {};
- // Construction.
-
- virtual int acquire (int /* notify */ = 0,
- void (* /* sleep_hook */ )(void *) = 0,
- ACE_Synch_Options & /* options */ =
- ACE_Synch_Options::defaults) { return 0; }
- // Acquire.
-
- virtual int renew (int /* requeue_position */ = -1,
- ACE_Synch_Options & /* options */ =
- ACE_Synch_Options::defaults) { return 0; }
- // Renew.
-
- virtual int tryacquire (void (* /* sleep_hook */)(void *) = 0) { return 0; }
- // Try acquire.
-
- virtual int release (ACE_Synch_Options & /* options */ =
- ACE_Synch_Options::defaults) { return 0; }
- // Release.
-
- virtual int remove (ACE_Synch_Options & /* options */ =
- ACE_Synch_Options::defaults) { return 0; }
- // Remove.
-
- virtual ACE_Token_Proxy *clone (void) const { return new ACE_Null_Token; }
- // Return a dynamically allocated clone of the derived class.
-
- void dump (void) const;
- // Dump the state of the class.
-
- virtual ACE_Tokens *create_token (const char *) { return 0; }
- // Do not allow the Token Manager to create us.
-};
-
-// 9..
-class ACE_Export ACE_Local_Mutex : public ACE_Token_Proxy
-{
- // = TITLE
- // Class that acquires, renews, and releases a synchronization
- // token local to the process.
- //
- // = DESCRIPTION
- // This class is a more general-purpose synchronization mechanism
- // than SunOS 5.x mutexes. For example, it implements "recursive
- // mutex" semantics, where a thread that owns the token can
- // reacquire it without deadlocking. In addition, threads that
- // are blocked awaiting the token are serviced in strict FIFO
- // order as other threads release the token (SunOS 5.x mutexes
- // don't strictly enforce an acquisition order). Lastly,
- // ACE_Local_Mutex performs deadlock detection on acquire calls.
- //
- // The interfaces for acquire, tryacquire, renew, release,
- // etc. are defined in ACE_Token_Proxy. The semantics for
- // ACE_Local_Mutex are that of a mutex.
-public:
- ACE_Local_Mutex (const char *token_name = 0,
- int ignore_deadlock = 0,
- int debug = 0);
- // <token_name> uniquely id's the token.
- // <ignore_deadlock> will allow deadlock to occur (useful for
- // testing). <debug> prints a bunch of messages.
-
- void dump (void) const;
- // Dump the state of the class.
-
- virtual ACE_Token_Proxy *clone (void) const;
- // Return deep copy.
-
-protected:
- virtual ACE_Tokens *create_token (const char *name);
- // Return a new ACE_Local_Mutex.
-};
-
-// *.
-class ACE_Export ACE_Local_RLock : public ACE_Token_Proxy
-{
- // = TITLE
- // Class that acquires, renews, and releases a readers lock that
- // is local to the process.
- //
- // = DESCRIPTION
- // This class implements the reader interface to canonical
- // readers/writer locks. Multiple readers can hold the lock
- // simultaneously when no writers have the lock. Alternatively,
- // when a writer holds the lock, no other participants (readers
- // or writers) may hold the lock. This class is a more
- // general-purpose synchronization mechanism than SunOS 5.x
- // RLocks. For example, it implements "recursive RLock"
- // semantics, where a thread that owns the token can reacquire it
- // without deadlocking. In addition, threads that are blocked
- // awaiting the token are serviced in strict FIFO order as other
- // threads release the token (SunOS 5.x RLockes don't strictly
- // enforce an acquisition order).
- //
- // The interfaces for acquire, tryacquire, renew, release,
- // etc. are defined in ACE_Token_Proxy. The semantics for
- // ACE_Local_RLock are that of a readers/writers lock. Acquire
- // for this class implies a reader acquisition. That is,
- // multiple clients may acquire a lock for read only.
-public:
- // = Initialization and termination.
-
- ACE_Local_RLock (const char *token_name = 0,
- int ignore_deadlock = 0,
- int debug = 0);
- // <token_name> uniquely id's the token.
- // <ignore_deadlock> will allow deadlock to occur (useful for
- // testing). <debug> prints a bunch of messages.
-
- void dump (void) const;
- // Dump the state of the class.
-
- virtual int type (void) const;
- // Returns ACE_RW_Token::RLOCK.
-
- virtual ACE_Token_Proxy *clone (void) const;
- // Return deep copy.
-
-protected:
- virtual ACE_Tokens *create_token (const char *name);
- // Return a new ACE_Local_Mutex.
-};
-
-// *.
-class ACE_Export ACE_Local_WLock : public ACE_Token_Proxy
-{
- // = TITLE
- // Class that acquires, renews, and releases a writer lock that
- // is local to the process.
- //
- // = DESCRIPTION
- // This class implements the writer interface to canonical
- // readers/writer locks. Multiple readers can hold the lock
- // simultaneously when no writers have the lock. Alternatively,
- // when a writer holds the lock, no other participants (readers
- // or writers) may hold the lock. This class is a more
- // general-purpose synchronization mechanism than SunOS 5.x
- // WLock. For example, it implements "recursive WLock"
- // semantics, where a thread that owns the token can reacquire it
- // without deadlocking. In addition, threads that are blocked
- // awaiting the token are serviced in strict FIFO order as other
- // threads release the token (SunOS 5.x WLocks don't strictly
- // enforce an acquisition order).
- //
- // The interfaces for acquire, tryacquire, renew, release,
- // etc. are defined in ACE_Token_Proxy. The semantics for
- // ACE_Local_WLock are that of a readers/writers lock. Acquire
- // for this class implies a writer acquisition. That is, only
- // one client may hold the lock for writing.
-public:
- // = Initialization and termination.
-
- ACE_Local_WLock (const char *token_name = 0,
- int ignore_deadlock = 0,
- int debug = 0);
- // <token_name> uniquely id's the token.
- // <ignore_deadlock> will allow deadlock to occur (useful for
- // testing). <debug> prints a bunch of messages.
-
- void dump (void) const;
- // Dump the state of the class.
-
- virtual int type (void) const;
- // Returns ACE_RW_Token::WLOCK.
-
- virtual ACE_Token_Proxy *clone (void) const;
- // Return deep copy.
-
-protected:
- ACE_Tokens *create_token (const char *name);
- // Return a new ACE_Local_Mutex.
-};
-
-#if defined (__ACE_INLINE__)
-#include "ace/Local_Tokens.i"
-#endif /* __ACE_INLINE__ */
-#endif /* ACE_LOCAL_MUTEX_H */