diff options
author | Steve Huston <shuston@riverace.com> | 1999-09-01 16:22:39 +0000 |
---|---|---|
committer | Steve Huston <shuston@riverace.com> | 1999-09-01 16:22:39 +0000 |
commit | 0d8b0815ca149309a2d4febecdfdf472dc9f41ab (patch) | |
tree | 361874e35a8e9bd98d116530f53bef19db712d42 /ace/CORBA_Handler.cpp | |
parent | dde8e64e4ed5029660e4036db16b6d3a0086df99 (diff) | |
download | ATCD-0d8b0815ca149309a2d4febecdfdf472dc9f41ab.tar.gz |
ChangeLogTag:Wed Sep 01 11:55:31 1999 Steve Huston <shuston@riverace.com>
Diffstat (limited to 'ace/CORBA_Handler.cpp')
-rw-r--r-- | ace/CORBA_Handler.cpp | 66 |
1 files changed, 58 insertions, 8 deletions
diff --git a/ace/CORBA_Handler.cpp b/ace/CORBA_Handler.cpp index 5ae478cc84e..fa23bc594b0 100644 --- a/ace/CORBA_Handler.cpp +++ b/ace/CORBA_Handler.cpp @@ -4,10 +4,7 @@ #define ACE_BUILD_DLL #include "ace/CORBA_Handler.h" -#if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0) -# include "ace/Object_Manager.h" -#endif /* ACE_MT_SAFE */ - +#include "ace/Object_Manager.h" #include "ace/Thread_Manager.h" #if !defined (__ACE_INLINE__) @@ -70,6 +67,14 @@ ACE_CORBA_Handler::ACE_CORBA_Handler (void) /* static */ ACE_ST_CORBA_Handler *ACE_ST_CORBA_Handler::instance_ = 0; +#if defined (ACE_TAKEOVER_ORBIX_CALLBACKS) +// Define the class statics +int ACE_ST_CORBA_Handler::set_callbacks_ = 0; +OrbixIOCallback ACE_ST_CORBA_Handler::previous_orbix_open_callback_ = 0; +OrbixIOCallback ACE_ST_CORBA_Handler::previous_orbix_close_callback_ = 0; +#endif /* ACE_TAKEOVER_ORBIX_CALLBACKS */ + + // Insert a descriptor into the ACE_Reactor that Orbix has just added. /* static */ @@ -79,6 +84,14 @@ ACE_ST_CORBA_Handler::insert_handle (ACE_HANDLE handle) ACE_TRACE ("ACE_ST_CORBA_Handler::insert_handle"); // ACE_DEBUG ((LM_DEBUG, ASYS_TEXT ("+++ inserting %d\n"), handle)); +#if defined (ACE_TAKEOVER_ORBIX_CALLBACKS) + if (ACE_ST_CORBA_Handler::previous_orbix_open_callback_ != 0) + ACE_ST_CORBA_Handler::previous_orbix_open_callback_ (handle); +#endif /* ACE_TAKEOVER_ORBIX_CALLBACKS */ + + if (ACE_ST_CORBA_Handler::instance_ == 0) + return; + if (ACE_ST_CORBA_Handler::instance_->reactor() != 0) ACE_ST_CORBA_Handler::instance_->reactor()->register_handler (handle, ACE_ST_CORBA_Handler::instance_, ACE_Event_Handler::READ_MASK); @@ -96,6 +109,14 @@ ACE_ST_CORBA_Handler::remove_handle (ACE_HANDLE handle) ACE_TRACE ("ACE_ST_CORBA_Handler::remove_handle"); // ACE_DEBUG ((LM_DEBUG, ASYS_TEXT ("--- removing %d\n"), handle)); +#if defined (ACE_TAKEOVER_ORBIX_CALLBACKS) + if (ACE_ST_CORBA_Handler::previous_orbix_close_callback_ != 0) + ACE_ST_CORBA_Handler::previous_orbix_close_callback_ (handle); +#endif /* ACE_TAKEOVER_ORBIX_CALLBACKS */ + + if (ACE_ST_CORBA_Handler::instance_ == 0) + return; + if (ACE_ST_CORBA_Handler::instance_->reactor () != 0) ACE_ST_CORBA_Handler::instance_->reactor ()->remove_handler (handle, ACE_Event_Handler::READ_MASK | ACE_Event_Handler::DONT_CALL); @@ -104,6 +125,15 @@ ACE_ST_CORBA_Handler::remove_handle (ACE_HANDLE handle) // ACE_DEBUG ((LM_DEBUG, ASYS_TEXT ("remove_handle: reactor NULL\n"))); } +/* static */ +void ACE_ST_CORBA_Handler::instance_cleaner (void *object, void *param) +{ + ACE_UNUSED_ARG (param); + delete ACE_reinterpret_cast (ACE_ST_CORBA_Handler *, object); + return; +} + + // Process the next Orbix event. int @@ -176,10 +206,20 @@ ACE_ST_CORBA_Handler::ACE_ST_CORBA_Handler (void) // Set up the callbacks so that we get informed when Orbix changes // its descriptors. - ACE_CORBA_1 (Orbix.registerIOCallback) ((OrbixIOCallback) &ACE_ST_CORBA_Handler::insert_handle, - FD_OPEN_CALLBACK); - ACE_CORBA_1 (Orbix.registerIOCallback) ((OrbixIOCallback) &ACE_ST_CORBA_Handler::remove_handle, - FD_CLOSE_CALLBACK); + OrbixIOCallback old_open, old_close; + + old_open = ACE_CORBA_1 (Orbix.registerIOCallback) ((OrbixIOCallback) &ACE_ST_CORBA_Handler::insert_handle, + FD_OPEN_CALLBACK); + old_close = ACE_CORBA_1 (Orbix.registerIOCallback) ((OrbixIOCallback) &ACE_ST_CORBA_Handler::remove_handle, + FD_CLOSE_CALLBACK); +#if defined (ACE_TAKEOVER_ORBIX_CALLBACKS) + if (ACE_ST_CORBA_Handler::set_callbacks_ == 0) + { + ACE_ST_CORBA_Handler::previous_orbix_open_callback = old_open; + ACE_ST_CORBA_Handler::previous_orbix_close_callback = old_close; + ACE_ST_CORBA_Handler::set_callbacks_ = 1; + } +#endif } void @@ -309,6 +349,16 @@ ACE_ST_CORBA_Handler::instance (void) ACE_NEW_RETURN (ACE_ST_CORBA_Handler::instance_, ACE_ST_CORBA_Handler, 0); + // Set up so that instance_cleaner() is called to destroy the instance + // at program shutdown when the static objects are destroyed. + // This should be _before_ the singleton reactor is destroyed since + // cleanup objects are destroyed in LIFO order, and if the reactor + // is not yet created, it will be by ACE_CORBA_Handler's constructor, + // executed during ACE_NEW_RETURN, above. + ACE_Object_Manager::at_exit (ACE_ST_CORBA_Handler::instance_, + &ACE_ST_CORBA_Handler::instance_cleaner, + 0); + ACE_ST_CORBA_Handler::instance_->get_orbix_descriptors (); } |