diff options
Diffstat (limited to 'examples/APG/ThreadPools/LF_ThreadPool.cpp')
-rw-r--r-- | examples/APG/ThreadPools/LF_ThreadPool.cpp | 264 |
1 files changed, 0 insertions, 264 deletions
diff --git a/examples/APG/ThreadPools/LF_ThreadPool.cpp b/examples/APG/ThreadPools/LF_ThreadPool.cpp deleted file mode 100644 index 2e85ed41b3c..00000000000 --- a/examples/APG/ThreadPools/LF_ThreadPool.cpp +++ /dev/null @@ -1,264 +0,0 @@ -// $Id$ - -#include "ace/config-lite.h" -#if defined (ACE_HAS_THREADS) - -#include "ace/OS_NS_string.h" -#include "ace/OS_NS_sys_time.h" -#include "ace/Task.h" -#include "ace/Containers.h" -#include "ace/Synch.h" - -// Listing 4 code/ch16 -class Follower -{ -public: - Follower (ACE_Thread_Mutex &leader_lock) - : cond_(leader_lock) - { - owner_ = ACE_Thread::self (); - } - - int wait (void) - { - return this->cond_.wait (); - } - - int signal (void) - { - return this->cond_.signal (); - } - - ACE_thread_t owner (void) - { - return this->owner_; - } - -private: - ACE_Condition<ACE_Thread_Mutex> cond_; - ACE_thread_t owner_; -}; -// Listing 4 -// Listing 1 code/ch16 -class LF_ThreadPool : public ACE_Task<ACE_MT_SYNCH> -{ -public: - LF_ThreadPool () : shutdown_(0), current_leader_(0) - { - ACE_TRACE (ACE_TEXT ("LF_ThreadPool::TP")); - } - - virtual int svc (void); - - void shut_down (void) - { - shutdown_ = 1; - } - -private: - int become_leader (void); - - Follower *make_follower (void); - - int elect_new_leader (void); - - int leader_active (void) - { - ACE_TRACE (ACE_TEXT ("LF_ThreadPool::leader_active")); - return this->current_leader_ != 0; - } - - void leader_active (ACE_thread_t leader) - { - ACE_TRACE (ACE_TEXT ("LF_ThreadPool::leader_active")); - this->current_leader_ = leader; - } - - void process_message (ACE_Message_Block *mb); - - int done (void) - { - return (shutdown_ == 1); - } - -private: - int shutdown_; - ACE_thread_t current_leader_; - ACE_Thread_Mutex leader_lock_; - ACE_Unbounded_Queue<Follower*> followers_; - ACE_Thread_Mutex followers_lock_; - static long LONG_TIME; -}; -// Listing 1 -// Listing 2 code/ch16 -int -LF_ThreadPool::svc (void) -{ - ACE_TRACE (ACE_TEXT ("LF_ThreadPool::svc")); - while (!done ()) - { - become_leader (); // Block until this thread is the leader. - - ACE_Message_Block *mb = 0; - ACE_Time_Value tv (LONG_TIME); - tv += ACE_OS::gettimeofday (); - - // Get a message, elect new leader, then process message. - if (this->getq (mb, &tv) < 0) - { - if (elect_new_leader () == 0) - break; - continue; - } - - elect_new_leader (); - process_message (mb); - } - - return 0; -} -// Listing 2 -// Listing 3 code/ch16 -int -LF_ThreadPool::become_leader (void) -{ - ACE_TRACE (ACE_TEXT ("LF_ThreadPool::become_leader")); - - ACE_GUARD_RETURN - (ACE_Thread_Mutex, leader_mon, this->leader_lock_, -1); - if (leader_active ()) - { - Follower *fw = make_follower (); - { - // Wait until told to do so. - while (leader_active ()) - fw->wait (); - } - - delete fw; - } - - ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) Becoming the leader\n"))); - - // Mark yourself as the active leader. - leader_active (ACE_Thread::self ()); - return 0; -} - -Follower* -LF_ThreadPool::make_follower (void) -{ - ACE_TRACE (ACE_TEXT ("LF_ThreadPool::make_follower")); - - ACE_GUARD_RETURN - (ACE_Thread_Mutex, follower_mon, this->followers_lock_, 0); - Follower *fw; - ACE_NEW_RETURN (fw, Follower (this->leader_lock_), 0); - this->followers_.enqueue_tail (fw); - return fw; -} -// Listing 3 -// Listing 5 code/ch16 -int -LF_ThreadPool::elect_new_leader (void) -{ - ACE_TRACE (ACE_TEXT ("LF_ThreadPool::elect_new_leader")); - - ACE_GUARD_RETURN - (ACE_Thread_Mutex, leader_mon, this->leader_lock_, -1); - leader_active (0); - - // Wake up a follower - if (!followers_.is_empty ()) - { - ACE_GUARD_RETURN (ACE_Thread_Mutex, - follower_mon, - this->followers_lock_, - -1); - // Get the old follower. - Follower *fw; - if (this->followers_.dequeue_head (fw) != 0) - return -1; - ACE_DEBUG ((LM_ERROR, - ACE_TEXT ("(%t) Resigning and Electing %d\n"), - fw->owner ())); - return (fw->signal () == 0) ? 0 : -1; - } - else - { - ACE_DEBUG - ((LM_ERROR, ACE_TEXT ("(%t) Oops no followers left\n"))); - return -1; - } -} -// Listing 5 - -void -LF_ThreadPool::process_message (ACE_Message_Block *mb) -{ - ACE_TRACE (ACE_TEXT ("LF_ThreadPool::process_message")); - int msgId; - ACE_OS::memcpy (&msgId, mb->rd_ptr (), sizeof(int)); - mb->release (); - - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("(%t) Started processing message:%d\n"), - msgId)); - ACE_OS::sleep (1); - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("(%t) Finished processing message:%d\n"), - msgId)); -} - -long LF_ThreadPool::LONG_TIME = 5L; - -int ACE_TMAIN (int, ACE_TCHAR *[]) -{ - LF_ThreadPool tp; - tp.activate (THR_NEW_LWP| THR_JOINABLE, 5); - - // Wait for a few seconds... - ACE_OS::sleep (2); - ACE_Time_Value tv (1L); - - ACE_Message_Block *mb; - for (int i = 0; i < 30; i++) - { - ACE_NEW_RETURN (mb, ACE_Message_Block (sizeof(int)), -1); - ACE_OS::memcpy (mb->wr_ptr (), &i, sizeof(int)); - ACE_OS::sleep (tv); - - // Add a new work item. - tp.putq (mb); - } - - ACE_Thread_Manager::instance ()->wait (); - - ACE_OS::sleep (10); - - return 0; -} - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -template class ACE_Condition<ACE_Thread_Mutex>; -template class ACE_Node<Follower*>; -template class ACE_Unbounded_Queue<Follower*>; -template class ACE_Unbounded_Queue_Iterator<Follower*>; -#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) -#pragma instantiate ACE_Condition<ACE_Thread_Mutex> -#pragma instantiate ACE_Node<Follower*> -#pragma instantiate ACE_Unbounded_Queue<Follower*> -#pragma instantiate ACE_Unbounded_Queue_Iterator<Follower*> -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ - -#else -#include "ace/OS_main.h" -#include "ace/OS_NS_stdio.h" - -int ACE_TMAIN (int, ACE_TCHAR *[]) -{ - ACE_OS::puts (ACE_TEXT ("This example requires threads.")); - return 0; -} - -#endif /* ACE_HAS_THREADS */ |