summaryrefslogtreecommitdiff
path: root/trunk/TAO/tao/default_resource.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/TAO/tao/default_resource.cpp')
-rw-r--r--trunk/TAO/tao/default_resource.cpp1287
1 files changed, 1287 insertions, 0 deletions
diff --git a/trunk/TAO/tao/default_resource.cpp b/trunk/TAO/tao/default_resource.cpp
new file mode 100644
index 00000000000..29082bada75
--- /dev/null
+++ b/trunk/TAO/tao/default_resource.cpp
@@ -0,0 +1,1287 @@
+// $Id$
+
+#include "tao/default_resource.h"
+
+#include "tao/debug.h"
+#include "tao/IIOP_Factory.h"
+#include "tao/Acceptor_Registry.h"
+#include "tao/Connector_Registry.h"
+#include "tao/Reactive_Flushing_Strategy.h"
+#include "tao/Block_Flushing_Strategy.h"
+#include "tao/Leader_Follower_Flushing_Strategy.h"
+#include "tao/LRU_Connection_Purging_Strategy.h"
+#include "tao/LF_Strategy_Complete.h"
+#include "tao/Codeset_Descriptor_Base.h"
+#include "tao/Codeset_Manager_Factory_Base.h"
+#include "tao/Codeset_Manager.h"
+#include "tao/Null_Fragmentation_Strategy.h"
+#include "tao/On_Demand_Fragmentation_Strategy.h"
+#include "tao/MMAP_Allocator.h"
+#include "tao/Load_Protocol_Factory_T.h"
+
+#include "ace/TP_Reactor.h"
+#include "ace/Malloc.h"
+#include "ace/Reactor.h"
+#include "ace/Malloc_T.h"
+#include "ace/Local_Memory_Pool.h"
+#include "ace/OS_NS_string.h"
+#include "ace/OS_NS_strings.h"
+
+ACE_RCSID (tao,
+ default_resource,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Codeset_Parameters::TAO_Codeset_Parameters (void)
+ : translators_ ()
+ , native_ (0)
+{
+}
+
+TAO_Codeset_Parameters::~TAO_Codeset_Parameters (void)
+{
+ for (TAO_Codeset_Parameters::iterator i =
+ this->translators ();
+ !i.done ();
+ i.advance ())
+ {
+ ACE_TCHAR** element = 0;
+ if (i.next (element))
+ ACE_OS::free (*element);
+ }
+
+ ACE_OS::free (this->native_);
+}
+
+const ACE_TCHAR*
+TAO_Codeset_Parameters::native (void)
+{
+ return (this->native_);
+}
+
+void
+TAO_Codeset_Parameters::apply_to (TAO_Codeset_Descriptor_Base *csd)
+{
+ if (csd == 0)
+ return;
+
+ if (this->native () != 0)
+ csd->ncs (this->native ());
+
+ ACE_TCHAR** element = 0;
+ for (TAO_Codeset_Parameters::iterator i = this->translators ();
+ !i.done ();
+ i.advance ())
+ {
+ if (i.next (element))
+ csd->add_translator (*element);
+ }
+}
+
+void
+TAO_Codeset_Parameters::native (const ACE_TCHAR* n)
+{
+ ACE_OS::free (this->native_);
+ this->native_ = ACE_OS::strdup (n);
+}
+
+void
+TAO_Codeset_Parameters::add_translator (const ACE_TCHAR*name)
+{
+ this->translators_.enqueue_tail (ACE_OS::strdup (name));
+}
+
+TAO_Codeset_Parameters::iterator
+TAO_Codeset_Parameters::translators (void)
+{
+ return this->translators_.begin ();
+}
+
+TAO_Default_Resource_Factory::TAO_Default_Resource_Factory (void)
+ : use_locked_data_blocks_ (1)
+ , parser_names_count_ (0)
+ , parser_names_ (0)
+ , protocol_factories_ ()
+ , connection_purging_type_ (TAO_CONNECTION_PURGING_STRATEGY)
+ , cache_maximum_ (TAO_CONNECTION_CACHE_MAXIMUM)
+ , purge_percentage_ (TAO_PURGE_PERCENT)
+ , max_muxed_connections_ (0)
+ , reactor_mask_signals_ (1)
+ , dynamically_allocated_reactor_ (0)
+ , options_processed_ (0)
+ , factory_disabled_ (0)
+#if TAO_USE_OUTPUT_CDR_MMAP_MEMORY_POOL == 1
+ , output_cdr_allocator_type_ (MMAP_ALLOCATOR)
+#else
+ , output_cdr_allocator_type_ (DEFAULT)
+#endif
+#if TAO_USE_LOCAL_MEMORY_POOL == 1
+ , use_local_memory_pool_ (true)
+#else
+ , use_local_memory_pool_ (false)
+#endif
+ , cached_connection_lock_type_ (TAO_THREAD_LOCK)
+ , object_key_table_lock_type_ (TAO_THREAD_LOCK)
+ , corba_object_lock_type_ (TAO_THREAD_LOCK)
+ , flushing_strategy_type_ (TAO_LEADER_FOLLOWER_FLUSHING)
+ , char_codeset_parameters_ ()
+ , wchar_codeset_parameters_ ()
+ , resource_usage_strategy_ (TAO_Resource_Factory::TAO_EAGER)
+ , drop_replies_ (true)
+{
+#if TAO_USE_LAZY_RESOURCE_USAGE_STRATEGY == 1
+ this->resource_usage_strategy_ =
+ TAO_Resource_Factory::TAO_LAZY;
+#endif /*TAO_USE_LAZY_RESOURCE_USAGE_STRATEGY*/
+
+
+}
+
+TAO_Default_Resource_Factory::~TAO_Default_Resource_Factory (void)
+{
+ const TAO_ProtocolFactorySetItor end = this->protocol_factories_.end ();
+
+ for (TAO_ProtocolFactorySetItor iterator =
+ this->protocol_factories_.begin ();
+ iterator != end;
+ ++iterator)
+ {
+ delete *iterator;
+ }
+
+ this->protocol_factories_.reset ();
+
+ for (int i = 0; i < this->parser_names_count_; ++i)
+ CORBA::string_free (this->parser_names_[i]);
+
+ delete [] this->parser_names_;
+}
+
+
+int
+TAO_Default_Resource_Factory::init (int argc, ACE_TCHAR *argv[])
+{
+ ACE_TRACE ("TAO_Default_Resource_Factory::init");
+
+ // If this factory has already been disabled then
+ // print a warning and exit because any options
+ // are useless
+ if (this->factory_disabled_) {
+ ACE_DEBUG ((LM_WARNING,
+ ACE_TEXT ("TAO (%P|%t) Warning: Resource_Factory options ")
+ ACE_TEXT ("ignored\n")
+ ACE_TEXT ("Default Resource Factory is disabled\n")));
+ return 0;
+ }
+ this->options_processed_ = 1;
+
+ this->parser_names_count_ = 0;
+
+ int curarg = 0;
+
+ for (curarg = 0; curarg < argc; ++curarg)
+ {
+ // Parse thro' and find the number of Parsers to be loaded.
+ if (ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT("-ORBIORParser")) == 0)
+ ++this->parser_names_count_;
+
+ ++curarg;
+
+ if (curarg == (argc-1) && this->parser_names_count_ != 0)
+ {
+ // This is the last loop..
+ ACE_NEW_RETURN (this->parser_names_,
+ char *[this->parser_names_count_],
+ -1);
+
+ for (int i = 0;
+ i < this->parser_names_count_;
+ ++i)
+ this->parser_names_[i] = 0;
+
+ this->index_ = 0;
+ }
+ }
+
+ for (curarg = 0; curarg < argc; ++curarg)
+ {
+ if (ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT("-ORBReactorMaskSignals")) == 0)
+ {
+ ++curarg;
+ if (curarg < argc)
+ {
+ ACE_TCHAR* name = argv[curarg];
+
+ if (ACE_OS::strcasecmp (name, ACE_TEXT("0")) == 0)
+ this->reactor_mask_signals_ = 0;
+ else if (ACE_OS::strcasecmp (name, ACE_TEXT("1")) == 0)
+ this->reactor_mask_signals_= 1;
+ else
+ this->report_option_value_error (ACE_TEXT("-ORBReactorMaskSignals"), name);
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT("-ORBProtocolFactory")) == 0)
+ {
+ TAO_ProtocolFactorySet *pset = this->get_protocol_factories ();
+ ++curarg;
+ if (curarg < argc)
+ {
+ TAO_Protocol_Item *item = 0;
+ ACE_NEW_RETURN (item,
+ TAO_Protocol_Item (ACE_TEXT_ALWAYS_CHAR(argv[curarg])),
+ -1);
+ if (pset->insert (item) == -1)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P|%t) Unable to add protocol factories ")
+ ACE_TEXT ("for %s: %m\n"),
+ argv[curarg]));
+ }
+ }
+
+ /// CodeSet Translators
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT("-ORBNativeCharCodeSet")) == 0)
+ {
+ ++curarg;
+ if (curarg < argc)
+ this->char_codeset_parameters_.native (argv[curarg]);
+ }
+
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT("-ORBNativeWCharCodeSet")) == 0)
+ {
+ ++curarg;
+ if (curarg < argc)
+ this->wchar_codeset_parameters_.native (argv[curarg]);
+ }
+
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT("-ORBCharCodesetTranslator")) == 0)
+ {
+ ++curarg;
+ if (curarg < argc)
+ this->char_codeset_parameters_.add_translator (argv[curarg]);
+ }
+
+ /// CodeSet Translators
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT("-ORBWCharCodesetTranslator")) == 0)
+ {
+ ++curarg;
+ if (curarg < argc)
+ this->wchar_codeset_parameters_.add_translator (argv[curarg]);
+ }
+
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT("-ORBConnectionCachingStrategy")) == 0)
+ {
+ ++curarg;
+
+ // @@todo: This needs to be removed after a few betas. The
+ // note is being written during 1.2.3 timeframe.
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) This option would be deprecated \n")
+ ACE_TEXT ("(%P|%t) Please use -ORBConnectionPurgingStrategy ")
+ ACE_TEXT ("instead \n")));
+
+ if (curarg < argc)
+ {
+ ACE_TCHAR* name = argv[curarg];
+
+ if (ACE_OS::strcasecmp (name,
+ ACE_TEXT ("lru")) == 0)
+ this->connection_purging_type_ =
+ TAO_Resource_Factory::LRU;
+ else if (ACE_OS::strcasecmp (name,
+ ACE_TEXT ("lfu")) == 0)
+ this->connection_purging_type_ =
+ TAO_Resource_Factory::LFU;
+ else if (ACE_OS::strcasecmp (name,
+ ACE_TEXT ("fifo")) == 0)
+ this->connection_purging_type_ =
+ TAO_Resource_Factory::FIFO;
+ else if (ACE_OS::strcasecmp (name,
+ ACE_TEXT ("null")) == 0)
+ this->connection_purging_type_ =
+ TAO_Resource_Factory::NOOP;
+ else
+ this->report_option_value_error (ACE_TEXT ("-ORBConnectionCachingStrategy"), name);
+ }
+ }
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT("-ORBConnectionPurgingStrategy")) == 0)
+ {
+ ++curarg;
+
+ if (curarg < argc)
+ {
+ ACE_TCHAR* name = argv[curarg];
+
+ if (ACE_OS::strcasecmp (name,
+ ACE_TEXT("lru")) == 0)
+ this->connection_purging_type_ =
+ TAO_Resource_Factory::LRU;
+ else if (ACE_OS::strcasecmp (name,
+ ACE_TEXT("lfu")) == 0)
+ this->connection_purging_type_ =
+ TAO_Resource_Factory::LFU;
+ else if (ACE_OS::strcasecmp (name,
+ ACE_TEXT("fifo")) == 0)
+ this->connection_purging_type_ =
+ TAO_Resource_Factory::FIFO;
+ else if (ACE_OS::strcasecmp (name,
+ ACE_TEXT("null")) == 0)
+ this->connection_purging_type_ =
+ TAO_Resource_Factory::NOOP;
+ else
+ this->report_option_value_error (ACE_TEXT("-ORBConnectionPurgingStrategy"), name);
+ }
+ }
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT("-ORBConnectionCacheMax")) == 0)
+ {
+ ++curarg;
+ if (curarg < argc)
+ this->cache_maximum_ = ACE_OS::atoi (argv[curarg]);
+ else
+ this->report_option_value_error (ACE_TEXT("-ORBConnectionCacheMax"), argv[curarg]);
+ }
+
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT("-ORBConnectionCachePurgePercentage")) == 0)
+ {
+ ++curarg;
+ if (curarg < argc)
+ this->purge_percentage_ = ACE_OS::atoi (argv[curarg]);
+ else
+ this->report_option_value_error (ACE_TEXT("-ORBConnectionCachePurgePercentage"),
+ argv[curarg]);
+ }
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT("-ORBIORParser")) == 0)
+ {
+ ++curarg;
+
+ if (curarg < argc)
+ {
+ this->add_to_ior_parser_names (ACE_TEXT_ALWAYS_CHAR(argv[curarg]));
+ }
+ }
+
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT("-ORBConnectionCacheLock")) == 0)
+ {
+ ++curarg;
+ if (curarg < argc)
+ {
+ ACE_TCHAR* name = argv[curarg];
+
+ if (ACE_OS::strcasecmp (name,
+ ACE_TEXT("thread")) == 0)
+ this->cached_connection_lock_type_ = TAO_THREAD_LOCK;
+ else if (ACE_OS::strcasecmp (name,
+ ACE_TEXT("null")) == 0)
+ {
+ // @@ Bug 940 :This is a sort of hack now. We need to put
+ // this in a common place once we get the common
+ // switch that is documented in bug 940...
+ this->use_locked_data_blocks_ = 0;
+ this->cached_connection_lock_type_ = TAO_NULL_LOCK;
+ }
+ else
+ this->report_option_value_error (ACE_TEXT("-ORBConnectionCacheLock"), name);
+ }
+ }
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT("-ORBObjectKeyTableLock")) == 0)
+ {
+ ++curarg;
+ if (curarg < argc)
+ {
+ ACE_TCHAR* name = argv[curarg];
+
+ if (ACE_OS::strcasecmp (name,
+ ACE_TEXT("thread")) == 0)
+ this->object_key_table_lock_type_ = TAO_THREAD_LOCK;
+ else if (ACE_OS::strcasecmp (name,
+ ACE_TEXT("null")) == 0)
+ {
+ // @@ Bug 940 :This is a sort of hack now. We need to put
+ // this in a common place once we get the common
+ // switch that is documented in bug 940...
+ this->object_key_table_lock_type_ = TAO_NULL_LOCK;
+ }
+ else
+ this->report_option_value_error (ACE_TEXT("-ORBObjectKeyTableLock"), name);
+ }
+ }
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT("-ORBCorbaObjectLock")) == 0)
+ {
+ ++curarg;
+ if (curarg < argc)
+ {
+ ACE_TCHAR* name = argv[curarg];
+
+ if (ACE_OS::strcasecmp (name,
+ ACE_TEXT("thread")) == 0)
+ this->corba_object_lock_type_ = TAO_THREAD_LOCK;
+ else if (ACE_OS::strcasecmp (name,
+ ACE_TEXT("null")) == 0)
+ {
+ // @@ Bug 940 :This is a sort of hack now. We need to put
+ // this in a common place once we get the common
+ // switch that is documented in bug 940...
+ this->corba_object_lock_type_ = TAO_NULL_LOCK;
+ }
+ else
+ this->report_option_value_error (ACE_TEXT("-ORBCorbaObjectLock"), name);
+ }
+ }
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT("-ORBResourceUsage")) == 0)
+ {
+ ++curarg;
+ if (curarg < argc)
+ {
+ ACE_TCHAR* name = argv[curarg];
+
+ if (ACE_OS::strcasecmp (name,
+ ACE_TEXT("eager")) == 0)
+ this->resource_usage_strategy_ = TAO_EAGER;
+ else if (ACE_OS::strcasecmp (name,
+ ACE_TEXT("lazy")) == 0)
+ {
+ this->resource_usage_strategy_ = TAO_LAZY;
+ }
+ else
+ this->report_option_value_error (ACE_TEXT("-ORBResourceUsage"), name);
+ }
+ }
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT("-ORBFlushingStrategy")) == 0)
+ {
+ ++curarg;
+ /*
+ * Hook to specialize TAO's Flushing strategy implementations
+ */
+//@@ FLUSHING_STRATEGY_SPL_COMMENT_HOOK_START
+ if (curarg < argc)
+ {
+ ACE_TCHAR* name = argv[curarg];
+
+ if (ACE_OS::strcasecmp (name,
+ ACE_TEXT("leader_follower")) == 0)
+ this->flushing_strategy_type_ = TAO_LEADER_FOLLOWER_FLUSHING;
+ else if (ACE_OS::strcasecmp (name,
+ ACE_TEXT("reactive")) == 0)
+ this->flushing_strategy_type_ = TAO_REACTIVE_FLUSHING;
+ else if (ACE_OS::strcasecmp (name,
+ ACE_TEXT("blocking")) == 0)
+ this->flushing_strategy_type_ = TAO_BLOCKING_FLUSHING;
+ else
+ this->report_option_value_error (ACE_TEXT("-ORBFlushingStrategy"), name);
+ }
+//@@ FLUSHING_STRATEGY_SPL_COMMENT_HOOK_END
+ }
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT ("-ORBMuxedConnectionMax")) == 0)
+ {
+ ++curarg;
+ if (curarg < argc)
+ this->max_muxed_connections_ =
+ ACE_OS::atoi (argv[curarg]);
+ else
+ this->report_option_value_error (ACE_TEXT("-ORBMuxedConnectionMax"),
+ argv[curarg]);
+ }
+ else if (ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT("-ORBDropRepliesDuringShutdown")) == 0)
+ {
+ ++curarg;
+ if (curarg < argc)
+ {
+ int tmp = ACE_OS::atoi (argv[curarg]);
+
+ if (tmp == 0)
+ this->drop_replies_ = false;
+ else
+ this->drop_replies_ = true;
+ }
+ else
+ this->report_option_value_error (ACE_TEXT("-ORBDropRepliesDuringShutdown"),
+ argv[curarg]);
+ }
+ else if (0 == ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT("-ORBOutputCDRAllocator")))
+ {
+ ++curarg;
+
+ if (curarg < argc)
+ {
+ ACE_TCHAR const * const current_arg = argv[curarg];
+
+ if (ACE_OS::strcasecmp (current_arg,
+ ACE_TEXT("mmap")) == 0)
+ {
+#if TAO_HAS_SENDFILE == 1
+ this->output_cdr_allocator_type_ = MMAP_ALLOCATOR;
+#else
+ ACE_DEBUG ((LM_WARNING,
+ ACE_TEXT ("MMAP allocator unsupport on this platform")));
+#endif /* TAO_HAS_SENDFILE==1 */
+ }
+ else if (ACE_OS::strcasecmp (current_arg,
+ ACE_TEXT("local_memory_pool")) == 0
+ && this->output_cdr_allocator_type_ != DEFAULT)
+ {
+ this->output_cdr_allocator_type_ = LOCAL_MEMORY_POOL;
+ }
+ else if (ACE_OS::strcasecmp (current_arg,
+ ACE_TEXT("default")) == 0)
+ {
+ this->output_cdr_allocator_type_ = DEFAULT;
+ }
+ else
+ {
+ this->report_option_value_error (
+ ACE_TEXT("-ORBOutputCDRAllocator"), current_arg);
+ }
+ }
+ }
+ else if (0 == ACE_OS::strcasecmp (argv[curarg],
+ ACE_TEXT("-ORBZeroCopyWrite")))
+ {
+#if TAO_HAS_SENDFILE == 1
+ this->output_cdr_allocator_type_ = MMAP_ALLOCATOR;
+#else
+ ACE_DEBUG ((LM_WARNING,
+ ACE_TEXT ("Zero copy writes unsupported on this platform\n")));
+#endif /* TAO_HAS_SENDFILE==1 */
+ }
+ else if (ACE_OS::strncmp (argv[curarg],
+ ACE_TEXT ("-ORB"),
+ 4) == 0)
+ {
+ // Can we assume there is an argument after the option?
+ // ++curarg;
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("Default_Resource_Factory - ")
+ ACE_TEXT ("unknown option <%s>\n"),
+ argv[curarg]));
+ }
+ else
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("Default_Resource_Factory - ")
+ ACE_TEXT ("ignoring option <%s>\n"),
+ argv[curarg]));
+ }
+ }
+
+ return 0;
+}
+
+int
+TAO_Default_Resource_Factory::get_parser_names (char **&names,
+ int &number_of_names)
+{
+ if (this->parser_names_count_ != 0)
+ {
+ // The user used some -ORBIORParser options, just return those.
+ names = this->parser_names_;
+ number_of_names = this->parser_names_count_;
+
+ return 0;
+ }
+
+ // OK fallback on the hardcoded ones....
+ this->parser_names_count_ = 6; // HOW MANY DO WE HAVE?
+ ACE_NEW_RETURN (this->parser_names_,
+ char *[this->parser_names_count_],
+ -1);
+
+ CORBA::ULong index = 0;
+
+ this->parser_names_[index] = CORBA::string_dup ("DLL_Parser");
+ ++index;
+
+ this->parser_names_[index] = CORBA::string_dup ("FILE_Parser");
+ ++index;
+
+ this->parser_names_[index] = CORBA::string_dup ("CORBALOC_Parser");
+ ++index;
+
+ this->parser_names_[index] = CORBA::string_dup ("CORBANAME_Parser");
+ ++index;
+
+ this->parser_names_[index] = CORBA::string_dup ("MCAST_Parser");
+ ++index;
+
+ this->parser_names_[index] = CORBA::string_dup ("HTTP_Parser");
+ ++index;
+
+ names = this->parser_names_;
+
+ number_of_names = index;
+
+ return 0;
+}
+
+int
+TAO_Default_Resource_Factory::add_to_ior_parser_names (const char *curarg)
+{
+ this->parser_names_[this->index_] = CORBA::string_dup (curarg);
+
+ ++this->index_;
+
+ return 0;
+}
+
+
+// This is virtual and protected...
+int
+TAO_Default_Resource_Factory::load_default_protocols (void)
+{
+#if defined (TAO_HAS_IIOP) && (TAO_HAS_IIOP != 0)
+ // If the user did not list any protocols in her svc.conf file
+ // then default to TAO's basic protocols.
+ // You do *NOT* need modify this code to add your own protocol,
+ // instead simply add the following to your svc.conf file:
+ //
+ // dynamic PP_Factory Service_Object * LIB:_make_PP_Protocol_Factory() ""
+ // static Resource_Factory "-ORBProtocolFactory PP_Factory"
+ //
+ // where "PP_Factory" is the name of your protocol, i.e. the
+ // second argument passed to the ACE_STATIC_SVC_DEFINE macro:
+ //
+ // ACE_STATIC_SVC_DEFINE (PP_Protocol_Factory,
+ // ACE_TEXT ("PP_Factory"), ...)
+ //
+ // "PP_Protocol_Factory" is the name of your protocol factory
+ // class. A "_make_" is prepended to your protocol factory
+ // class name by the ACE_FACTORY_DECLARE macro. The resulting
+ // factory function "_make_PP_Protocol_Factory()" is what should
+ // be used in the "dynamic" line in your svc.conf file.
+ //
+ // LIB is the base name of the shared library that implements
+ // the protocol. The directory containing your library must be
+ // in your library search path, typically defined by the
+ // LD_LIBRARY_PATH environment variable on UNIX systems, and/or
+ // the `/etc/ld.so.conf' file on some UNIX systems. Remember to
+ // run "ldconfig" if you modify `/etc/ld.so.conf'.
+
+ if (TAO::details::load_protocol_factory <TAO_IIOP_Protocol_Factory> (
+ this->protocol_factories_, "IIOP_Factory") == -1)
+ return -1;
+#endif /* TAO_HAS_IIOP && TAO_HAS_IIOP != 0 */
+
+ return 0;
+}
+
+int
+TAO_Default_Resource_Factory::init_protocol_factories (void)
+{
+ const TAO_ProtocolFactorySetItor end = protocol_factories_.end ();
+ TAO_ProtocolFactorySetItor factory = protocol_factories_.begin ();
+
+ if (factory == end)
+ {
+ return this->load_default_protocols ();
+ }
+
+ for (; factory != end; ++factory)
+ {
+ const ACE_CString &name = (*factory)->protocol_name ();
+ (*factory)->factory (
+ ACE_Dynamic_Service<TAO_Protocol_Factory>::instance (name.c_str ()));
+ if ((*factory)->factory () == 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) Unable to load ")
+ ACE_TEXT ("protocol <%s>, %p\n"),
+ ACE_TEXT_CHAR_TO_TCHAR(name.c_str ()),
+ ACE_TEXT ("")),
+ -1);
+ }
+
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) Loaded protocol <%s>\n"),
+ ACE_TEXT_CHAR_TO_TCHAR(name.c_str ())));
+ }
+ }
+
+ return 0;
+}
+
+int
+TAO_Default_Resource_Factory::use_locked_data_blocks (void) const
+{
+ return this->use_locked_data_blocks_;
+}
+
+TAO_ProtocolFactorySet *
+TAO_Default_Resource_Factory::get_protocol_factories (void)
+{
+ return &protocol_factories_;
+}
+
+TAO_Acceptor_Registry *
+TAO_Default_Resource_Factory::get_acceptor_registry (void)
+{
+ TAO_Acceptor_Registry *ar = 0;
+
+ ACE_NEW_RETURN(ar,
+ TAO_Acceptor_Registry,
+ 0);
+
+ return ar;
+}
+
+TAO_Connector_Registry *
+TAO_Default_Resource_Factory::get_connector_registry (void)
+{
+ TAO_Connector_Registry *cr = 0;
+
+ ACE_NEW_RETURN(cr,
+ TAO_Connector_Registry,
+ 0);
+
+ return cr;
+}
+
+ACE_Reactor_Impl*
+TAO_Default_Resource_Factory::allocate_reactor_impl (void) const
+{
+ ACE_Reactor_Impl *impl = 0;
+ /*
+ * Hook to specialize TAO's reactor implementation.
+ */
+//@@ TAO_REACTOR_SPL_COMMENT_HOOK_START
+ ACE_NEW_RETURN (impl,
+ ACE_TP_Reactor (ACE::max_handles (),
+ 1,
+ (ACE_Sig_Handler*)0,
+ (ACE_Timer_Queue*)0,
+ this->reactor_mask_signals_,
+ ACE_Select_Reactor_Token::LIFO),
+ 0);
+//@@ TAO_REACTOR_SPL_COMMENT_HOOK_END
+ return impl;
+}
+
+ACE_Reactor *
+TAO_Default_Resource_Factory::get_reactor (void)
+{
+ ACE_Reactor *reactor = 0;
+ ACE_NEW_RETURN (reactor,
+ ACE_Reactor (this->allocate_reactor_impl (), 1),
+ 0);
+
+ if (reactor->initialized () == 0)
+ {
+ delete reactor;
+ reactor = 0;
+ }
+ else
+ this->dynamically_allocated_reactor_ = 1;
+
+ return reactor;
+}
+
+void
+TAO_Default_Resource_Factory::reclaim_reactor (ACE_Reactor *reactor)
+{
+ if (this->dynamically_allocated_reactor_ == 1)
+ delete reactor;
+}
+
+
+typedef ACE_Malloc<ACE_LOCAL_MEMORY_POOL,TAO_SYNCH_MUTEX> LOCKED_MALLOC;
+typedef ACE_Allocator_Adapter<LOCKED_MALLOC> LOCKED_ALLOCATOR_POOL;
+typedef ACE_New_Allocator LOCKED_ALLOCATOR_NO_POOL;
+
+void
+TAO_Default_Resource_Factory::use_local_memory_pool (bool flag)
+{
+ this->use_local_memory_pool_ = flag;
+
+ if (this->output_cdr_allocator_type_ == DEFAULT)
+ this->output_cdr_allocator_type_ = LOCAL_MEMORY_POOL;
+}
+
+ACE_Allocator *
+TAO_Default_Resource_Factory::input_cdr_dblock_allocator (void)
+{
+ ACE_Allocator *allocator = 0;
+ if (use_local_memory_pool_)
+ {
+ ACE_NEW_RETURN (allocator,
+ LOCKED_ALLOCATOR_POOL,
+ 0);
+ }
+ else
+ {
+ ACE_NEW_RETURN (allocator,
+ LOCKED_ALLOCATOR_NO_POOL,
+ 0);
+ }
+
+ return allocator;
+}
+
+ACE_Allocator *
+TAO_Default_Resource_Factory::input_cdr_buffer_allocator (void)
+{
+ ACE_Allocator *allocator = 0;
+ if (use_local_memory_pool_)
+ {
+ ACE_NEW_RETURN (allocator,
+ LOCKED_ALLOCATOR_POOL,
+ 0);
+ }
+ else
+ {
+ ACE_NEW_RETURN (allocator,
+ LOCKED_ALLOCATOR_NO_POOL,
+ 0);
+ }
+
+ return allocator;
+}
+
+ACE_Allocator *
+TAO_Default_Resource_Factory::input_cdr_msgblock_allocator (void)
+{
+ ACE_Allocator *allocator = 0;
+ if (use_local_memory_pool_)
+ {
+ ACE_NEW_RETURN (allocator,
+ LOCKED_ALLOCATOR_POOL,
+ 0);
+ }
+ else
+ {
+ ACE_NEW_RETURN (allocator,
+ LOCKED_ALLOCATOR_NO_POOL,
+ 0);
+ }
+
+ return allocator;
+}
+
+int
+TAO_Default_Resource_Factory::input_cdr_allocator_type_locked (void)
+{
+ return 1;
+}
+
+ACE_Allocator*
+TAO_Default_Resource_Factory::output_cdr_dblock_allocator (void)
+{
+ ACE_Allocator *allocator = 0;
+ if (use_local_memory_pool_)
+ {
+ ACE_NEW_RETURN (allocator,
+ LOCKED_ALLOCATOR_POOL,
+ 0);
+ }
+ else
+ {
+ ACE_NEW_RETURN (allocator,
+ LOCKED_ALLOCATOR_NO_POOL,
+ 0);
+ }
+
+ return allocator;
+}
+
+ACE_Allocator *
+TAO_Default_Resource_Factory::output_cdr_buffer_allocator (void)
+{
+ ACE_Allocator *allocator = 0;
+
+ switch (this->output_cdr_allocator_type_)
+ {
+ case LOCAL_MEMORY_POOL:
+ ACE_NEW_RETURN (allocator,
+ LOCKED_ALLOCATOR_POOL,
+ 0);
+
+ break;
+
+#if TAO_HAS_SENDFILE == 1
+ case MMAP_ALLOCATOR:
+ ACE_NEW_RETURN (allocator,
+ TAO_MMAP_Allocator,
+ 0);
+
+ break;
+#endif /* TAO_HAS_SENDFILE==1 */
+
+ case DEFAULT:
+ default:
+ ACE_NEW_RETURN (allocator,
+ LOCKED_ALLOCATOR_NO_POOL,
+ 0);
+
+ break;
+ }
+
+ return allocator;
+}
+
+ACE_Allocator*
+TAO_Default_Resource_Factory::output_cdr_msgblock_allocator (void)
+{
+ ACE_Allocator *allocator = 0;
+ if (use_local_memory_pool_)
+ {
+ ACE_NEW_RETURN (allocator,
+ LOCKED_ALLOCATOR_POOL,
+ 0);
+ }
+ else
+ {
+ ACE_NEW_RETURN (allocator,
+ LOCKED_ALLOCATOR_NO_POOL,
+ 0);
+ }
+
+ return allocator;
+}
+
+ACE_Allocator*
+TAO_Default_Resource_Factory::amh_response_handler_allocator (void)
+{
+ ACE_Allocator *allocator = 0;
+ if (use_local_memory_pool_)
+ {
+ ACE_NEW_RETURN (allocator,
+ LOCKED_ALLOCATOR_POOL,
+ 0);
+ }
+ else
+ {
+ ACE_NEW_RETURN (allocator,
+ LOCKED_ALLOCATOR_NO_POOL,
+ 0);
+ }
+
+ return allocator;
+}
+
+ACE_Allocator*
+TAO_Default_Resource_Factory::ami_response_handler_allocator (void)
+{
+ ACE_Allocator *allocator = 0;
+ if (use_local_memory_pool_)
+ {
+ ACE_NEW_RETURN (allocator,
+ LOCKED_ALLOCATOR_POOL,
+ 0);
+ }
+ else
+ {
+ ACE_NEW_RETURN (allocator,
+ LOCKED_ALLOCATOR_NO_POOL,
+ 0);
+ }
+
+ return allocator;
+}
+
+int
+TAO_Default_Resource_Factory::cache_maximum (void) const
+{
+ return this->cache_maximum_;
+}
+
+int
+TAO_Default_Resource_Factory::purge_percentage (void) const
+{
+ return this->purge_percentage_;
+}
+
+int
+TAO_Default_Resource_Factory::max_muxed_connections (void) const
+{
+ return this->max_muxed_connections_;
+}
+
+
+ACE_Lock *
+TAO_Default_Resource_Factory::create_cached_connection_lock (void)
+{
+ ACE_Lock *the_lock = 0;
+
+ if (this->cached_connection_lock_type_ == TAO_NULL_LOCK)
+ ACE_NEW_RETURN (the_lock,
+ ACE_Lock_Adapter<ACE_SYNCH_NULL_MUTEX>,
+ 0);
+ else
+ ACE_NEW_RETURN (the_lock,
+ ACE_Lock_Adapter<TAO_SYNCH_MUTEX>,
+ 0);
+
+ return the_lock;
+}
+
+int
+TAO_Default_Resource_Factory::locked_transport_cache (void)
+{
+ if (this->cached_connection_lock_type_ == TAO_NULL_LOCK)
+ return 0;
+
+ return 1;
+}
+
+
+ACE_Lock *
+TAO_Default_Resource_Factory::create_object_key_table_lock (void)
+{
+ ACE_Lock *the_lock = 0;
+
+ if (this->object_key_table_lock_type_ == TAO_NULL_LOCK)
+ ACE_NEW_RETURN (the_lock,
+ ACE_Lock_Adapter<ACE_SYNCH_NULL_MUTEX>,
+ 0);
+ else
+ ACE_NEW_RETURN (the_lock,
+ ACE_Lock_Adapter<TAO_SYNCH_MUTEX>,
+ 0);
+
+ return the_lock;
+}
+
+ACE_Lock *
+TAO_Default_Resource_Factory::create_corba_object_lock (void)
+{
+ ACE_Lock *the_lock = 0;
+
+ if (this->corba_object_lock_type_ == TAO_NULL_LOCK)
+ ACE_NEW_RETURN (the_lock,
+ ACE_Lock_Adapter<ACE_SYNCH_NULL_MUTEX>,
+ 0);
+ else
+ ACE_NEW_RETURN (the_lock,
+ ACE_Lock_Adapter<TAO_SYNCH_MUTEX>,
+ 0);
+
+ return the_lock;
+}
+
+TAO_Configurable_Refcount
+TAO_Default_Resource_Factory::create_corba_object_refcount (void)
+{
+ switch (this->corba_object_lock_type_)
+ {
+ case TAO_NULL_LOCK:
+ return TAO_Configurable_Refcount (
+ TAO_Configurable_Refcount::TAO_NULL_LOCK);
+ case TAO_THREAD_LOCK:
+ default:
+ return TAO_Configurable_Refcount (
+ TAO_Configurable_Refcount::TAO_THREAD_LOCK);
+ }
+}
+
+TAO_Flushing_Strategy *
+TAO_Default_Resource_Factory::create_flushing_strategy (void)
+{
+ TAO_Flushing_Strategy *strategy = 0;
+ if (this->flushing_strategy_type_ == TAO_LEADER_FOLLOWER_FLUSHING)
+ ACE_NEW_RETURN (strategy,
+ TAO_Leader_Follower_Flushing_Strategy,
+ 0);
+ else if (this->flushing_strategy_type_ == TAO_REACTIVE_FLUSHING)
+ ACE_NEW_RETURN (strategy,
+ TAO_Reactive_Flushing_Strategy,
+ 0);
+ else
+ ACE_NEW_RETURN (strategy,
+ TAO_Block_Flushing_Strategy,
+ 0);
+ return strategy;
+}
+
+TAO_Connection_Purging_Strategy *
+TAO_Default_Resource_Factory::create_purging_strategy (void)
+{
+ TAO_Connection_Purging_Strategy *strategy = 0;
+
+ if (this->connection_purging_type_ == TAO_Resource_Factory::LRU)
+ {
+ ACE_NEW_RETURN (strategy,
+ TAO_LRU_Connection_Purging_Strategy (
+ this->cache_maximum ()),
+ 0);
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) - ")
+ ACE_TEXT ("no usable purging strategy ")
+ ACE_TEXT ("was found.\n")));
+ }
+
+ return strategy;
+}
+
+TAO_LF_Strategy *
+TAO_Default_Resource_Factory::create_lf_strategy (void)
+{
+ TAO_LF_Strategy *strategy = 0;
+
+ ACE_NEW_RETURN (strategy,
+ TAO_LF_Strategy_Complete,
+ 0);
+
+ return strategy;
+}
+
+auto_ptr<TAO_GIOP_Fragmentation_Strategy>
+TAO_Default_Resource_Factory::create_fragmentation_strategy (
+ TAO_Transport * transport,
+ CORBA::ULong max_message_size) const
+{
+ auto_ptr<TAO_GIOP_Fragmentation_Strategy> strategy (0);
+
+ TAO_GIOP_Fragmentation_Strategy * tmp = 0;
+
+ // Minimum GIOP message size is 24 (a multiple of 8):
+ // 12 GIOP Message Header
+ // 4 GIOP Fragment Header (request ID)
+ // + 8 Smallest payload, including padding.
+ // ---
+ // 24
+ static CORBA::ULong const min_message_size = 24;
+
+ // GIOP fragments are supported in GIOP 1.1 and better, but TAO only
+ // supports them in 1.2 or better since GIOP 1.1 fragments do not
+ // have a fragment message header.
+
+
+ if (transport) // No transport. Cannot fragment.
+ {
+ if (max_message_size < min_message_size
+ || (TAO_DEF_GIOP_MAJOR == 1 && TAO_DEF_GIOP_MINOR < 2))
+ {
+ // No maximum was set by the user.
+ ACE_NEW_RETURN (tmp,
+ TAO_Null_Fragmentation_Strategy,
+ strategy);
+
+ }
+ else
+ {
+ ACE_NEW_RETURN (tmp,
+ TAO_On_Demand_Fragmentation_Strategy (
+ transport,
+ max_message_size),
+ strategy);
+ }
+ }
+
+ ACE_AUTO_PTR_RESET (strategy,
+ tmp,
+ TAO_GIOP_Fragmentation_Strategy);
+
+ return strategy;
+}
+
+void
+TAO_Default_Resource_Factory::report_option_value_error (
+ const ACE_TCHAR* option_name,
+ const ACE_TCHAR* option_value)
+{
+ ACE_DEBUG((LM_DEBUG,
+ ACE_TEXT ("Default_Resource_Factory - unknown argument")
+ ACE_TEXT (" <%s> for <%s>\n"),
+ option_value, option_name));
+}
+
+void
+TAO_Default_Resource_Factory::disable_factory (void)
+{
+ this->factory_disabled_ = 1;
+ if (this->options_processed_)
+ {
+ ACE_DEBUG ((LM_WARNING,
+ ACE_TEXT ("TAO (%P|%t) Warning: Resource_Factory options ignored\n")
+ ACE_TEXT ("Default Resource Factory is disabled\n")));
+ }
+}
+
+TAO_Codeset_Manager *
+TAO_Default_Resource_Factory::codeset_manager(void)
+{
+ TAO_Codeset_Manager_Factory_Base *factory =
+ ACE_Dynamic_Service<TAO_Codeset_Manager_Factory_Base>::instance ("TAO_Codeset");
+
+ if (factory == 0)
+ {
+ if (TAO_debug_level >= 2)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) Default_Resource_Factory")
+ ACE_TEXT (" - unable to find codeset manager factory.\n")));
+ return 0;
+ }
+
+ TAO_Codeset_Manager* mgr = factory->create ();
+
+ if (mgr == 0)
+ {
+ if (TAO_debug_level >= 2)
+ ACE_DEBUG ((LM_INFO,
+ ACE_TEXT ("TAO (%P|%t) Default_Resource_Factory")
+ ACE_TEXT (" - unable to create codeset manager.\n")));
+ return 0;
+ }
+
+
+ ACE_Auto_Ptr<TAO_Codeset_Manager> safemgr (mgr);
+
+ if (TAO_debug_level >= 1)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) Default_Resource_Factory - codeset manager=%@\n"),
+ mgr));
+
+ this->char_codeset_parameters_.apply_to (mgr->char_codeset_descriptor());
+ this->wchar_codeset_parameters_.apply_to (mgr->wchar_codeset_descriptor());
+
+ return safemgr.release ();
+
+}
+
+TAO_Resource_Factory::Resource_Usage
+TAO_Default_Resource_Factory::resource_usage_strategy (void) const
+{
+ return this->resource_usage_strategy_;
+}
+
+bool
+TAO_Default_Resource_Factory::drop_replies_during_shutdown (void) const
+{
+ return this->drop_replies_;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+// ****************************************************************
+
+ACE_STATIC_SVC_DEFINE (TAO_Default_Resource_Factory,
+ ACE_TEXT ("Resource_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_Default_Resource_Factory),
+ ACE_Service_Type::DELETE_THIS
+ | ACE_Service_Type::DELETE_OBJ,
+ 0)
+ACE_FACTORY_DEFINE (TAO, TAO_Default_Resource_Factory)