/* -*- C++ -*- */ //============================================================================= /** * @file Future_Set.h * * $Id$ * * @author John Tucker */ //============================================================================= #ifndef ACE_FUTURE_SET_H #define ACE_FUTURE_SET_H #include /**/ "ace/pre.h" #include "ace/Thread.h" #include "ace/Message_Queue.h" #include "ace/Future.h" #include "ace/Hash_Map_Manager_T.h" #include "ace/Null_Mutex.h" #if !defined (ACE_LACKS_PRAGMA_ONCE) #pragma once #endif /* ACE_LACKS_PRAGMA_ONCE */ #if defined (ACE_HAS_THREADS) /** * @class ACE_Future_Set * * @brief This class implements a mechanism which allows the values of * a collection of ACE_Future objects to be accessed by reader threads * as they become available. The caller(s) provide the ACE_Future_Set * (i.e. the observer...) with the collection of ACE_Future objects * (i.e. the subjects...) that are to be observed using the * the ACE_Future_Set::insert() method. The caller(s) may then iterate * over the collection in the order in which they become readable using * the ACE_Future_Set::next_readable() method. */ template class ACE_Future_Set : public ACE_Future_Observer { public: // = Initialization and termination methods. /// Constructor. ACE_Future_Set (ACE_Message_Queue *future_notification_queue_ = 0); /// Destructor. ~ACE_Future_Set (void); /** * Return 1 if their are no ACE_Future objects left on its queue and * 0 otherwise. * * When an ACE_Future_Set has no ACE_Future>subjects to observe it is * empty. The ACE_Future_Set is in the empty state when either the caller(s) * have retrieved every readable ACE_Future subject assigned the * ACE_Future_Set via the ACE_Future_Set::next_readable() method, * or when the ACE_Future_Set has not been assigned any subjects. */ int is_empty (void) const; /** * Enqueus the given ACE_Future into this objects queue when it is * readable. * * Returns 0 if the future is successfully inserted, 1 if the * future is already inserted, and -1 if failures occur. */ int insert (ACE_Future &future); /** * Wait up to time to get the . Note that must be * specified in absolute time rather than relative time.); get the * next that is readable. If = 0, the will block * forever. * * If a readable future becomes available, then the input * object param will be assigned with it and 1 will * be returned. If the is empty (i.e. see definition * of ), then 0 is returned. * * When a readable object is retrieved via the * method, the will * remove that object from its list of subjects. */ int next_readable (ACE_Future &result, ACE_Time_Value *tv = 0); /// Called by the ACE_Future subject in which we are subscribed to /// when its value is written to. virtual void update (const ACE_Future &future); /// Declare the dynamic allocation hooks. ACE_ALLOC_HOOK_DECLARE; private: // = Disallow these operations. ACE_UNIMPLEMENTED_FUNC (void operator= (const ACE_Future_Set &)) ACE_UNIMPLEMENTED_FUNC (ACE_Future_Set (const ACE_Future_Set &)) typedef ACE_Future FUTURE; typedef ACE_Future_Rep FUTURE_REP; typedef ACE_Future_Holder FUTURE_HOLDER; typedef ACE_Pointer_Hash FUTURE_REP_HASH; typedef ACE_Equal_To FUTURE_REP_COMPARE; typedef ACE_Hash_Map_Manager_Ex FUTURE_HASH_MAP; /// Map of , subjects, which have not been written to by /// client's writer thread. FUTURE_HASH_MAP future_map_; /// Message queue for notifying the reader thread of which /// have been written to by client's writer thread. ACE_Message_Queue *future_notification_queue_; /// Keeps track of whether we need to delete the message queue. int delete_queue_; }; #if defined (ACE_TEMPLATES_REQUIRE_SOURCE) #include "ace/Future_Set.cpp" #endif /* ACE_TEMPLATES_REQUIRE_SOURCE */ #if defined (ACE_TEMPLATES_REQUIRE_PRAGMA) #pragma implementation ("Future_Set.cpp") #endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */ #endif /* ACE_HAS_THREADS */ #include /**/ "ace/post.h" #endif /* ACE_FUTURE_SET_H */