EC_Default_Factory.cpp

Go to the documentation of this file.
00001 // EC_Default_Factory.cpp,v 1.57 2006/03/14 06:14:25 jtc Exp
00002 
00003 #include "orbsvcs/Event/EC_Default_Factory.h"
00004 #include "orbsvcs/Event/EC_Reactive_Dispatching.h"
00005 #include "orbsvcs/Event/EC_MT_Dispatching.h"
00006 #include "orbsvcs/Event/EC_Basic_Filter_Builder.h"
00007 #include "orbsvcs/Event/EC_Prefix_Filter_Builder.h"
00008 #include "orbsvcs/Event/EC_ConsumerAdmin.h"
00009 #include "orbsvcs/Event/EC_SupplierAdmin.h"
00010 #include "orbsvcs/Event/EC_Default_ProxyConsumer.h"
00011 #include "orbsvcs/Event/EC_Default_ProxySupplier.h"
00012 #include "orbsvcs/Event/EC_Trivial_Supplier_Filter.h"
00013 #include "orbsvcs/Event/EC_Per_Supplier_Filter.h"
00014 #include "orbsvcs/Event/EC_ObserverStrategy.h"
00015 #include "orbsvcs/Event/EC_Null_Scheduling.h"
00016 #include "orbsvcs/Event/EC_Group_Scheduling.h"
00017 #include "orbsvcs/Event/EC_Reactive_Timeout_Generator.h"
00018 #include "orbsvcs/Event/EC_Event_Channel_Base.h"
00019 #include "orbsvcs/Event/EC_Reactive_ConsumerControl.h"
00020 #include "orbsvcs/Event/EC_Reactive_SupplierControl.h"
00021 
00022 #include "orbsvcs/ESF/ESF_Proxy_List.h"
00023 #include "orbsvcs/ESF/ESF_Proxy_RB_Tree.h"
00024 #include "orbsvcs/ESF/ESF_Immediate_Changes.h"
00025 #include "orbsvcs/ESF/ESF_Copy_On_Read.h"
00026 #include "orbsvcs/ESF/ESF_Copy_On_Write.h"
00027 #include "orbsvcs/ESF/ESF_Delayed_Changes.h"
00028 #include "orbsvcs/ESF/ESF_Delayed_Command.h"
00029 
00030 #include "tao/ORB_Core.h"
00031 
00032 #include "ace/Arg_Shifter.h"
00033 #include "ace/Sched_Params.h"
00034 #include "ace/OS_NS_strings.h"
00035 #include "ace/Dynamic_Service.h"
00036 
00037 #if ! defined (__ACE_INLINE__)
00038 #include "orbsvcs/Event/EC_Default_Factory.i"
00039 #endif /* __ACE_INLINE__ */
00040 
00041 ACE_RCSID(Event, EC_Default_Factory, "EC_Default_Factory.cpp,v 1.57 2006/03/14 06:14:25 jtc Exp")
00042 
00043 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00044 
00045 TAO_EC_Default_Factory::~TAO_EC_Default_Factory (void)
00046 {
00047 }
00048 
00049 int
00050 TAO_EC_Default_Factory::init_svcs (void)
00051 {
00052   TAO_EC_Simple_Queue_Full_Action::init_svcs();
00053   return ACE_Service_Config::static_svcs ()->
00054     insert (&ace_svc_desc_TAO_EC_Default_Factory);
00055 }
00056 
00057 void
00058 TAO_EC_Default_Factory::unsupported_option_value (const char * option_name,
00059                                                   const char * option_value)
00060 {
00061   ACE_ERROR ((LM_ERROR,
00062               "EC_Default_Factory - "
00063               "Unsupported <%s> option value: <%s>. "
00064               "Ignoring this option - using defaults instead.\n",
00065               option_name,
00066               option_value));
00067 }
00068 
00069 int
00070 TAO_EC_Default_Factory::init (int argc, ACE_TCHAR* argv[])
00071 {
00072   ACE_Arg_Shifter arg_shifter (argc, argv);
00073 
00074   int priority =
00075     (ACE_Sched_Params::priority_min (ACE_SCHED_FIFO) +
00076      ACE_Sched_Params::priority_max (ACE_SCHED_FIFO)) / 2;
00077   this->dispatching_threads_priority_ =
00078     ACE_Sched_Params::next_priority (ACE_SCHED_FIFO, priority);
00079 
00080   while (arg_shifter.is_anything_left ())
00081     {
00082       const ACE_TCHAR *arg = arg_shifter.get_current ();
00083 
00084       if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECDispatching")) == 0)
00085         {
00086           arg_shifter.consume_arg ();
00087 
00088           if (arg_shifter.is_parameter_next ())
00089             {
00090               const ACE_TCHAR* opt = arg_shifter.get_current ();
00091               if (ACE_OS::strcasecmp (opt, ACE_TEXT("reactive")) == 0)
00092                 this->dispatching_ = 0;
00093               else if (ACE_OS::strcasecmp (opt, ACE_TEXT("mt")) == 0)
00094                 this->dispatching_ = 1;
00095               else
00096                   this->unsupported_option_value ("-ECDispatching", opt);
00097               arg_shifter.consume_arg ();
00098             }
00099         }
00100 
00101       else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECDispatchingThreads")) == 0)
00102         {
00103           arg_shifter.consume_arg ();
00104 
00105           if (arg_shifter.is_parameter_next ())
00106             {
00107               const ACE_TCHAR* opt = arg_shifter.get_current ();
00108               this->dispatching_threads_ = ACE_OS::atoi (opt);
00109               arg_shifter.consume_arg ();
00110             }
00111         }
00112 
00113       else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECFiltering")) == 0)
00114         {
00115           arg_shifter.consume_arg ();
00116 
00117           if (arg_shifter.is_parameter_next ())
00118             {
00119               const ACE_TCHAR* opt = arg_shifter.get_current ();
00120               if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
00121                 this->filtering_ = 0;
00122               else if (ACE_OS::strcasecmp (opt, ACE_TEXT("basic")) == 0)
00123                 this->filtering_ = 1;
00124               else if (ACE_OS::strcasecmp (opt, ACE_TEXT("prefix")) == 0)
00125                 this->filtering_ = 2;
00126               else
00127                   this->unsupported_option_value ("-ECFiltering", opt);
00128               arg_shifter.consume_arg ();
00129             }
00130         }
00131 
00132       else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECSupplierFilter")) == 0
00133                // @@ TODO remove, only for backwards compatibility
00134                || ACE_OS::strcasecmp (arg, ACE_TEXT("-ECSupplierFiltering")) == 0)
00135         {
00136           arg_shifter.consume_arg ();
00137 
00138           if (arg_shifter.is_parameter_next ())
00139             {
00140               const ACE_TCHAR* opt = arg_shifter.get_current ();
00141               if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
00142                 this->supplier_filtering_ = 0;
00143               else if (ACE_OS::strcasecmp (opt, ACE_TEXT("per-supplier")) == 0)
00144                 this->supplier_filtering_ = 1;
00145               else
00146                   this->unsupported_option_value ("-ECSupplierFilter", opt);
00147               arg_shifter.consume_arg ();
00148             }
00149         }
00150 
00151       else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECTimeout")) == 0)
00152         {
00153           arg_shifter.consume_arg ();
00154 
00155           if (arg_shifter.is_parameter_next ())
00156             {
00157               const ACE_TCHAR* opt = arg_shifter.get_current ();
00158               if (ACE_OS::strcasecmp (opt, ACE_TEXT("reactive")) == 0)
00159                 this->timeout_ = 0;
00160               else
00161                   this->unsupported_option_value ("-ECTimeout", opt);
00162               arg_shifter.consume_arg ();
00163             }
00164         }
00165 
00166       else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECObserver")) == 0)
00167         {
00168           arg_shifter.consume_arg ();
00169 
00170           if (arg_shifter.is_parameter_next ())
00171             {
00172               const ACE_TCHAR* opt = arg_shifter.get_current ();
00173               if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
00174                 this->observer_ = 0;
00175               else if (ACE_OS::strcasecmp (opt, ACE_TEXT("basic")) == 0)
00176                 this->observer_ = 1;
00177               else if (ACE_OS::strcasecmp (opt, ACE_TEXT("reactive")) == 0)
00178                 this->observer_ = 2;
00179               else
00180                   this->unsupported_option_value ("-ECObserver", opt);
00181               arg_shifter.consume_arg ();
00182             }
00183         }
00184 
00185       else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECScheduling")) == 0)
00186         {
00187           arg_shifter.consume_arg ();
00188 
00189           if (arg_shifter.is_parameter_next ())
00190             {
00191               const ACE_TCHAR* opt = arg_shifter.get_current ();
00192               if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
00193                 this->scheduling_ = 0;
00194               else if (ACE_OS::strcasecmp (opt, ACE_TEXT("group")) == 0)
00195                 this->scheduling_ = 1;
00196               else
00197                   this->unsupported_option_value ("-ECScheduling", opt);
00198               arg_shifter.consume_arg ();
00199             }
00200         }
00201 
00202       else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECProxyPushConsumerCollection")) == 0)
00203         {
00204           arg_shifter.consume_arg ();
00205 
00206           if (arg_shifter.is_parameter_next ())
00207             {
00208               const ACE_TCHAR *current_arg = arg_shifter.get_current ();
00209               ACE_TCHAR *opt = ACE_OS::strdup (current_arg);
00210               int collection_type = 0;
00211               int synch_type = 0;
00212               int iteration_type = 0;
00213 
00214               ACE_TCHAR* aux;
00215               for (ACE_TCHAR* arg = ACE_OS::strtok_r (opt, ACE_TEXT(":"), &aux);
00216                    arg != 0;
00217                    arg = ACE_OS::strtok_r (0, ACE_TEXT(":"), &aux))
00218                 {
00219                   if (ACE_OS::strcasecmp (arg, ACE_TEXT("mt")) == 0)
00220                     synch_type = 0;
00221                   else if (ACE_OS::strcasecmp (arg, ACE_TEXT("st")) == 0)
00222                     synch_type = 1;
00223                   else if (ACE_OS::strcasecmp (arg, ACE_TEXT("list")) == 0)
00224                     collection_type = 0;
00225                   else if (ACE_OS::strcasecmp (arg, ACE_TEXT("rb_tree")) == 0)
00226                     collection_type = 1;
00227                   else if (ACE_OS::strcasecmp (arg, ACE_TEXT("immediate")) == 0)
00228                     iteration_type = 0;
00229                   else if (ACE_OS::strcasecmp (arg, ACE_TEXT("copy_on_read")) == 0)
00230                     iteration_type = 1;
00231                   else if (ACE_OS::strcasecmp (arg, ACE_TEXT("copy_on_write")) == 0)
00232                     iteration_type = 2;
00233                   else if (ACE_OS::strcasecmp (arg, ACE_TEXT("delayed")) == 0)
00234                     iteration_type = 3;
00235                   else
00236                     ACE_ERROR ((LM_ERROR,
00237                                 "EC_Default_Factory - "
00238                                 "Unknown consumer collection modifier <%s>.\n", arg));
00239                 }
00240               ACE_OS::free (opt);
00241               this->consumer_collection_ =
00242                  (synch_type << 8) |(collection_type << 4) | iteration_type;
00243               arg_shifter.consume_arg ();
00244             }
00245         }
00246 
00247       else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECProxyPushSupplierCollection")) == 0)
00248         {
00249           arg_shifter.consume_arg ();
00250 
00251           if (arg_shifter.is_parameter_next ())
00252             {
00253               const ACE_TCHAR* current_arg = arg_shifter.get_current();
00254               ACE_TCHAR* opt = ACE_OS::strdup(current_arg);
00255               int collection_type = 0;
00256               int synch_type = 0;
00257               int iteration_type = 0;
00258 
00259               ACE_TCHAR* aux;
00260               for (ACE_TCHAR* arg = ACE_OS::strtok_r (opt, ACE_TEXT(":"), &aux);
00261                    arg != 0;
00262                    arg = ACE_OS::strtok_r (0, ACE_TEXT(":"), &aux))
00263                 {
00264                   if (ACE_OS::strcasecmp (arg, ACE_TEXT("mt")) == 0)
00265                     synch_type = 0;
00266                   else if (ACE_OS::strcasecmp (arg, ACE_TEXT("st")) == 0)
00267                     synch_type = 1;
00268                   else if (ACE_OS::strcasecmp (arg, ACE_TEXT("list")) == 0)
00269                     collection_type = 0;
00270                   else if (ACE_OS::strcasecmp (arg, ACE_TEXT("rb_tree")) == 0)
00271                     collection_type = 1;
00272                   else if (ACE_OS::strcasecmp (arg, ACE_TEXT("immediate")) == 0)
00273                     iteration_type = 0;
00274                   else if (ACE_OS::strcasecmp (arg, ACE_TEXT("copy_on_read")) == 0)
00275                     iteration_type = 1;
00276                   else if (ACE_OS::strcasecmp (arg, ACE_TEXT("copy_on_write")) == 0)
00277                     iteration_type = 2;
00278                   else if (ACE_OS::strcasecmp (arg, ACE_TEXT("delayed")) == 0)
00279                     iteration_type = 3;
00280                   else
00281                     ACE_ERROR ((LM_ERROR,
00282                                 "EC_Default_Factory - "
00283                                 "Unknown supplier collection modifier <%s>.\n", arg));
00284                 }
00285               ACE_OS::free(opt);
00286               this->supplier_collection_ =
00287                 (synch_type << 8) | (collection_type << 4) | iteration_type;
00288               arg_shifter.consume_arg ();
00289             }
00290         }
00291 
00292       else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECProxyConsumerLock")) == 0)
00293         {
00294           arg_shifter.consume_arg ();
00295 
00296           if (arg_shifter.is_parameter_next ())
00297             {
00298               const ACE_TCHAR* opt = arg_shifter.get_current ();
00299               if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
00300                 this->consumer_lock_ = 0;
00301               else if (ACE_OS::strcasecmp (opt, ACE_TEXT("thread")) == 0)
00302                 this->consumer_lock_ = 1;
00303               else if (ACE_OS::strcasecmp (opt, ACE_TEXT("recursive")) == 0)
00304                 this->consumer_lock_ = 2;
00305               else
00306                 this->unsupported_option_value ("-ECProxyConsumerLock", opt);
00307               arg_shifter.consume_arg ();
00308             }
00309         }
00310 
00311       else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECProxySupplierLock")) == 0)
00312         {
00313           arg_shifter.consume_arg ();
00314 
00315           if (arg_shifter.is_parameter_next ())
00316             {
00317               const ACE_TCHAR* opt = arg_shifter.get_current ();
00318               if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
00319                 this->supplier_lock_ = 0;
00320               else if (ACE_OS::strcasecmp (opt, ACE_TEXT("thread")) == 0)
00321                 this->supplier_lock_ = 1;
00322               else if (ACE_OS::strcasecmp (opt, ACE_TEXT("recursive")) == 0)
00323                 this->supplier_lock_ = 2;
00324               else
00325                 this->unsupported_option_value ("-ECProxySupplierLock", opt);
00326               arg_shifter.consume_arg ();
00327             }
00328         }
00329 
00330       else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECUseORBId")) == 0)
00331         {
00332           arg_shifter.consume_arg ();
00333 
00334           if (arg_shifter.is_parameter_next ())
00335             {
00336               // Save argument for later use
00337               this->orbid_ = ACE_TEXT_ALWAYS_CHAR(arg_shifter.get_current ());
00338               arg_shifter.consume_arg ();
00339             }
00340         }
00341 
00342       else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECConsumerControl")) == 0)
00343         {
00344           arg_shifter.consume_arg ();
00345 
00346           if (arg_shifter.is_parameter_next ())
00347             {
00348               const ACE_TCHAR* opt = arg_shifter.get_current ();
00349               if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
00350                 this->consumer_control_ = 0;
00351               else if (ACE_OS::strcasecmp (opt, ACE_TEXT("reactive")) == 0)
00352                 this->consumer_control_ = 1;
00353               else
00354                 this->unsupported_option_value ("-ECConsumerControl", opt);
00355               arg_shifter.consume_arg ();
00356             }
00357         }
00358 
00359       else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECSupplierControl")) == 0)
00360         {
00361           arg_shifter.consume_arg ();
00362 
00363           if (arg_shifter.is_parameter_next ())
00364             {
00365               const ACE_TCHAR* opt = arg_shifter.get_current ();
00366               if (ACE_OS::strcasecmp (opt, ACE_TEXT("null")) == 0)
00367                 this->supplier_control_ = 0;
00368               else if (ACE_OS::strcasecmp (opt, ACE_TEXT("reactive")) == 0)
00369                 this->supplier_control_ = 1;
00370               else
00371                 this->unsupported_option_value ("-ECSupplierControl", opt);
00372               arg_shifter.consume_arg ();
00373             }
00374         }
00375 
00376       else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECConsumerControlPeriod")) == 0)
00377         {
00378           arg_shifter.consume_arg ();
00379 
00380           if (arg_shifter.is_parameter_next ())
00381             {
00382               const ACE_TCHAR* opt = arg_shifter.get_current ();
00383               this->consumer_control_period_ = ACE_OS::atoi (opt);
00384               arg_shifter.consume_arg ();
00385             }
00386         }
00387 
00388       else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECSupplierControlPeriod")) == 0)
00389         {
00390           arg_shifter.consume_arg ();
00391 
00392           if (arg_shifter.is_parameter_next ())
00393             {
00394               const ACE_TCHAR* opt = arg_shifter.get_current ();
00395               this->supplier_control_period_ = ACE_OS::atoi (opt);
00396               arg_shifter.consume_arg ();
00397             }
00398         }
00399 
00400       else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECConsumerControlTimeout")) == 0)
00401         {
00402           arg_shifter.consume_arg ();
00403 
00404           if (arg_shifter.is_parameter_next ())
00405             {
00406               const ACE_TCHAR* opt = arg_shifter.get_current ();
00407               unsigned long timeout = ACE_OS::strtoul(opt, 0, 10);
00408               this->consumer_control_timeout_.usec(timeout);
00409               arg_shifter.consume_arg ();
00410             }
00411         }
00412 
00413       else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECSupplierControlTimeout")) == 0)
00414         {
00415           arg_shifter.consume_arg ();
00416 
00417           if (arg_shifter.is_parameter_next ())
00418             {
00419               const ACE_TCHAR* opt = arg_shifter.get_current ();
00420               unsigned long timeout = ACE_OS::strtoul(opt, 0, 10);
00421               this->supplier_control_timeout_.usec(timeout);
00422               arg_shifter.consume_arg ();
00423             }
00424         }
00425 
00426       else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECConsumerValidateConnection")) == 0)
00427         {
00428           arg_shifter.consume_arg ();
00429 
00430           if (arg_shifter.is_parameter_next ())
00431             {
00432               const ACE_TCHAR* opt = arg_shifter.get_current ();
00433               this->consumer_validate_connection_ = ACE_OS::atoi (opt);
00434               arg_shifter.consume_arg ();
00435             }
00436         }
00437 
00438       else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECPushSupplierSet")) == 0)
00439         {
00440           ACE_ERROR ((LM_ERROR,
00441                       "EC_Default_Factory - "
00442                       "obsolete option <%s>, ignored\n", arg));
00443           arg_shifter.consume_arg ();
00444         }
00445 
00446       else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECQueueFullServiceObject")) == 0)
00447         {
00448           arg_shifter.consume_arg ();
00449           if (arg_shifter.is_parameter_next ())
00450             {
00451               const char* opt = arg_shifter.get_current ();
00452               this->queue_full_service_object_name_.set(opt);
00453               arg_shifter.consume_arg ();
00454             }
00455         }
00456 
00457       else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECConsumerAdminLock")) == 0)
00458         {
00459           ACE_ERROR ((LM_ERROR,
00460                       "EC_Default_Factory - "
00461                       "obsolete option <%s>, ignored\n", arg));
00462           arg_shifter.consume_arg ();
00463         }
00464 
00465       else if (ACE_OS::strcasecmp (arg, ACE_TEXT("-ECSupplierAdminLock")) == 0)
00466         {
00467           ACE_ERROR ((LM_ERROR,
00468                       "EC_Default_Factory - "
00469                       "obsolete option <%s>, ignored\n", arg));
00470           arg_shifter.consume_arg ();
00471         }
00472 
00473       else if (ACE_OS::strncmp (arg, ACE_TEXT("-EC"), 3) == 0)
00474         {
00475           arg_shifter.consume_arg ();
00476           ACE_ERROR ((LM_ERROR,
00477                       "EC_Default_Factory - "
00478                       "unknown option <%s>\n",
00479                       arg));
00480         }
00481       else
00482         {
00483           arg_shifter.consume_arg ();
00484           ACE_DEBUG ((LM_DEBUG,
00485                       "EC_Default_Factory - "
00486                       "ignoring option <%s>\n",
00487                       arg));
00488         }
00489     }
00490   return 0;
00491 }
00492 
00493 int
00494 TAO_EC_Default_Factory::fini (void)
00495 {
00496   return 0;
00497 }
00498 
00499 // ****************************************************************
00500 
00501 TAO_EC_Queue_Full_Service_Object*
00502 TAO_EC_Default_Factory::find_service_object (const char* wanted,
00503                                              const char* fallback)
00504 {
00505   TAO_EC_Queue_Full_Service_Object* so = 0;
00506   so = ACE_Dynamic_Service<TAO_EC_Queue_Full_Service_Object>::instance (wanted);
00507   if (so != 0)
00508     return so;
00509 
00510   ACE_ERROR ((LM_ERROR,
00511               "EC (%P|%t) EC_Default_Factory::create_dispatching "
00512               "unable to find queue full service object '%s'; "
00513               "using '%s' instead\n",
00514               wanted,
00515               fallback));
00516 
00517   so = ACE_Dynamic_Service<TAO_EC_Queue_Full_Service_Object>::instance (fallback);
00518   if (so != 0)
00519     return so;
00520 
00521   ACE_ERROR ((LM_ERROR,
00522               "EC (%P|%t) EC_Default_Factory::create_dispatching "
00523                       "unable find default queue full service object '%s'; "
00524                       "aborting.\n",
00525                       fallback));
00526   ACE_OS::abort ();
00527   return 0; // superfluous return to de-warn; we should never reach here
00528 }
00529 
00530 TAO_EC_Dispatching*
00531 TAO_EC_Default_Factory::create_dispatching (TAO_EC_Event_Channel_Base *)
00532 {
00533   if (this->dispatching_ == 0)
00534     return new TAO_EC_Reactive_Dispatching ();
00535   else if (this->dispatching_ == 1)
00536     {
00537       TAO_EC_Queue_Full_Service_Object* so =
00538         this->find_service_object (this->queue_full_service_object_name_.fast_rep(),
00539                                    TAO_EC_DEFAULT_QUEUE_FULL_SERVICE_OBJECT_NAME);
00540       return new TAO_EC_MT_Dispatching (this->dispatching_threads_,
00541                                         this->dispatching_threads_flags_,
00542                                         this->dispatching_threads_priority_,
00543                                         this->dispatching_threads_force_active_,
00544                                         so);
00545     }
00546   return 0;
00547 }
00548 
00549 void
00550 TAO_EC_Default_Factory::destroy_dispatching (TAO_EC_Dispatching *x)
00551 {
00552   delete x;
00553 }
00554 
00555 TAO_EC_Filter_Builder*
00556 TAO_EC_Default_Factory::create_filter_builder (TAO_EC_Event_Channel_Base *ec)
00557 {
00558   if (this->filtering_ == 0)
00559     return new TAO_EC_Null_Filter_Builder ();
00560   else if (this->filtering_ == 1)
00561     return new TAO_EC_Basic_Filter_Builder (ec);
00562   else if (this->filtering_ == 2)
00563     return new TAO_EC_Prefix_Filter_Builder (ec);
00564   return 0;
00565 }
00566 
00567 void
00568 TAO_EC_Default_Factory::destroy_filter_builder (TAO_EC_Filter_Builder *x)
00569 {
00570   delete x;
00571 }
00572 
00573 TAO_EC_Supplier_Filter_Builder*
00574 TAO_EC_Default_Factory::create_supplier_filter_builder (TAO_EC_Event_Channel_Base *ec)
00575 {
00576   if (this->supplier_filtering_ == 0)
00577     return new TAO_EC_Trivial_Supplier_Filter_Builder (ec);
00578   else if (this->supplier_filtering_ == 1)
00579     return new TAO_EC_Per_Supplier_Filter_Builder (ec);
00580   return 0;
00581 }
00582 
00583 void
00584 TAO_EC_Default_Factory::destroy_supplier_filter_builder (TAO_EC_Supplier_Filter_Builder *x)
00585 {
00586   delete x;
00587 }
00588 
00589 TAO_EC_ConsumerAdmin*
00590 TAO_EC_Default_Factory::create_consumer_admin (TAO_EC_Event_Channel_Base *ec)
00591 {
00592   return new TAO_EC_ConsumerAdmin (ec);
00593 }
00594 
00595 void
00596 TAO_EC_Default_Factory::destroy_consumer_admin (TAO_EC_ConsumerAdmin *x)
00597 {
00598   delete x;
00599 }
00600 
00601 TAO_EC_SupplierAdmin*
00602 TAO_EC_Default_Factory::create_supplier_admin (TAO_EC_Event_Channel_Base *ec)
00603 {
00604   return new TAO_EC_SupplierAdmin (ec);
00605 }
00606 
00607 void
00608 TAO_EC_Default_Factory::destroy_supplier_admin (TAO_EC_SupplierAdmin *x)
00609 {
00610   delete x;
00611 }
00612 
00613 TAO_EC_ProxyPushSupplier*
00614 TAO_EC_Default_Factory::create_proxy_push_supplier (TAO_EC_Event_Channel_Base *ec)
00615 {
00616   return new TAO_EC_Default_ProxyPushSupplier (ec, consumer_validate_connection_);
00617 }
00618 
00619 void
00620 TAO_EC_Default_Factory::destroy_proxy_push_supplier (TAO_EC_ProxyPushSupplier *x)
00621 {
00622   delete x;
00623 }
00624 
00625 TAO_EC_ProxyPushConsumer*
00626 TAO_EC_Default_Factory::create_proxy_push_consumer (TAO_EC_Event_Channel_Base *ec)
00627 {
00628   return new TAO_EC_Default_ProxyPushConsumer (ec);
00629 }
00630 
00631 void
00632 TAO_EC_Default_Factory::destroy_proxy_push_consumer (TAO_EC_ProxyPushConsumer *x)
00633 {
00634   delete x;
00635 }
00636 
00637 TAO_EC_Timeout_Generator*
00638 TAO_EC_Default_Factory::create_timeout_generator (TAO_EC_Event_Channel_Base *)
00639 {
00640   if (this->timeout_ == 0)
00641     {
00642       int argc = 0;
00643       char **argv = 0;
00644       CORBA::ORB_var orb =
00645         CORBA::ORB_init (argc, argv, this->orbid_.c_str ());
00646 
00647       ACE_Reactor *reactor = orb->orb_core ()->reactor ();
00648       return new TAO_EC_Reactive_Timeout_Generator (reactor);
00649     }
00650 #if 0
00651   else if (this->timeout_ == 1)
00652     {
00653     }
00654 #endif
00655   return 0;
00656 }
00657 
00658 void
00659 TAO_EC_Default_Factory::destroy_timeout_generator (TAO_EC_Timeout_Generator *x)
00660 {
00661   delete x;
00662 }
00663 
00664 TAO_EC_ObserverStrategy*
00665 TAO_EC_Default_Factory::create_observer_strategy (TAO_EC_Event_Channel_Base *ec)
00666 {
00667   if (this->observer_ == 0)
00668     return new TAO_EC_Null_ObserverStrategy;
00669   else if (this->observer_ == 1)
00670     {
00671       // @@ The lock should also be under control of the user...
00672       ACE_Lock* lock = 0;
00673       ACE_NEW_RETURN (lock, ACE_Lock_Adapter<TAO_SYNCH_MUTEX>, 0);
00674       return new TAO_EC_Basic_ObserverStrategy (ec, lock);
00675     }
00676   else if (this->observer_ == 2)
00677     {
00678       // @@ The lock should also be under control of the user...
00679       ACE_Lock* lock = 0;
00680       ACE_NEW_RETURN (lock, ACE_Lock_Adapter<TAO_SYNCH_MUTEX>, 0);
00681       return new TAO_EC_Reactive_ObserverStrategy (ec, lock);
00682     }
00683   return 0;
00684 }
00685 
00686 void
00687 TAO_EC_Default_Factory::destroy_observer_strategy (TAO_EC_ObserverStrategy *x)
00688 {
00689   delete x;
00690 }
00691 
00692 TAO_EC_Scheduling_Strategy*
00693 TAO_EC_Default_Factory::create_scheduling_strategy (TAO_EC_Event_Channel_Base*)
00694 {
00695   if (this->scheduling_ == 0)
00696     return new TAO_EC_Null_Scheduling;
00697   else if (this->scheduling_ == 1)
00698     return new TAO_EC_Group_Scheduling;
00699   return 0;
00700 }
00701 
00702 void
00703 TAO_EC_Default_Factory::destroy_scheduling_strategy (TAO_EC_Scheduling_Strategy* x)
00704 {
00705   delete x;
00706 }
00707 
00708 // These typedefs workaround a SunCC 4.2 bug
00709 typedef
00710     TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>::Iterator
00711     TAO_EC_Consumer_List_Iterator;
00712 typedef
00713     TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>::Iterator
00714     TAO_EC_Consumer_RB_Tree_Iterator;
00715 typedef
00716     TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>::Iterator
00717     TAO_EC_Supplier_List_Iterator;
00718 typedef
00719     TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>::Iterator
00720     TAO_EC_Supplier_RB_Tree_Iterator;
00721 
00722 
00723 TAO_EC_ProxyPushConsumer_Collection*
00724 TAO_EC_Default_Factory::create_proxy_push_consumer_collection (TAO_EC_Event_Channel_Base *)
00725 {
00726   if (this->consumer_collection_ == 0x000)
00727     return new TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushConsumer,
00728       TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
00729       TAO_EC_Consumer_List_Iterator,
00730       TAO_SYNCH_MUTEX> ();
00731   else if (this->consumer_collection_ == 0x001)
00732     return new TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushConsumer,
00733       TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
00734       TAO_EC_Consumer_List_Iterator,
00735       TAO_SYNCH_MUTEX> ();
00736   else if (this->consumer_collection_ == 0x002)
00737     return new TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushConsumer,
00738       TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
00739       TAO_EC_Consumer_List_Iterator,
00740       ACE_SYNCH> ();
00741   else if (this->consumer_collection_ == 0x003)
00742     return new TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
00743       TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
00744       TAO_EC_Consumer_List_Iterator,
00745       ACE_SYNCH> ();
00746   else if (this->consumer_collection_ == 0x010)
00747     return new TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushConsumer,
00748       TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
00749       TAO_EC_Consumer_RB_Tree_Iterator,
00750       TAO_SYNCH_MUTEX> ();
00751   else if (this->consumer_collection_ == 0x011)
00752     return new TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushConsumer,
00753       TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
00754       TAO_EC_Consumer_RB_Tree_Iterator,
00755       TAO_SYNCH_MUTEX> ();
00756   else if (this->consumer_collection_ == 0x012)
00757     return new TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushConsumer,
00758       TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
00759       TAO_EC_Consumer_RB_Tree_Iterator,
00760       ACE_SYNCH> ();
00761   else if (this->consumer_collection_ == 0x013)
00762     return new TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
00763       TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
00764       TAO_EC_Consumer_RB_Tree_Iterator,
00765       ACE_SYNCH> ();
00766   else if (this->consumer_collection_ == 0x100)
00767     return new TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushConsumer,
00768       TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
00769       TAO_EC_Consumer_List_Iterator,
00770       ACE_Null_Mutex> ();
00771   else if (this->consumer_collection_ == 0x101)
00772     return new TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushConsumer,
00773       TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
00774       TAO_EC_Consumer_List_Iterator,
00775       ACE_Null_Mutex> ();
00776   else if (this->consumer_collection_ == 0x102)
00777     return new TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushConsumer,
00778       TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
00779       TAO_EC_Consumer_List_Iterator,
00780       ACE_NULL_SYNCH> ();
00781   else if (this->consumer_collection_ == 0x103)
00782     return new TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
00783       TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
00784       TAO_EC_Consumer_List_Iterator,
00785       ACE_NULL_SYNCH> ();
00786   else if (this->consumer_collection_ == 0x110)
00787     return new TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushConsumer,
00788       TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
00789       TAO_EC_Consumer_RB_Tree_Iterator,
00790       ACE_Null_Mutex> ();
00791   else if (this->consumer_collection_ == 0x111)
00792     return new TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushConsumer,
00793       TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
00794       TAO_EC_Consumer_RB_Tree_Iterator,
00795       ACE_Null_Mutex> ();
00796   else if (this->consumer_collection_ == 0x112)
00797     return new TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushConsumer,
00798       TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
00799       TAO_EC_Consumer_RB_Tree_Iterator,
00800       ACE_NULL_SYNCH> ();
00801   else if (this->consumer_collection_ == 0x113)
00802     return new TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
00803       TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
00804       TAO_EC_Consumer_RB_Tree_Iterator,
00805       ACE_NULL_SYNCH> ();
00806 
00807   return 0;
00808 }
00809 
00810 void
00811 TAO_EC_Default_Factory::destroy_proxy_push_consumer_collection (TAO_EC_ProxyPushConsumer_Collection *x)
00812 {
00813   delete x;
00814 }
00815 
00816 TAO_EC_ProxyPushSupplier_Collection*
00817 TAO_EC_Default_Factory::create_proxy_push_supplier_collection (TAO_EC_Event_Channel_Base *)
00818 {
00819   if (this->supplier_collection_ == 0x000)
00820     return new TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushSupplier,
00821       TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
00822       TAO_EC_Supplier_List_Iterator,
00823       TAO_SYNCH_MUTEX> ();
00824   else if (this->supplier_collection_ == 0x001)
00825     return new TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushSupplier,
00826       TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
00827       TAO_EC_Supplier_List_Iterator,
00828       TAO_SYNCH_MUTEX> ();
00829   else if (this->supplier_collection_ == 0x002)
00830     return new TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushSupplier,
00831       TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
00832       TAO_EC_Supplier_List_Iterator,
00833       ACE_SYNCH> ();
00834   else if (this->supplier_collection_ == 0x003)
00835     return new TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
00836       TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
00837       TAO_EC_Supplier_List_Iterator,
00838       ACE_SYNCH> ();
00839   else if (this->supplier_collection_ == 0x010)
00840     return new TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushSupplier,
00841       TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
00842       TAO_EC_Supplier_RB_Tree_Iterator,
00843       TAO_SYNCH_MUTEX> ();
00844   else if (this->supplier_collection_ == 0x011)
00845     return new TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushSupplier,
00846       TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
00847       TAO_EC_Supplier_RB_Tree_Iterator,
00848       TAO_SYNCH_MUTEX> ();
00849   else if (this->supplier_collection_ == 0x012)
00850     return new TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushSupplier,
00851       TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
00852       TAO_EC_Supplier_RB_Tree_Iterator,
00853       ACE_SYNCH> ();
00854   else if (this->supplier_collection_ == 0x013)
00855     return new TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
00856       TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
00857       TAO_EC_Supplier_RB_Tree_Iterator,
00858       ACE_SYNCH> ();
00859   else if (this->supplier_collection_ == 0x100)
00860     return new TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushSupplier,
00861       TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
00862       TAO_EC_Supplier_List_Iterator,
00863       ACE_Null_Mutex> ();
00864   else if (this->supplier_collection_ == 0x101)
00865     return new TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushSupplier,
00866       TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
00867       TAO_EC_Supplier_List_Iterator,
00868       ACE_Null_Mutex> ();
00869   else if (this->supplier_collection_ == 0x102)
00870     return new TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushSupplier,
00871       TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
00872       TAO_EC_Supplier_List_Iterator,
00873       ACE_NULL_SYNCH> ();
00874   else if (this->supplier_collection_ == 0x103)
00875     return new TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
00876       TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
00877       TAO_EC_Supplier_List_Iterator,
00878       ACE_NULL_SYNCH> ();
00879   else if (this->supplier_collection_ == 0x110)
00880     return new TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushSupplier,
00881       TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
00882       TAO_EC_Supplier_RB_Tree_Iterator,
00883       ACE_Null_Mutex> ();
00884   else if (this->supplier_collection_ == 0x111)
00885     return new TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushSupplier,
00886       TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
00887       TAO_EC_Supplier_RB_Tree_Iterator,
00888       ACE_Null_Mutex> ();
00889   else if (this->supplier_collection_ == 0x112)
00890     return new TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushSupplier,
00891       TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
00892       TAO_EC_Supplier_RB_Tree_Iterator,
00893       ACE_NULL_SYNCH> ();
00894   else if (this->supplier_collection_ == 0x113)
00895     return new TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
00896       TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
00897       TAO_EC_Supplier_RB_Tree_Iterator,
00898       ACE_NULL_SYNCH> ();
00899 
00900   return 0;
00901 }
00902 
00903 void
00904 TAO_EC_Default_Factory::destroy_proxy_push_supplier_collection (TAO_EC_ProxyPushSupplier_Collection *x)
00905 {
00906   delete x;
00907 }
00908 
00909 ACE_Lock*
00910 TAO_EC_Default_Factory::create_consumer_lock (void)
00911 {
00912   if (this->consumer_lock_ == 0)
00913     return new ACE_Lock_Adapter<ACE_Null_Mutex>;
00914   else if (this->consumer_lock_ == 1)
00915     return new ACE_Lock_Adapter<TAO_SYNCH_MUTEX> ();
00916   else if (this->consumer_lock_ == 2)
00917     return new ACE_Lock_Adapter<TAO_SYNCH_RECURSIVE_MUTEX> ();
00918   return 0;
00919 }
00920 
00921 void
00922 TAO_EC_Default_Factory::destroy_consumer_lock (ACE_Lock* x)
00923 {
00924   delete x;
00925 }
00926 
00927 ACE_Lock*
00928 TAO_EC_Default_Factory::create_supplier_lock (void)
00929 {
00930   if (this->supplier_lock_ == 0)
00931     return new ACE_Lock_Adapter<ACE_Null_Mutex>;
00932   else if (this->supplier_lock_ == 1)
00933     return new ACE_Lock_Adapter<TAO_SYNCH_MUTEX> ();
00934   else if (this->supplier_lock_ == 2)
00935     return new ACE_Lock_Adapter<TAO_SYNCH_RECURSIVE_MUTEX> ();
00936   return 0;
00937 }
00938 
00939 void
00940 TAO_EC_Default_Factory::destroy_supplier_lock (ACE_Lock* x)
00941 {
00942   delete x;
00943 }
00944 
00945 TAO_EC_ConsumerControl*
00946 TAO_EC_Default_Factory::create_consumer_control (TAO_EC_Event_Channel_Base* ec)
00947 {
00948   if (this->consumer_control_ == 0)
00949     return new TAO_EC_ConsumerControl ();
00950   else if (this->consumer_control_ == 1)
00951     {
00952       int argc = 0;
00953       char **argv = 0;
00954       CORBA::ORB_var orb =
00955         CORBA::ORB_init (argc, argv, this->orbid_.c_str ());
00956 
00957       ACE_Time_Value rate (0, this->consumer_control_period_);
00958       return new TAO_EC_Reactive_ConsumerControl (rate, consumer_control_timeout_, ec, orb.in ());
00959     }
00960   return 0;
00961 }
00962 
00963 void
00964 TAO_EC_Default_Factory::destroy_consumer_control (TAO_EC_ConsumerControl* x)
00965 {
00966   delete x;
00967 }
00968 
00969 TAO_EC_SupplierControl*
00970 TAO_EC_Default_Factory::create_supplier_control (TAO_EC_Event_Channel_Base* ec)
00971 {
00972   if (this->supplier_control_ == 0)
00973     return new TAO_EC_SupplierControl ();
00974   else if (this->supplier_control_ == 1)
00975     {
00976       int argc = 0;
00977       char **argv = 0;
00978       CORBA::ORB_var orb =
00979         CORBA::ORB_init (argc, argv, this->orbid_.c_str ());
00980 
00981       ACE_Time_Value rate (0, this->supplier_control_period_);
00982       return new TAO_EC_Reactive_SupplierControl (rate, supplier_control_timeout_, ec, orb.in ());
00983     }
00984   return 0;
00985 }
00986 
00987 void
00988 TAO_EC_Default_Factory::destroy_supplier_control (TAO_EC_SupplierControl* x)
00989 {
00990   delete x;
00991 }
00992 
00993 TAO_END_VERSIONED_NAMESPACE_DECL
00994 
00995 // ****************************************************************
00996 
00997 ACE_STATIC_SVC_DEFINE (TAO_EC_Default_Factory,
00998                        ACE_TEXT ("EC_Factory"),
00999                        ACE_SVC_OBJ_T,
01000                        &ACE_SVC_NAME (TAO_EC_Default_Factory),
01001                        ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
01002                        0)
01003 ACE_FACTORY_DEFINE (TAO_RTEvent_Serv, TAO_EC_Default_Factory)

Generated on Thu Nov 9 13:11:06 2006 for TAO_RTEvent by doxygen 1.3.6