int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) { ACE_Service_Config::open (argc, argv); ACE_Service_Repository_Iterator sri (*ACE_Service_Repository::instance ()); // Iteratively execute each service loaded in from the svc.conf // file. for (const ACE_Service_Type *sr; sri.next (sr) != 0; ) { // This would greatly benefit from RTTI typesafe downcasting... const ACE_Service_Type_Impl *type = sr->type (); const void *obj = type->object (); ACE_Service_Object *so = (ACE_Service_Object *) obj; Benchmark_Base *bb = (Benchmark_Base *) so; if (bb->benchmark_type () == Benchmark_Base::METHOD) { Benchmark_Method_Base *bm = (Benchmark_Method_Base *) bb; ACE_DEBUG ((LM_DEBUG, "\n\nExecuting %s\n", sr->name ())); bm->exec (&sri); } else sri.advance (); } return 0; }
int Service_Reporter::handle_input (ACE_HANDLE) { ACE_SOCK_Stream peer_stream; acceptor_.accept (peer_stream); ACE_Service_Repository_Iterator iterator (*ACE_Service_Repository::instance (), 0); for (const ACE_Service_Type *st; iterator.next (st) != 0; iterator.advance ()) { iovec iov[3]; iov[0].iov_base = ACE_const_cast (char *, st->name ()); iov[0].iov_len = ACE_OS::strlen (st->name ()) * sizeof (ACE_TCHAR); const ACE_TCHAR *state = st->active () ? ACE_TEXT (" (active) ") : ACE_TEXT (" (paused) "); iov[1].iov_base = ACE_const_cast (char *, state); iov[1].iov_len = ACE_OS::strlen (state) * sizeof (ACE_TCHAR); ACE_TCHAR *report = 0; // Ask info() to allocate buffer int len = st->type ()->info (&report, 0); iov[2].iov_base = ACE_static_cast (char *, report); iov[2].iov_len = ACE_static_cast (size_t, len); iov[2].iov_len *= sizeof (ACE_TCHAR); peer_stream.sendv_n (iov, 3); ACE::strdelete (report); } peer_stream.close (); return 0; }
int ACE_Service_Manager::list_services (void) { ACE_TRACE ("ACE_Service_Manager::list_services"); ACE_Service_Repository_Iterator sri (*ACE_Service_Repository::instance (), 0); for (const ACE_Service_Type *sr; sri.next (sr) != 0; sri.advance ()) { ssize_t len = static_cast<ssize_t> (ACE_OS::strlen (sr->name ())) + 11; ACE_TCHAR buf[BUFSIZ]; ACE_TCHAR *p = buf + len; ACE_OS::strcpy (buf, sr->name ()); ACE_OS::strcat (buf, (sr->active ()) ? ACE_TEXT (" (active) ") : ACE_TEXT (" (paused) ")); p[-1] = ' '; p[0] = '\0'; len += sr->type ()->info (&p, sizeof buf - len); if (this->debug_) { ACELIB_DEBUG ((LM_DEBUG, ACE_TEXT ("len = %d, info = %s%s"), len, buf, buf[len - 1] == '\n' ? ACE_TEXT ("") : ACE_TEXT ("\n"))); } if (len > 0) { ssize_t n = this->client_stream_.send_n (buf, len); if (n <= 0 && errno != EPIPE) { ACELIB_ERROR ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("send_n"))); } } } return 0; }
// @brief The size of a repository is unlimited and can be exceeded void testLimits (int , ACE_TCHAR *[]) { static const ACE_TCHAR *svc_desc1 = #if (ACE_USES_CLASSIC_SVC_CONF == 1) ACE_TEXT ("dynamic Test_Object_1_More Service_Object * ") ACE_TEXT (" Service_Config_DLL:_make_Service_Config_DLL() \"Test_Object_1_More\"") #else ACE_TEXT ("<dynamic id=\"Test_Object_1_More\" type=\"Service_Object\">") ACE_TEXT (" <initializer init=\"_make_Service_Config_DLL\" path=\"Service_Config_DLL\" params=\"Test_Object_1_More\"/>") ACE_TEXT ("</dynamic>") #endif /* (ACE_USES_CLASSIC_SVC_CONF == 1) */ ; static const ACE_TCHAR *svc_desc2 = #if (ACE_USES_CLASSIC_SVC_CONF == 1) ACE_TEXT ("dynamic Test_Object_2_More Service_Object * ") ACE_TEXT (" Service_Config_DLL:_make_Service_Config_DLL() \"Test_Object_2_More\"") #else ACE_TEXT ("<dynamic id=\"Test_Object_2_More\" type=\"Service_Object\">") ACE_TEXT (" <initializer init=\"_make_Service_Config_DLL\" path=\"Service_Config_DLL\" params=\"Test_Object_2_More\"/>") ACE_TEXT ("</dynamic>") #endif /* (ACE_USES_CLASSIC_SVC_CONF == 1) */ ; u_int error0 = error; // Ensure enough room for one in a own, the repository can extend ACE_Service_Gestalt one (1, true); // Add two. // We cant simply rely on the fact that insertion fails, because it // is typical to have no easy way of getting detailed error // information from a parser. one.process_directive (svc_desc1); one.process_directive (svc_desc2); if (-1 == one.find (ACE_TEXT ("Test_Object_1_More"), 0, 0)) { ++error; ACE_ERROR ((LM_ERROR, ACE_TEXT("Expected to have registered the first service\n"))); } if (-1 == one.find (ACE_TEXT ("Test_Object_2_More"), 0, 0)) { ++error; ACE_ERROR ((LM_ERROR, ACE_TEXT("Expected to have registered the second service\n"))); } ACE_Service_Repository_Iterator sri (*one.current_service_repository (), 0); size_t index = 0; for (const ACE_Service_Type *sr; sri.next (sr) != 0; sri.advance ()) { if (index == 0 && ACE_OS::strcmp (sr->name(), ACE_TEXT ("Test_Object_1_More")) != 0) { ++error; ACE_ERROR ((LM_ERROR, ACE_TEXT("Service 1 is wrong\n"))); } if (index == 1 && ACE_OS::strcmp (sr->name(), ACE_TEXT ("Test_Object_2_More")) != 0) { ++error; ACE_ERROR ((LM_ERROR, ACE_TEXT("Service 2 is wrong\n"))); } ++index; } // Test close one.current_service_repository ()->close(); if (one.current_service_repository ()->current_size () != 0) { ++error; ACE_ERROR ((LM_ERROR, ACE_TEXT("Size of repository should be 0\n"))); } if (error == error0) ACE_DEBUG ((LM_DEBUG, ACE_TEXT("Limits test completed successfully\n"))); else ACE_DEBUG ((LM_DEBUG, ACE_TEXT("Limits test failed\n"))); }