00001
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
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
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
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;
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
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
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
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)