/// The main driver int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) { #if TAO_HAS_TRANSPORT_CURRENT == 1 try { Test::Client_Request_Interceptor* cri = 0; ACE_NEW_RETURN (cri, Test::Client_Request_Interceptor (CLIENT_ORB_ID, test_transport_current), -1); PortableInterceptor::ClientRequestInterceptor_var cri_safe (cri); PortableInterceptor::ORBInitializer_ptr temp_initializer = 0; ACE_NEW_RETURN (temp_initializer, Test::Client_ORBInitializer (cri), -1); PortableInterceptor::ORBInitializer_var orb_initializer (temp_initializer); PortableInterceptor::register_orb_initializer (orb_initializer.in ()); CORBA::ORB_var orb = CORBA::ORB_init (argc, argv, CLIENT_ORB_ID); if (parse_args (argc, argv) != 0) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("Client (%P|%t) Failure to parse the command line.\n"), ior), -1); try { test_transport_current (orb.in ()); ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("Client (%P|%t) ERROR: ") ACE_TEXT ("TC invocation, outside of ") ACE_TEXT ("interceptor context is undefined.") ACE_TEXT (" Expected exception was not thrown\n")), -1); } catch (const Transport::NoContext& ) { ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Client (%P|%t) Expected exception occured when trying ") ACE_TEXT ("to access traits outside the ") ACE_TEXT ("interceptor or upcall context.\n"))); } // Resolve the target object CORBA::Object_var obj = orb->string_to_object (ior); Test::Transport::CurrentTest_var server = Test::Transport::CurrentTest::_narrow (obj.in ()); if (CORBA::is_nil (server.in ())) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("Client (%P|%t) The server object reference <%s> is nil.\n"), ior), -1); ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Client (%P|%t) Spawning %d threads\n"), nthreads)); // Spawn a number of clients doing the same thing for a // predetermined number of times Worker client (server.in (), niterations, use_dii); #if defined (ACE_HAS_THREADS) if (client.activate (THR_NEW_LWP | THR_JOINABLE, nthreads) != 0) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("Client (%P|%t) Cannot activate %d client threads\n"), nthreads), -1); client.thr_mgr ()->wait (); #else if (nthreads > 1) ACE_ERROR ((LM_WARNING, ACE_TEXT ("Client (%P|%t) Cannot use threads other than ") ACE_TEXT ("the only one available.\n"))); client.svc (); #endif ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Client (%P|%t) Collected any threads\n"))); CORBA::Long result = 0; // Verify enough interception points have been triggered if (cri->interceptions () != 2 * // request & response niterations * // iterations nthreads * // threads (2*use_dii)) // sii and dii, if needed { ACE_ERROR ((LM_ERROR, ACE_TEXT ("Client (%P|%t) Expected %d client-side interceptions, but detected %d\n"), 2 * niterations * nthreads * (2*use_dii), cri->interceptions ())); } else { ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Client (%P|%t) Invoking server->self_test()\n"))); // Self-test the server side result = server->self_test (); if (result != 0) ACE_ERROR ((LM_ERROR, ACE_TEXT ("Client (%P|%t) Server self-test reported failure\n"))); } ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Client (%P|%t) Invoking oneway server->shutdown()\n"))); server->shutdown (); orb->destroy (); ACE_DEBUG ((LM_INFO, ACE_TEXT ("Client (%P|%t) Completed %s\n"), ((result == 0) ? ACE_TEXT ("successfuly") : ACE_TEXT ("with failure")))); return result; } catch (const CORBA::Exception& ex) { ex._tao_print_exception ( ACE_TEXT ( "Client: Transport Current test (client-side) failed:")); return -1; } #else /* TAO_HAS_TRANSPORT_CURRENT == 1 */ ACE_DEBUG ((LM_INFO, ACE_TEXT ("Client (%P|%t) Need TAO_HAS_TRANSPORT_CURRENT enabled to run.\n"))); return 0; #endif /* TAO_HAS_TRANSPORT_CURRENT == 1 */ }
int server_main (int argc, ACE_TCHAR *argv[], Test::Server_Request_Interceptor *cri) { #if TAO_HAS_TRANSPORT_CURRENT == 1 try { PortableInterceptor::ORBInitializer_ptr temp_initializer = 0; ACE_NEW_RETURN (temp_initializer, Test::Server_ORBInitializer (cri), -1); // No exceptions yet! PortableInterceptor::ORBInitializer_var orb_initializer (temp_initializer); PortableInterceptor::register_orb_initializer (orb_initializer.in ()); CORBA::ORB_var orb = CORBA::ORB_init (argc, argv, "test_orb"); CORBA::Object_var obj = orb->resolve_initial_references ("RootPOA"); PortableServer::POA_var root_poa = PortableServer::POA::_narrow (obj.in ()); if (CORBA::is_nil (root_poa.in ())) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("Server (%P|%t) Unable to obtain") ACE_TEXT (" RootPOA reference.\n")), -1); PortableServer::POAManager_var poa_manager = root_poa->the_POAManager (); poa_manager->activate (); if (parse_args (argc, argv) != 0) return -1; Current_Test_Impl server_impl (orb.in (), root_poa.in (), use_collocated_call); obj = server_impl._this (); Test::Transport::CurrentTest_var server = Test::Transport::CurrentTest::_narrow (obj.in ()); if (CORBA::is_nil (server.in ())) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("Server (%P|%t) Unable to obtain ") ACE_TEXT ("reference to CurrentTest object.\n")), -1); CORBA::String_var ior = orb->object_to_string (server.in ()); // 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, "Server (%P|%t) Cannot write %s " "IOR: %C - %m", ior_output_file, ior.in ()), -1); ACE_OS::fprintf (output_file, "%s", ior.in ()); ACE_OS::fclose (output_file); } // Spawn a number of clients doing the same thing for a // predetermined number of times Worker worker (orb.in ()); #if defined (ACE_HAS_THREADS) if (worker.activate (THR_NEW_LWP | THR_JOINABLE, nthreads) != 0) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("Server (%P|%t) Cannot activate %d threads\n"), nthreads), -1); //FUZZ: disable check_for_lack_ACE_OS if(worker.thr_mgr ()->wait () != 0) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("Server (%P|%t) wait() Cannot wait for all %d threads\n"), nthreads), -1); //FUZZ: enable check_for_lack_ACE_OS #else if (nthreads > 1) ACE_ERROR ((LM_WARNING, ACE_TEXT ("Server (%P|%t) Cannot use threads other than ") ACE_TEXT ("the only one available.\n"))); worker.svc (); #endif if (TAO_debug_level >= 1) ACE_DEBUG ((LM_INFO, ACE_TEXT ("Server (%P|%t) Event loop finished.\n"))); if (!cri->self_test ()) ACE_ERROR ((LM_ERROR, ACE_TEXT ("Server (%P|%t) ERROR: Interceptor self_test failed\n"))); root_poa->destroy (1, 1); server->shutdown (); ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Server (%P|%t) Invoking orb->destroy ()\n"))); orb->destroy (); } catch (const CORBA::Exception& ex) { ex._tao_print_exception (ACE_TEXT ("Server (%P|%t) ERROR: ")); return -1; } ACE_DEBUG ((LM_INFO, ACE_TEXT ("Server (%P|%t) Completed successfuly.\n"))); return 0; #else /* TAO_HAS_TRANSPORT_CURRENT == 1 */ ACE_DEBUG ((LM_INFO, ACE_TEXT ("Server (%P|%t) Need TAO_HAS_TRANSPORT_CURRENT enabled to run.\n"))); return 0; #endif /* TAO_HAS_TRANSPORT_CURRENT == 1 */ }