// -*- C++ -*- //========================================================================== /** * @file Reverse_Lock_T.h * * @author Douglas C. Schmidt */ //========================================================================== #ifndef ACE_REVERSE_LOCK_T_H #define ACE_REVERSE_LOCK_T_H #include /**/ "ace/pre.h" #include "ace/Lock.h" #if !defined (ACE_LACKS_PRAGMA_ONCE) # pragma once #endif /* ACE_LACKS_PRAGMA_ONCE */ ACE_BEGIN_VERSIONED_NAMESPACE_DECL /** * @namespace ACE_Acquire_Method * * @brief An enum namespace. * * These enums should have been inside the reverse lock class, but * some lame compilers cannot handle enums inside template classes. * * The METHOD_TYPE is used to indicate which acquire() method will be * called on the real lock when the release() method is called on the * reverse lock. REGULAR indicated the acquire() method, READ * indicates the acquire_read() method, and WRITE indicates the * acquire_write() method. Note that the try_*() methods are not * represented here because we have to make sure that the release() * method on the reverse lock acquires a lock on the real lock. **/ namespace ACE_Acquire_Method { enum METHOD_TYPE { ACE_REGULAR, ACE_READ, ACE_WRITE }; } /** * @class ACE_Reverse_Lock * * @brief A reverse (or anti) lock. * * This is an interesting adapter class that changes a lock into * a reverse lock, i.e., on this class calls * on the lock, and on this class calls on * the lock. * One motivation for this class is when we temporarily want to * release a lock (which we have already acquired) but then * reacquire it soon after. An alternative design would be to * add a Anti_Guard or Reverse_Guard class which would * on construction and destruction. However, there * are *many* varieties of the Guard class and this design * choice would lead to at least 6 new classes. One new * ACE_Reverse_Lock class seemed more reasonable. */ template class ACE_Reverse_Lock : public ACE_Lock { public: typedef ACE_LOCKING_MECHANISM ACE_LOCK; // = Initialization/Finalization methods. /// Constructor. All locking requests will be forwarded to @a lock. ACE_Reverse_Lock (ACE_LOCKING_MECHANISM &lock, ACE_Acquire_Method::METHOD_TYPE acquire_method = ACE_Acquire_Method::ACE_REGULAR); /// Destructor. If was not passed in by the user, it will be /// deleted. virtual ~ACE_Reverse_Lock (); // = Lock accessors. /// Release the lock. virtual int acquire (); /// Release the lock. virtual int tryacquire (); /// Acquire the lock. virtual int release (); /// Release the lock. virtual int acquire_read (); /// Release the lock. virtual int acquire_write (); /// Release the lock. virtual int tryacquire_read (); /// Release the lock. virtual int tryacquire_write (); /// Release the lock. virtual int tryacquire_write_upgrade (); /// Explicitly destroy the lock. virtual int remove (); private: /// The concrete locking mechanism that all the methods delegate to. ACE_LOCKING_MECHANISM &lock_; /// This indicates what kind of acquire method will be called. ACE_Acquire_Method::METHOD_TYPE acquire_method_; }; ACE_END_VERSIONED_NAMESPACE_DECL #if defined (__ACE_INLINE__) #include "ace/Reverse_Lock_T.inl" #endif /* __ACE_INLINE__ */ #if defined (ACE_TEMPLATES_REQUIRE_SOURCE) #include "ace/Reverse_Lock_T.cpp" #endif /* ACE_TEMPLATES_REQUIRE_SOURCE */ #if defined (ACE_TEMPLATES_REQUIRE_PRAGMA) #pragma implementation ("Reverse_Lock_T.cpp") #endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */ #include /**/ "ace/post.h" #endif /* ACE_REVERSE_LOCK_T_H */