diff options
author | coryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1999-05-20 02:36:46 +0000 |
---|---|---|
committer | coryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1999-05-20 02:36:46 +0000 |
commit | 0c68595ddd5452680d878e40b69160135d2abc97 (patch) | |
tree | 4d7c80bab3de76d6f6183a70a1c7966161c00fd5 | |
parent | 495760cb16e65fa22e312d8bd35e8c14225f756f (diff) | |
download | ATCD-0c68595ddd5452680d878e40b69160135d2abc97.tar.gz |
Added several @@ comments for Fred and Ossama
-rw-r--r-- | TAO/tao/Acceptor_Registry.cpp | 36 | ||||
-rw-r--r-- | TAO/tao/Acceptor_Registry.h | 12 | ||||
-rw-r--r-- | TAO/tao/Connect.cpp | 5 | ||||
-rw-r--r-- | TAO/tao/IIOP_Acceptor.cpp | 19 | ||||
-rw-r--r-- | TAO/tao/IIOP_Acceptor.h | 4 | ||||
-rw-r--r-- | TAO/tao/IIOP_Connector.cpp | 3 | ||||
-rw-r--r-- | TAO/tao/IIOP_Factory.cpp | 3 | ||||
-rw-r--r-- | TAO/tao/IIOP_Factory.h | 3 | ||||
-rw-r--r-- | TAO/tao/IIOP_Transport.h | 12 | ||||
-rw-r--r-- | TAO/tao/ORB.cpp | 38 | ||||
-rw-r--r-- | TAO/tao/ORB_Core.cpp | 26 | ||||
-rw-r--r-- | TAO/tao/ORB_Core.h | 6 | ||||
-rw-r--r-- | TAO/tao/Pluggable.cpp | 10 | ||||
-rw-r--r-- | TAO/tao/Pluggable.h | 12 |
14 files changed, 133 insertions, 56 deletions
diff --git a/TAO/tao/Acceptor_Registry.cpp b/TAO/tao/Acceptor_Registry.cpp index 18b00e266eb..186870cc812 100644 --- a/TAO/tao/Acceptor_Registry.cpp +++ b/TAO/tao/Acceptor_Registry.cpp @@ -21,6 +21,9 @@ TAO_Acceptor_Registry::~TAO_Acceptor_Registry (void) TAO_Acceptor * TAO_Acceptor_Registry::get_acceptor (CORBA::ULong tag) { + // @@ Fred&Ossama: Since this is going to be a common operation you + // may want to consider using a Hash_Map_Manager, or even a + // simple Map_Manager. TAO_AcceptorSetItor end = this->acceptors_.end (); @@ -38,11 +41,20 @@ TAO_Acceptor_Registry::get_acceptor (CORBA::ULong tag) int TAO_Acceptor_Registry::open (TAO_ORB_Core *orb_core) { + // @@ Fred&Ossama: This is not the problem you have to solve right + // now, but we thought about giving explicit names to each + // endpoint, the user could then use those names to setup + // policies in the ORB that indicate which endpoints are served + // by which thread. + // IMHO that is one more reason to keep a list of endpoints in + // the ORB_Core, instead of a string. + // BTW, that also removes the restriction of using ';' in the + // addresses. Just my two cents. // protocol_factories is in the following form // IOP1://addr1,addr2,...,addrN/;IOP2://addr1,...addrM/;... - ACE_Auto_Basic_Array_Ptr <char> + ACE_Auto_Basic_Array_Ptr <char> str (orb_core->orb_params ()->endpoints ().rep ()); ACE_Auto_Basic_Array_Ptr <char> addr_str; @@ -52,7 +64,7 @@ TAO_Acceptor_Registry::open (TAO_ORB_Core *orb_core) iop_str != 0; iop_str = ACE_OS::strtok_r (0, ";", &last_iop)) { - + ACE_CString iop (iop_str); int indx = iop.find ("://", 0); if ( indx == iop.npos) @@ -61,12 +73,12 @@ TAO_Acceptor_Registry::open (TAO_ORB_Core *orb_core) "(%P|%t) Invalid endpoint epecification.\n"), -1); } - + ACE_CString prefix = iop.substring (0, indx); ACE_CString addrs = iop.substring (indx+3); if (addrs [addrs.length () - 1] == '/') addrs [addrs.length () - 1] = '\0'; // get rid of trailing / - + char *last_addr=0; addr_str.reset (addrs.rep ()); for (char *astr = ACE_OS::strtok_r (addr_str.get (), ",", &last_addr); @@ -76,16 +88,16 @@ TAO_Acceptor_Registry::open (TAO_ORB_Core *orb_core) &last_addr)) { ACE_CString address (astr); - + // Now get the list of avaliable protocol factories. - TAO_ProtocolFactorySetItor end = + TAO_ProtocolFactorySetItor end = orb_core->protocol_factories ()->end (); - TAO_ProtocolFactorySetItor factory = + TAO_ProtocolFactorySetItor factory = orb_core->protocol_factories ()->begin (); - + TAO_Acceptor *acceptor; - for (acceptor = 0 ; - factory != end ; + for (acceptor = 0 ; + factory != end ; factory++) { if ((*factory)->factory ()->match_prefix (prefix)) @@ -100,7 +112,7 @@ TAO_Acceptor_Registry::open (TAO_ORB_Core *orb_core) break; } - else + else { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) Unable to create an acceptor for %s\n", @@ -133,4 +145,4 @@ template class ACE_Unbounded_Set_Iterator<TAO_Acceptor*>; #pragma instantiate ACE_Unbounded_Set_Iterator<TAO_Acceptor*>; -#endif +#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ diff --git a/TAO/tao/Acceptor_Registry.h b/TAO/tao/Acceptor_Registry.h index d8123f228a7..6cc7f0d1a9e 100644 --- a/TAO/tao/Acceptor_Registry.h +++ b/TAO/tao/Acceptor_Registry.h @@ -38,6 +38,14 @@ class TAO_Resource_Factory; typedef ACE_Unbounded_Set<TAO_Acceptor*> TAO_AcceptorSet; +// @@ Fred&Ossama: Even though ye typing fingers may ache the DOC +// group style (or lack of it) is to call this stuff +// TAO_AcceptorSetIterator (not Itor). +// You may want to define this typedef inside the Acceptor_Registry +// to avoid namespace pollution. This is specially true since you +// don't export the Iterator (or the set) in the class interface, +// and it is only used in the implementation. +// typedef ACE_Unbounded_Set_Iterator<TAO_Acceptor*> TAO_AcceptorSetItor; @@ -78,7 +86,9 @@ public: int open (TAO_ORB_Core *orb_core); // Initialize all registered acceptors. Return -1 on error. - + // @@ Fred&Ossama: What is the relationship between the ORB_Core and + // the Acceptor_Registry? Is there just one per orb core? Should + // tbe acceptor registry know which ORB_Core it belongs to? private: TAO_AcceptorSet acceptors_; diff --git a/TAO/tao/Connect.cpp b/TAO/tao/Connect.cpp index ac7f0d601b2..3d2a39f76fe 100644 --- a/TAO/tao/Connect.cpp +++ b/TAO/tao/Connect.cpp @@ -1416,6 +1416,11 @@ TAO_MT_Client_Connection_Handler::resume_handler (ACE_Reactor *reactor) // **************************************************************** +// @@ Fred&Ossama: Could somebody please check up the location of +// these template instantiations? For example the Hash_Map from +// ACE_INET_Addr to TAO_Object_Adapter does not seems to belong in +// this file, maybe in ORB.cpp??? + #define TAO_SVC_TUPLE ACE_Svc_Tuple<TAO_Client_Connection_Handler> #define CACHED_CONNECT_STRATEGY ACE_Cached_Connect_Strategy<TAO_Client_Connection_Handler, TAO_SOCK_CONNECTOR, TAO_Cached_Connector_Lock> #define REFCOUNTED_HASH_RECYCLABLE_ADDR ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> diff --git a/TAO/tao/IIOP_Acceptor.cpp b/TAO/tao/IIOP_Acceptor.cpp index adf76b86c0d..eafaaa979ac 100644 --- a/TAO/tao/IIOP_Acceptor.cpp +++ b/TAO/tao/IIOP_Acceptor.cpp @@ -25,6 +25,17 @@ TAO_IIOP_Acceptor::TAO_IIOP_Acceptor (void) { } +// @@ Fred&Ossama: Maybe not for the current round of changes, but +// shouldn't the acceptor know which version to create? +// And isn't this the right place to setup the tagged components of +// a v1.[12] profile? + +// @@ Fred&Ossama: We need to check this interface: a single +// TAO_Acceptor may be bound to multiple addresses (think of a +// multihomed machine with an acceptor listening on the wildcard +// address), hence the "Right Thing" seems to be that we pass an +// MProfile that is filled up by the TAO_Acceptor class. + TAO_Profile * TAO_IIOP_Acceptor::create_profile (TAO_ObjectKey &object_key) { @@ -67,8 +78,14 @@ TAO_IIOP_Acceptor::open (TAO_ORB_Core *orb_core, if (base_acceptor_.acceptor ().get_local_addr (new_address) == -1) return -1; + // @@ Fred&Ossama: Does this call make any sense now? There is + // no such thing as the ORB address anymore, right? And if + // this is removed then this whole branch of the if() + // statement is a noop. + // Reset the address orb_core->orb_params ()->addr (new_address); + // iiop_acceptor->acceptor ().enable (ACE_CLOEXEC); // this is done in the connection handlers open method. @@ -81,5 +98,3 @@ TAO_IIOP_Acceptor::open (TAO_ORB_Core *orb_core, } return 0; } - - diff --git a/TAO/tao/IIOP_Acceptor.h b/TAO/tao/IIOP_Acceptor.h index 973e61c8678..8f8c1b5d523 100644 --- a/TAO/tao/IIOP_Acceptor.h +++ b/TAO/tao/IIOP_Acceptor.h @@ -25,6 +25,8 @@ #include "tao/Pluggable.h" #include "tao/Connect.h" +// @@ Fred&Ossama: Could we make this a typedef inside the +// IIOP_Acceptor class? typedef ACE_Strategy_Acceptor<TAO_Server_Connection_Handler, TAO_SOCK_ACCEPTOR> TAO_IIOP_BASE_ACCEPTOR; @@ -39,7 +41,7 @@ class TAO_Export TAO_IIOP_Acceptor : public TAO_Acceptor // // = DESCRIPTION // The IIOP-specific bridge class for the concrete acceptor. - // + // public: // TAO_IIOP_Acceptor (ACE_INET_Addr &addr); // Create Acceptor object using addr. diff --git a/TAO/tao/IIOP_Connector.cpp b/TAO/tao/IIOP_Connector.cpp index 8d3d8289756..09c3fcdf4d6 100644 --- a/TAO/tao/IIOP_Connector.cpp +++ b/TAO/tao/IIOP_Connector.cpp @@ -223,7 +223,7 @@ TAO_IIOP_Connector::make_profile (const char *endpoint, // // or: // - // //host:port/object_key + // //host:port/object_key ACE_NEW_RETURN (profile, TAO_IIOP_Profile (endpoint, ACE_TRY_ENV), @@ -260,6 +260,7 @@ TAO_IIOP_Connector::check_prefix (const char *endpoint) // Failure: not an IIOP IOR // DO NOT throw an exception here. } + // @@ Fred&Ossama: Could we just write return 1 outside the else? } diff --git a/TAO/tao/IIOP_Factory.cpp b/TAO/tao/IIOP_Factory.cpp index 979d933dd51..a07ea60ad7c 100644 --- a/TAO/tao/IIOP_Factory.cpp +++ b/TAO/tao/IIOP_Factory.cpp @@ -36,7 +36,7 @@ TAO_IIOP_Protocol_Factory::make_acceptor (void) return acceptor; } -int +int TAO_IIOP_Protocol_Factory::init (int argc, char* argv[]) { return 0; @@ -62,4 +62,3 @@ ACE_STATIC_SVC_DEFINE (TAO_IIOP_Protocol_Factory, 0) ACE_FACTORY_DEFINE (TAO, TAO_IIOP_Protocol_Factory) - diff --git a/TAO/tao/IIOP_Factory.h b/TAO/tao/IIOP_Factory.h index 93c39d191d7..07f1f60a5d9 100644 --- a/TAO/tao/IIOP_Factory.h +++ b/TAO/tao/IIOP_Factory.h @@ -36,10 +36,11 @@ public: virtual int init (int argc, char* argv[]); // Dynamic linking hook + // @@ Fred&Ossama: Shouldn't we use a plain const char* here? virtual int match_prefix (const ACE_CString &prefix); // verify prefix is a match - // Factory methods + // Factory methods virtual TAO_Acceptor *make_acceptor (void); // create an acceptor diff --git a/TAO/tao/IIOP_Transport.h b/TAO/tao/IIOP_Transport.h index 9c1b1c6b654..8cbbfbbc7b1 100644 --- a/TAO/tao/IIOP_Transport.h +++ b/TAO/tao/IIOP_Transport.h @@ -31,8 +31,8 @@ class TAO_ORB_Core; class TAO_Export TAO_IIOP_Transport : public TAO_Transport { // = TITLE - // This class acts as a bridge class to the transport specific - // connection handler (handler_). + // This class acts as a bridge class to the transport specific + // connection handler (handler_). // // = DESCRIPTION // Specialization of the base TAO_Transport class to handle the IIOP @@ -40,13 +40,13 @@ class TAO_Export TAO_IIOP_Transport : public TAO_Transport // the client and server side. public: TAO_IIOP_Transport (TAO_IIOP_Handler_Base *handler); - // Base object's creator method. + // Base object's creator method. ~TAO_IIOP_Transport (void); // Default destructor. CORBA::ULong tag (void); - // Returns the specific IOP instance, in this case UIOP. + // Returns the specific IOP instance, in this case IIOP. void close_connection (void); // Call the corresponding connection handlers handle_close method. @@ -118,7 +118,7 @@ class TAO_Export TAO_IIOP_Client_Transport : public TAO_IIOP_Transport // = TITLE // The Transport class used for Client side communication with a // server. - // + // // = DESCRIPTION // Specialization of the TAO_IIOP_Transport class for client // side. Methods related to sending one and two way requests @@ -167,7 +167,7 @@ public: // Default destructor TAO_Server_Connection_Handler *server_handler (void); - // Return a pointer to the underlying connection handler. + // Return a pointer to the underlying connection handler. private: TAO_Server_Connection_Handler *server_handler_; diff --git a/TAO/tao/ORB.cpp b/TAO/tao/ORB.cpp index 9c98f3ea0e6..32ac1994e57 100644 --- a/TAO/tao/ORB.cpp +++ b/TAO/tao/ORB.cpp @@ -195,19 +195,11 @@ CORBA_ORB::open (void) TAO_Server_Strategy_Factory *f = this->orb_core_->server_factory (); - // @@ For now we simple assume an IIOP handler, in the future - // @@ this has to be more general - // @@ Fred: right, this is my idea for this stuff: - // Using the Connector Registry try every endpoint listed in the - // orb_params(), for each one create a TAO_Acceptor [check the - // Pluggable.h file for a description on how to do that], - // activate the acceptor with the reactor and insert it in the - // Acceptor Registry. TAO_Acceptor_Registry *ar = this->orb_core_->acceptor_registry (); // get a reference to the acceptor_registry! - // Initialize the endpoint ... the registry will use the orb_core_ - // to obtain a list of endpoints and strategies! + // Initialize all the endpoints ... the registry will use the + // orb_core_ to obtain a list of endpoints and strategies! if (ar->open (this->orb_core_) == -1) // Need to return an error somehow!! Maybe set do_exit? @@ -960,14 +952,24 @@ CORBA_ORB::create_stub_object (const TAO_ObjectKey &key, this->orb_core_->orb_params (); // @@ Ug, broken. Again, we need to go to the acceptor registry - // (when we got one) for this!!! [fredk] + // (when we got one) for this!!! [fredk] + // @@ Fred&Ossama: You guys have one now ;-) I still believe that + // the right way to do this is something along these lines: + // + // size_t pfile_count = + // this->orb_core_->acceptor_registry ()->count_profiles (); + // TAO_MProfile mp (pfile_count); + // this->orb_core_->acceptor_registry ()->fill_mprofile (key); + // + // What do you think? + TAO_IIOP_Profile *pfile; ACE_NEW_THROW_EX (pfile, TAO_IIOP_Profile (orb_params->host (), orb_params->addr ().get_port_number (), key, orb_params->addr ()), - CORBA::NO_MEMORY (TAO_DEFAULT_MINOR_CODE, + CORBA::NO_MEMORY (TAO_DEFAULT_MINOR_CODE, CORBA::COMPLETED_MAYBE)); ACE_CHECK_RETURN (stub); // we give up the profile to the mp object. If the mp object is deleted, @@ -1418,7 +1420,14 @@ CORBA_ORB::string_to_object (const char *str, obj = this->ior_string_to_object (str + sizeof ior_prefix - 1, ACE_TRY_ENV); else - { + { + // @@ Fred&Ossama: Is there anyway to initialize the mprofile in + // such a way that it does not allocate memory? + // The connector registry could count how many profiles are + // there (if any) and then allocate all the memory in one + // call, saving precious microseconds in an area of the code + // that is invoked only once ;-) + TAO_MProfile mprofile (1); // It is safe to declare this on the stack since the contents of // mprofile get copied. @@ -1842,6 +1851,9 @@ CORBA_ORB::lookup_value_factory (const char *repository_id, // **************************************************************** +// @@ Fred&Ossama: I'm convinced that you ended up moving template +// instantiations from here to the Connect.cpp file. + #define CACHED_CONNECT_STRATEGY ACE_Cached_Connect_Strategy<TAO_Client_Connection_Handler, TAO_SOCK_CONNECTOR, TAO_Cached_Connector_Lock> #define REFCOUNTED_HASH_RECYCLABLE_ADDR ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> diff --git a/TAO/tao/ORB_Core.cpp b/TAO/tao/ORB_Core.cpp index afd3fb661e0..e94095a12db 100644 --- a/TAO/tao/ORB_Core.cpp +++ b/TAO/tao/ORB_Core.cpp @@ -241,12 +241,16 @@ TAO_ORB_Core::init (int &argc, char *argv[]) // per protocol bases. Especially since a IP name will have // no meaning for say ATM or UNIX domain or Bus based I/O // @@ Rather than specify a hostname and port number for the - // server, one or more endpoints should be specified. An + // server, one or more endpoints should be specified. An // endpoint will have the following format: // IOP:[major.minor]//address1,address2,...,addressn/ // so for IIOP this would be: // iiop://myhost_ether:5050,myhost_atm:6060/ // fredk. + // @@ Fred&Ossama: I think the option should just die or + // simply have the same effect as an extra -ORBendpoint + // i.e. simply add another endpoin to the list in + // orb_params(). // Specify the name of the host (i.e., interface) on which // the server should listen. @@ -401,11 +405,11 @@ TAO_ORB_Core::init (int &argc, char *argv[]) // For example, specify -ORBpreconnect once for each protocol // -ORBpreconnect iiop://tango:10015,watusi:10016/ // -ORBpreconnect busX_iop://board1:0x07450000,board2,0x08450000/ - // Or chain all possible endpoint designations together + // Or chain all possible endpoint designations together // -ORBpreconnect iiop://tango:10015,watusi:10016/, // busX_iop://board1:0x07450000,board2,0x08450000/ // fredk - // + // // Get a string which describes the host/port of connections // we want to cache up-front, thus reducing the latency of // the first call. It is specified as a comma-separated @@ -517,7 +521,7 @@ TAO_ORB_Core::init (int &argc, char *argv[]) // Initialize the Service Configurator -check for return values. // Load the resource factory, connector registry, acceptor registry - // and protocols. Will need to call the open () method on + // and protocols. Will need to call the open () method on // the registries! int result = TAO_Internal::open_services (svc_config_argc, svc_config_argv); @@ -622,13 +626,13 @@ TAO_ORB_Core::init (int &argc, char *argv[]) this->orb_params ()->use_dotted_decimal_addresses (dotted_decimal_addresses); - // ** Set up the pluggable protocol infrastructure. First get a - // pointer to the protocol factories set, then obtain pointers to + // ** Set up the pluggable protocol infrastructure. First get a + // pointer to the protocol factories set, then obtain pointers to // all factories loaded by the service configurator. // Load all protocol factories! if (trf->init_protocol_factories () == -1) return -1; - + // init the ORB core's pointer this->protocol_factories (trf->get_protocol_factories ()); @@ -644,7 +648,7 @@ TAO_ORB_Core::init (int &argc, char *argv[]) if (this->connector_registry ()->open (this) != 0) return -1; - // Init acceptor_registry_ + // Init acceptor_registry_ this->acceptor_registry (trf->get_acceptor_registry ()); if (this->acceptor_registry ()->open (this) == -1) @@ -685,8 +689,8 @@ TAO_ORB_Core::set_iiop_endpoint ( int dotted_decimal_addresses, char buffer[MAXHOSTNAMELEN + 1]; - if (rendezvous.addr_to_string (buffer, - MAXHOSTNAMELEN, + if (rendezvous.addr_to_string (buffer, + MAXHOSTNAMELEN, dotted_decimal_addresses) == -1) { ACE_ERROR_RETURN ((LM_ERROR, @@ -698,7 +702,7 @@ TAO_ORB_Core::set_iiop_endpoint ( int dotted_decimal_addresses, endpoint.set ("iiop://", 1); endpoint += buffer; endpoint += ACE_CString("/"); - + // @@ more ugliness .... fredk this->orb_params ()->addr (rendezvous); this->orb_params ()->host (host); diff --git a/TAO/tao/ORB_Core.h b/TAO/tao/ORB_Core.h index 49777b70275..5bd0070e24d 100644 --- a/TAO/tao/ORB_Core.h +++ b/TAO/tao/ORB_Core.h @@ -24,6 +24,10 @@ #include "tao/Resource_Factory.h" #include "tao/params.h" #include "tao/POAC.h" + +// @@ Fred&Ossama: In this file you only use pointers +// TAO_Connector_Registry and Acceptor_Registry, you should forward +// declare the classes, and not include the complete header file. #include "tao/Connector_Registry.h" #include "tao/Acceptor_Registry.h" @@ -293,7 +297,7 @@ protected: TAO_Acceptor_Registry *acceptor_registry_; // The registry which maintains a list of acceptor factories for each - // loaded protocol. + // loaded protocol. TAO_ProtocolFactorySet *protocol_factories_; // Pointer to the list of protocol loaded into this ORB instance. diff --git a/TAO/tao/Pluggable.cpp b/TAO/tao/Pluggable.cpp index b135b02bcc8..e8766b9fb80 100644 --- a/TAO/tao/Pluggable.cpp +++ b/TAO/tao/Pluggable.cpp @@ -49,8 +49,8 @@ TAO_IOP_Version::operator= (const TAO_IOP_Version &src) return *this; } -// Generic Profile -CORBA::ULong +// Generic Profile +CORBA::ULong TAO_Profile::tag (void) const { return this->tag_; @@ -76,7 +76,7 @@ TAO_Transport::tag (void) const return this->tag_; } -// Connector +// Connector TAO_Connector::TAO_Connector (CORBA::ULong tag) : tag_(tag) { @@ -204,7 +204,7 @@ TAO_Connector::make_mprofile (const char *string, // `1.3//moo/arf' // `1.3//shu/arf' // `1.3//chicken/arf' - // + // // If no version is provided then the string will be of the form: // `//moo/arf' @@ -260,7 +260,7 @@ TAO_Connector::make_mprofile (const char *string, ACE_TRY_ENV) != 0) { ACE_THROW_RETURN (CORBA::MARSHAL (), -1); - // Failure: Problem during profile creation + // Failure: Problem during profile creation } // Create a Profile using the individual endpoint string diff --git a/TAO/tao/Pluggable.h b/TAO/tao/Pluggable.h index 44576d76a69..0990ce5fa50 100644 --- a/TAO/tao/Pluggable.h +++ b/TAO/tao/Pluggable.h @@ -158,6 +158,14 @@ public: // Equality operator }; +// @@ Fred&Ossama: We need a *concrete* class (something that can be +// instantiated) that can be used to represent profiles for +// protocols we don't know. This is required in the spec because +// we are supposed to preserve foreign profiles when communicating +// with other ORBs. +// A simple class with noops for most methods and just the basics +// required for marshaling and demarshaling is what we need. +// class TAO_Export TAO_Profile { // = TITLE @@ -244,6 +252,10 @@ public: virtual CORBA::ULong _decr_refcnt (void) = 0; // Decrement the object's reference count. When this count goes to // 0 this object will be deleted. + // @@ Fred&Ossama: guys, reference counting *should* be implemented + // in the base class, otherwise you are just going to end up + // repeating code and forcing the user to implement things not + // directly related to protocols. virtual ~TAO_Profile (void); // If you have a virtual method you need a virtual dtor. |