summaryrefslogtreecommitdiff
path: root/ACE/TAO/tao/Wait_On_LF_No_Upcall.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/TAO/tao/Wait_On_LF_No_Upcall.cpp')
-rw-r--r--ACE/TAO/tao/Wait_On_LF_No_Upcall.cpp111
1 files changed, 111 insertions, 0 deletions
diff --git a/ACE/TAO/tao/Wait_On_LF_No_Upcall.cpp b/ACE/TAO/tao/Wait_On_LF_No_Upcall.cpp
new file mode 100644
index 00000000000..4d9c205610b
--- /dev/null
+++ b/ACE/TAO/tao/Wait_On_LF_No_Upcall.cpp
@@ -0,0 +1,111 @@
+// $Id$
+
+#include "tao/Wait_On_LF_No_Upcall.h"
+
+#include "tao/Transport.h"
+#include "tao/ORB_Core.h"
+#include "tao/ORB_Core_TSS_Resources.h"
+#include "tao/debug.h"
+
+ACE_RCSID(tao,
+ Wait_On_LF_No_Upcall,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Transport;
+namespace TAO
+{
+ /**
+ * @class Nested_Upcall_Guard
+ *
+ * @brief: Magic class that sets the status of the thread in the
+ * TSS.
+ *
+ */
+ class Nested_Upcall_Guard
+ {
+ public:
+ // Maybe we should instead just take in a ptr to
+ // TAO_ORB_Core_TSS_Resources? Or at least ORB_Core*?
+ Nested_Upcall_Guard (TAO_Transport *t)
+ : t_ (t)
+ {
+ TAO_ORB_Core_TSS_Resources *tss =
+ t_->orb_core ()->get_tss_resources ();
+
+ tss->upcalls_temporarily_suspended_on_this_thread_ = true;
+
+ if (TAO_debug_level > 6)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO (%P|%t) - Wait_On_LF_No_Upcall::wait "
+ "disabling upcalls on thread %t\n"));
+ }
+
+ ~Nested_Upcall_Guard (void)
+ {
+ TAO_ORB_Core_TSS_Resources *tss = t_->orb_core ()->get_tss_resources ();
+
+ tss->upcalls_temporarily_suspended_on_this_thread_ = false;
+
+ if (TAO_debug_level > 6)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO (%P|%t) - Wait_On_LF_No_Upcall::wait "
+ "re-enabling upcalls on thread %t\n"));
+ }
+ }
+
+ private:
+
+ Nested_Upcall_Guard (void)
+ {
+ }
+
+ /// Disallow copying and assignment.
+ Nested_Upcall_Guard (const Nested_Upcall_Guard&);
+ Nested_Upcall_Guard &operator= (const Nested_Upcall_Guard&);
+
+ private:
+
+ /// Pointer to the transport that we plan to use.
+ TAO_Transport *t_;
+ };
+
+
+ //=================================================================
+
+ Wait_On_LF_No_Upcall::Wait_On_LF_No_Upcall (TAO_Transport *t)
+ : base (t)
+ {
+ }
+
+ Wait_On_LF_No_Upcall::~Wait_On_LF_No_Upcall (void)
+ {
+ }
+
+ int
+ Wait_On_LF_No_Upcall::wait (ACE_Time_Value *max_wait_time,
+ TAO_Synch_Reply_Dispatcher &rd)
+ {
+ Nested_Upcall_Guard upcall_guard (this->transport_);
+
+ return base::wait (max_wait_time, rd);
+ }
+
+ bool
+ Wait_On_LF_No_Upcall::can_process_upcalls (void) const
+ {
+ TAO_ORB_Core_TSS_Resources *tss =
+ this->transport_->orb_core ()->get_tss_resources ();
+
+ if ((this->transport_->opened_as () == TAO::TAO_CLIENT_ROLE) &&
+ (this->transport_->bidirectional_flag () == 0) &&
+ (tss->upcalls_temporarily_suspended_on_this_thread_))
+ return false;
+
+ return true;
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL