diff options
Diffstat (limited to 'TAO/orbsvcs/tests/Notify/Sequence_Multi_ETCL_Filter/Sequence_Supplier.cpp')
-rw-r--r-- | TAO/orbsvcs/tests/Notify/Sequence_Multi_ETCL_Filter/Sequence_Supplier.cpp | 359 |
1 files changed, 191 insertions, 168 deletions
diff --git a/TAO/orbsvcs/tests/Notify/Sequence_Multi_ETCL_Filter/Sequence_Supplier.cpp b/TAO/orbsvcs/tests/Notify/Sequence_Multi_ETCL_Filter/Sequence_Supplier.cpp index 62127227df9..db0881c717e 100644 --- a/TAO/orbsvcs/tests/Notify/Sequence_Multi_ETCL_Filter/Sequence_Supplier.cpp +++ b/TAO/orbsvcs/tests/Notify/Sequence_Multi_ETCL_Filter/Sequence_Supplier.cpp @@ -5,6 +5,7 @@ // ****************************************************************** #include "ace/Get_Opt.h" +#include "ace/Auto_Ptr.h" #include "tao/ORB_Core.h" @@ -22,30 +23,53 @@ // ****************************************************************** static TAO_Notify_Tests_SequencePushSupplier* supplier_1 = 0; -static CORBA::Boolean done = 0; -static CORBA::Boolean start = 0; static int max_events = 6; // 6 sets of 16 static const char* ior_output_file = "supplier.ior"; // ****************************************************************** // Subroutine Section // ****************************************************************** - class sig_i : public POA_sig { public: + sig_i(CORBA::ORB_ptr orb) + : orb_(orb) + , started_(false) + { + } + void go (ACE_ENV_SINGLE_ARG_DECL) - ACE_THROW_SPEC ((CORBA::SystemException)); -}; + ACE_THROW_SPEC ((CORBA::SystemException)) + { + started_ = true; + } + void done (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) + { + started_ = false; + } -void -sig_i::go (ACE_ENV_SINGLE_ARG_DECL_NOT_USED /*ACE_ENV_SINGLE_ARG_PARAMETER*/) - ACE_THROW_SPEC ((CORBA::SystemException)) -{ - start = 1; -} + void wait_for_startup() + { + while (! started_) { + ACE_Time_Value tv(0, 100 * 1000); // 100ms + orb_->run(tv); + } + } + void wait_for_completion() + { + while (started_) { + ACE_Time_Value tv(0, 100 * 1000); // 100ms + orb_->run(tv); + } + } + +private: + CORBA::ORB_ptr orb_; + bool started_; +}; class Supplier_Client : public Notify_Test_Client { @@ -62,23 +86,23 @@ Supplier_Client::parse_args (int argc, char *argv[]) while ((c = get_opts ()) != -1) switch (c) - { - case 'e': - max_events = ACE_OS::atoi (get_opts.optarg); - break; - - case 'o': - ior_output_file = get_opts.optarg; - break; - - default: - ACE_ERROR_RETURN ((LM_ERROR, - "usage: %s " - "-o <iorfile> -e <# of events>" - "\n", - argv [0]), - -1); - } + { + case 'e': + max_events = ACE_OS::atoi (get_opts.optarg); + break; + + case 'o': + ior_output_file = get_opts.optarg; + break; + + default: + ACE_ERROR_RETURN ((LM_ERROR, + "usage: %s " + "-o <iorfile> -e <# of events>" + "\n", + argv [0]), + -1); + } // Indicates sucessful parsing of the command line return 0; @@ -92,8 +116,8 @@ create_supplieradmin (CosNotifyChannelAdmin::EventChannel_ptr ec CosNotifyChannelAdmin::AdminID adminid = 0; CosNotifyChannelAdmin::SupplierAdmin_var admin = ec->new_for_suppliers (CosNotifyChannelAdmin::AND_OP, - adminid - ACE_ENV_ARG_PARAMETER); + adminid + ACE_ENV_ARG_PARAMETER); ACE_CHECK_RETURN (0); @@ -102,97 +126,86 @@ create_supplieradmin (CosNotifyChannelAdmin::EventChannel_ptr ec static void -SendEvents (void) +SendEvents (int id ACE_ENV_ARG_DECL) { - if (start) - { - static int count = 0; - static const char* types[] = { "good", "bad", "ugly" }; - CosNotification::EventBatch events; - - CosNotification::StructuredEvent event; - event.header.fixed_header.event_type.domain_name = - CORBA::string_dup ("Orbix 2000 Demos"); - event.header.fixed_header.event_type.type_name = - CORBA::string_dup ("Sequence Notification Push Demo Event"); - - event.header.fixed_header.event_name = CORBA::string_dup ("test event"); - - - event.header.variable_header.length (2); - event.header.variable_header[0].name = - CORBA::string_dup (CosNotification::Priority); - event.header.variable_header[0].value <<= (CORBA::Short) - (count > max_events / 2 ? - -count : count); - event.header.variable_header[1].name = - CORBA::string_dup (CosNotification::Timeout); - event.header.variable_header[1].value <<= (TimeBase::TimeT) - ((max_events - count) * 60); - event.filterable_data.length (3); - event.filterable_data[0].name = CORBA::string_dup ("objectId"); - event.filterable_data[0].value <<= (CORBA::Long)0xdad; - - event.filterable_data[1].name = CORBA::string_dup ("type"); - event.filterable_data[1].value <<= types[count % 3]; - - event.filterable_data[2].name = CORBA::string_dup ("enum"); - event.filterable_data[2].value <<= (CORBA::Long) - (count > max_events / 2 ? - -count : count); - - events.length (16); - events[0] = event; - - CosNotification::StructuredEvent revents[15]; - for (int z = 0; z < 15; z++) - { - revents[z].header.fixed_header.event_type.domain_name = - CORBA::string_dup ("Orbix 2000 Demos"); - revents[z].header.fixed_header.event_type.type_name = - CORBA::string_dup ("Extra Events"); - - revents[z].header.fixed_header.event_name = CORBA::string_dup ("test revents[z]"); - - revents[z].header.variable_header.length (1); - revents[z].header.variable_header[0].name = - CORBA::string_dup (CosNotification::Priority); - revents[z].header.variable_header[0].value <<= (CORBA::Short) - (count > max_events / 2 ? - -count : count); - - revents[z].filterable_data.length (3); - revents[z].filterable_data[0].name = CORBA::string_dup ("objectId"); - revents[z].filterable_data[0].value <<= (CORBA::Long)z; - - revents[z].filterable_data[1].name = CORBA::string_dup ("type"); - revents[z].filterable_data[1].value <<= types[2 - (count % 3)]; - - revents[z].filterable_data[2].name = CORBA::string_dup ("enum"); - revents[z].filterable_data[2].value <<= (CORBA::Long) - (count > max_events / 2 ? - -count : count); - events[z + 1] = revents[z]; - } - count++; - - if (count >= max_events) - { - done = 1; - } + static const char* types[] = { "good", "bad", "ugly" }; + CosNotification::EventBatch events; + + CosNotification::StructuredEvent event; + event.header.fixed_header.event_type.domain_name = + CORBA::string_dup ("Orbix 2000 Demos"); + event.header.fixed_header.event_type.type_name = + CORBA::string_dup ("Sequence Notification Push Demo Event"); + + event.header.fixed_header.event_name = CORBA::string_dup ("test event"); + + + event.header.variable_header.length (2); + event.header.variable_header[0].name = + CORBA::string_dup (CosNotification::Priority); + event.header.variable_header[0].value <<= (CORBA::Short) + (id > max_events / 2 ? + -id : id); + event.header.variable_header[1].name = + CORBA::string_dup (CosNotification::Timeout); + event.header.variable_header[1].value <<= (TimeBase::TimeT) + ((max_events - id) * 60); + event.filterable_data.length (3); + event.filterable_data[0].name = CORBA::string_dup ("objectId"); + event.filterable_data[0].value <<= (CORBA::Long)0xdad; + + event.filterable_data[1].name = CORBA::string_dup ("type"); + event.filterable_data[1].value <<= types[id % 3]; + + event.filterable_data[2].name = CORBA::string_dup ("enum"); + event.filterable_data[2].value <<= (CORBA::Long) + (id > max_events / 2 ? + -id : id); + + events.length (16); + events[0] = event; + + CosNotification::StructuredEvent revents[15]; + for (int z = 0; z < 15; z++) + { + revents[z].header.fixed_header.event_type.domain_name = + CORBA::string_dup ("Orbix 2000 Demos"); + revents[z].header.fixed_header.event_type.type_name = + CORBA::string_dup ("Extra Events"); + + revents[z].header.fixed_header.event_name = CORBA::string_dup ("test revents[z]"); + + revents[z].header.variable_header.length (1); + revents[z].header.variable_header[0].name = + CORBA::string_dup (CosNotification::Priority); + revents[z].header.variable_header[0].value <<= (CORBA::Short) + (id > max_events / 2 ? + -id : id); + + revents[z].filterable_data.length (3); + revents[z].filterable_data[0].name = CORBA::string_dup ("objectId"); + revents[z].filterable_data[0].value <<= (CORBA::Long)z; + + revents[z].filterable_data[1].name = CORBA::string_dup ("type"); + revents[z].filterable_data[1].value <<= types[2 - (id % 3)]; + + revents[z].filterable_data[2].name = CORBA::string_dup ("enum"); + revents[z].filterable_data[2].value <<= (CORBA::Long) + (id > max_events / 2 ? + -id : id); + events[z + 1] = revents[z]; + } - ACE_TRY_NEW_ENV - { - supplier_1->send_events (events ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - } - ACE_CATCH (CORBA::Exception, e) - { - ACE_PRINT_EXCEPTION (e, - "Supplier exception: "); - } - ACE_ENDTRY; + ACE_TRY_NEW_ENV + { + supplier_1->send_events (events ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; } + ACE_CATCH (CORBA::Exception, e) + { + ACE_PRINT_EXCEPTION (e, "Error: Supplier exception: "); + } + ACE_ENDTRY; } static void @@ -202,8 +215,8 @@ create_suppliers (CosNotifyChannelAdmin::SupplierAdmin_ptr admin, { // start up the supplier ACE_NEW_THROW_EX (supplier_1, - TAO_Notify_Tests_SequencePushSupplier (), - CORBA::NO_MEMORY ()); + TAO_Notify_Tests_SequencePushSupplier (), + CORBA::NO_MEMORY ()); supplier_1->init (poa ACE_ENV_ARG_PARAMETER); ACE_CHECK; @@ -219,66 +232,76 @@ create_suppliers (CosNotifyChannelAdmin::SupplierAdmin_ptr admin, int main (int argc, char* argv[]) { + ACE_Auto_Ptr< sig_i > sig_impl; int status = 0; ACE_TRY_NEW_ENV + { + Supplier_Client client; + status = client.init (argc, argv ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + if (status == 0) { - Supplier_Client client; - status = client.init (argc, argv ACE_ENV_ARG_PARAMETER); + CosNotifyChannelAdmin::EventChannel_var ec = + client.create_event_channel ("MyEventChannel", 0 ACE_ENV_ARG_PARAMETER); ACE_TRY_CHECK; - if (status == 0) + CORBA::ORB_ptr orb = client.orb (); + + sig_impl.reset( new sig_i( orb ) ); + sig_var sig = sig_impl->_this (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + CORBA::String_var ior = + orb->object_to_string (sig.in () ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + // If the ior_output_file exists, output the ior to it + if (ior_output_file != 0) + { + FILE *output_file= ACE_OS::fopen (ior_output_file, "w"); + if (output_file == 0) + ACE_ERROR_RETURN ((LM_ERROR, + "Cannot open output file for " + "writing IOR: %s", + ior_output_file), + 1); + ACE_OS::fprintf (output_file, "%s", ior.in ()); + ACE_OS::fclose (output_file); + } + + CosNotifyChannelAdmin::SupplierAdmin_var admin = + create_supplieradmin (ec.in () ACE_ENV_ARG_PARAMETER); + if (!CORBA::is_nil (admin.in ())) + { + create_suppliers (admin.in (), client.root_poa () ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + sig_impl->wait_for_startup(); + + ACE_DEBUG((LM_DEBUG, " 1 supplier sending %d events...\n", max_events)); + for (int i = 0; i < max_events; ++i) { - CosNotifyChannelAdmin::EventChannel_var ec = - client.create_event_channel ("MyEventChannel", 0 ACE_ENV_ARG_PARAMETER); + ACE_DEBUG((LM_DEBUG, "+")); + SendEvents (i ACE_ENV_ARG_PARAMETER); ACE_TRY_CHECK; + } + ACE_DEBUG((LM_DEBUG, "\nSupplier sent %d events.\n", max_events)); - sig_i sig_impl; - sig_var sig = sig_impl._this (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_TRY_CHECK; + sig_impl->wait_for_completion(); - CORBA::ORB_ptr orb = client.orb (); - CORBA::String_var ior = - orb->object_to_string (sig.in () ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; + ACE_OS::unlink (ior_output_file); - // If the ior_output_file exists, output the ior to it - if (ior_output_file != 0) - { - FILE *output_file= ACE_OS::fopen (ior_output_file, "w"); - if (output_file == 0) - ACE_ERROR_RETURN ((LM_ERROR, - "Cannot open output file for " - "writing IOR: %s", - ior_output_file), - 1); - ACE_OS::fprintf (output_file, "%s", ior.in ()); - ACE_OS::fclose (output_file); - } - - CosNotifyChannelAdmin::SupplierAdmin_var admin = - create_supplieradmin (ec.in () ACE_ENV_ARG_PARAMETER); - if (!CORBA::is_nil (admin.in ())) - { - create_suppliers (admin.in (), client.root_poa () ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - - while (!done) - { - SendEvents (); - if (orb->work_pending ()) - { - orb->perform_work (); - } - } - } - } + ec->destroy(ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + } } + } ACE_CATCH (CORBA::Exception, e) - { - ACE_PRINT_EXCEPTION (e, - "Supplier exception: "); - status = 1; - } + { + ACE_PRINT_EXCEPTION (e, "Error: Supplier exception: "); + status = 1; + } ACE_ENDTRY; return status; |