/* -*- C++ -*- */ // $Id$ // ============================================================================ // // = LIBRARY // ace // // = FILENAME // CORBA_Handler.h // // = AUTHOR // Douglas C. Schmidt (schmidt@cs.wustl.edu) and // Irfan Pyarali (irfan@wuerl.wustl.edu). // // ============================================================================ #if !defined (_CORBA_HANDLER_H) #define _CORBA_HANDLER_H #include "ace/Service_Config.h" #include "ace/Pipe.h" #if (defined (ACE_HAS_ORBIX) && (ACE_HAS_ORBIX != 0)) || (defined (ACE_HAS_MT_ORBIX) && (ACE_HAS_MT_ORBIX != 0)) #define EXCEPTIONS #define WANT_ORBIX_FDS #include /**/ // #include /**/ #undef EXCEPTIONS #undef WANT_ORBIX_FDS #if defined (ACE_WIN32) && !defined (ACE_ORBIX_HAS_NAMESPACES) #define ACE_CORBA_1(NAME) CORBA_##NAME #define ACE_CORBA_2(TYPE, NAME) CORBA_##TYPE##_##NAME #define ACE_CORBA_3(TYPE, NAME) CORBA_##TYPE##::##NAME #else #define ACE_CORBA_1(NAME) CORBA::##NAME #define ACE_CORBA_2(TYPE, NAME) CORBA::##TYPE##::##NAME #define ACE_CORBA_3(TYPE, NAME) CORBA::##TYPE##::##NAME #endif /* ACE_WIN32 */ class ACE_Export ACE_CORBA_Handler : public ACE_Service_Object // = TITLE // Handle CORBA requests in conjunction with ACE. // // = DESCRIPTION // Note, do *NOT* inherit from this class! Instead, use the // and as // Singletons. { public: // = Activation and deactivation methods. virtual int activate_service (const char *service_name, const char *marker_name = 0, const char *service_location = 0); // Activate and register with the Orbix daemon. If // and are != 0 then do a "putit" // to register this service with orbixd. This method also // increments the reference count of active services using the // ACE_ST_CORBA_Handler. virtual int deactivate_service (const char *service_name = 0, const char *marker_name = 0); // Decrement the reference count and free up all the // resources if this is the last service to be using // the ACE_ST_CORBA_Handler... void dump (void) const; // Dump the state of an object. ACE_ALLOC_HOOK_DECLARE; // Declare the dynamic allocation hooks. void reactor (ACE_Reactor *); // Set the reactor instance. ACE_Reactor *reactor (void) ; // Get the reactor instance. protected: ACE_CORBA_Handler (void); // Make this into an "abstract" class... virtual ~ACE_CORBA_Handler (void); // Note virtual destructor... virtual int register_service (const char *service_name, const char *marker_name, const char *service_location); // Register by doing a "putit" to register // the using the at // with orbixd. virtual int remove_service (const char *service_name, const char *marker_name = 0); // Register by doing a "putit" to register // using the with orbixd. ACE_Reactor *reactor_; // Event demultiplexor used by ACE_ST_CORBA_Handler ssize_t reference_count_; // Keep track of the number of active CORBA_Handlers. private: // = Disallow assignment and initialization. ACE_CORBA_Handler (const ACE_CORBA_Handler &rhs); const ACE_CORBA_Handler &operator= (const ACE_CORBA_Handler &rhs); }; class ACE_Export ACE_ST_CORBA_Handler : public ACE_CORBA_Handler // = TITLE // Handle single-threaded CORBA requests in conjunction with the // . { public: // = Singleton access point. static ACE_CORBA_Handler *instance (void); // Returns a Singleton. // = Demuxing hook. virtual int handle_input (ACE_HANDLE); // Process the next Orbix event. // = Dynamic linking hooks. virtual int suspend (void); // Atomically suspend all the threads associated with the . virtual int resume (void); // Atomically resume all the threads associated with the . // = Iterations dictate # of calls per-callback. size_t iterations (void); // Get the current iteration. void iterations (size_t); // Set the current iteration. void dump (void) const; // Dump the state of an object. ACE_ALLOC_HOOK_DECLARE; // Declare the dynamic allocation hooks. protected: void get_orbix_descriptors (void); // Preinitialize any descriptors that Orbix is using. This is // called in instance (). ACE_ST_CORBA_Handler (void); // Constructors (ensure Singleton...). virtual ~ACE_ST_CORBA_Handler (void); // Destructor cleans up resources. static void insert_handle (ACE_HANDLE); // Insert a descriptor into the ACE_Reactor that Orbix has just added. static void remove_handle (ACE_HANDLE); // Remove a descriptor from the ACE_Reactor that Orbix has just deleted. static ACE_ST_CORBA_Handler *instance_; // ACE_ST_CORBA_Handler is a singleton object. size_t iterations_; // Number of iterations to process per processNextEvent() call. }; #if defined (ACE_HAS_MT_ORBIX) && (ACE_HAS_MT_ORBIX != 0) class ACE_Export ACE_MT_CORBA_Handler : public ACE_CORBA_Handler, public ACE_CORBA_1 (ThreadFilter) // = TITLE // Handle multi-threaded CORBA requests in conjunction with the // . { public: // = Singleton access point. static ACE_CORBA_Handler *instance (void); // Returns a Singleton. // = Demuxing hook. virtual int handle_input (ACE_HANDLE); // Process the next Orbix event. // = Threading hook. void thr_mgr (ACE_Thread_Manager *tm); // Set the Thread_Manager used by ACE_MT_CORBA_Handler ACE_Thread_Manager *thr_mgr (void) const; // Get the Thread_Manager used by ACE_MT_CORBA_Handler // = Dynamic linking hooks. virtual int suspend (void); // Atomically suspend all the threads associated with the . virtual int resume (void); // Atomically resume all the threads associated with the . void dump (void) const; // Dump the state of an object. ACE_ALLOC_HOOK_DECLARE; // Declare the dynamic allocation hooks. protected: static void *process_events (void *); // function executed by new thread ACE_MT_CORBA_Handler (void); // Constructors (ensure Singleton...). virtual ~ACE_MT_CORBA_Handler (void); // Destructor cleans up resources. virtual int inRequestPreMarshal (ACE_CORBA_1 (Request) &r, ACE_CORBA_1 (Environment) &IT_env = ACE_CORBA_1 (default_environment)); // Take the incoming request and pass it to this->handle_input() but // through the Reactor. static ACE_MT_CORBA_Handler *instance_; // ACE_MT_CORBA_Handler is a singleton object. ACE_Thread_Manager *thr_mgr_; // Event demultiplexor used by ACE_ST_CORBA_Handler. ACE_Pipe pipe_; // Used to send CORBA::Requests through the server #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0) static u_int ace_mt_corba_handler_lock_; // Double-Check lock identifier. #endif /* ACE_MT_SAFE */ }; #endif /* ACE_HAS_MT_ORBIX */ #if defined (__ACE_INLINE__) #include "ace/CORBA_Handler.i" #endif /* __ACE_INLINE__ */ #endif /* ACE_HAS_ORBIX */ #endif /* ACE_CORBA_HANDLER_H */