diff options
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/LWFT/SSA_AMI_Handler.cpp')
-rw-r--r-- | TAO/orbsvcs/orbsvcs/LWFT/SSA_AMI_Handler.cpp | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/LWFT/SSA_AMI_Handler.cpp b/TAO/orbsvcs/orbsvcs/LWFT/SSA_AMI_Handler.cpp new file mode 100644 index 00000000000..dccdc21fb90 --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/LWFT/SSA_AMI_Handler.cpp @@ -0,0 +1,156 @@ +#include "SSA_AMI_Handler.h" +#include <ace/Guard_T.h> + + +SSA_AMI_Handler::SSA_AMI_Handler() + : accumulated_results_(0), + success_(true) + //phase_end_condition_(phase_wait_mutex_) +{} + +bool SSA_AMI_Handler::wait_for_results(size_t expected_results, ACE_Time_Value abstime) +{ + if(expected_results == 0) + return true; + + ACE_Time_Value tv(0, 100), total(0,0); + while(true) + { + ami_result_lock_.acquire(); + if((accumulated_results_ >= expected_results) || (total > abstime)) + { + ami_result_lock_.release(); + break; + } + else + { + ami_result_lock_.release(); + ACE_OS::sleep(tv); + total += tv; + } + } + if(total > abstime) + return false; + else + return success_; +} + +void SSA_AMI_Handler::precommit_state(CORBA::Boolean b) +{ + ACE_Guard<ACE_Thread_Mutex> guard(ami_result_lock_); + success_ &= (b ? 1 : 0); + ++accumulated_results_; +} + +void SSA_AMI_Handler::precommit_state_excep(Messaging::ExceptionHolder*) +{ + ACE_Guard<ACE_Thread_Mutex> guard(ami_result_lock_); + success_ = false; + ++accumulated_results_; +} + +void SSA_AMI_Handler::commit_state() +{ + ACE_Guard<ACE_Thread_Mutex> guard(ami_result_lock_); + success_ &= true; + ++accumulated_results_; +} + +void SSA_AMI_Handler::commit_state_excep(Messaging::ExceptionHolder*) +{ + ACE_Guard<ACE_Thread_Mutex> guard(ami_result_lock_); + success_ = false; + ++accumulated_results_; +} + +void SSA_AMI_Handler::transfer_state() +{ + ACE_ERROR ((LM_EMERGENCY, + "(%P|%t) SSA_AMI_Handler::transfer_state () " + "for the application %s\n")); + ACE_Guard<ACE_Thread_Mutex> guard(ami_result_lock_); + success_ &= true; + ++accumulated_results_; +} + +void SSA_AMI_Handler::transfer_state_excep(Messaging::ExceptionHolder*) +{ + ACE_Guard<ACE_Thread_Mutex> guard(ami_result_lock_); + success_ = false; + ++accumulated_results_; +} + + +/* +SSA_AMI_Handler::SSA_AMI_Handler() + : ssa_invoked_(0), + success_(true), + phase_end_condition_(phase_wait_mutex_) +{} + +bool SSA_AMI_Handler::wait_for_results(const ACE_Time_Value *abstime) +{ + if(!ssa_invoked_) + return false; + else if(phase_end_condition_.wait(phase_wait_mutex_, abstime) == -1) + return false; + else + return success_; +} + +void SSA_AMI_Handler::ssa_invoked() +{ + ACE_Guard<ACE_Thread_Mutex> guard(ami_result_lock_); + ++ssa_invoked_; +} + +void SSA_AMI_Handler::release() +{ + --ssa_invoked_; + + if((ssa_invoked_ == 0) || !success_) + phase_end_condition_.broadcast(); +} + +void SSA_AMI_Handler::precommit_state(CORBA::Boolean b) +{ + ACE_Guard<ACE_Thread_Mutex> guard(ami_result_lock_); + success_ &= (b ? 1 : 0); + release(); +} + +void SSA_AMI_Handler::precommit_state_excep(Messaging::ExceptionHolder*) +{ + ACE_Guard<ACE_Thread_Mutex> guard(ami_result_lock_); + success_ = false; + release(); +} + +void SSA_AMI_Handler::commit_state() +{ + ACE_Guard<ACE_Thread_Mutex> guard(ami_result_lock_); + success_ &= true; + release(); +} + +void SSA_AMI_Handler::commit_state_excep(Messaging::ExceptionHolder*) +{ + ACE_Guard<ACE_Thread_Mutex> guard(ami_result_lock_); + success_ = false; + release(); +} + +void SSA_AMI_Handler::transfer_state() +{ + ACE_Guard<ACE_Thread_Mutex> guard(ami_result_lock_); + success_ &= true; + release(); +} + +void SSA_AMI_Handler::transfer_state_excep(Messaging::ExceptionHolder*) +{ + ACE_Guard<ACE_Thread_Mutex> guard(ami_result_lock_); + success_ = false; + release(); +} + */ |