📄 imr_locator_i.cpp
字号:
ImplementationRepository::NotFound,
ImplementationRepository::CannotActivate))
{
if (OPTIONS::instance()->debug() >= 1)
{
ACE_DEBUG ((LM_DEBUG, "ImR Locator: Activating server"
" %s in activator %s.\n", server, activator));
}
ImplementationRepository::Administration_var admin =
this->choose_activator (activator ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
admin->activate_server (server ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
// Adds the server to the repository and registers the startup information
// about the server <server>.
void
ImR_Locator_i::register_server (const char *server,
const ImplementationRepository::StartupOptions &options
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
ImplementationRepository::AlreadyRegistered,
ImplementationRepository::NotFound))
{
ACE_CString activator;
if (this->server_map_.find(server, activator) == 0)
{
ACE_THROW(ImplementationRepository::AlreadyRegistered());
return;
}
ImplementationRepository::Administration_var admin =
this->choose_activator (options.activator.in() ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
admin->register_server (server, options ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
if (OPTIONS::instance()->debug() >= 1)
{
ACE_DEBUG ((LM_DEBUG, "ImR Locator: Registered server %s "
"in activator %s.\n", server, options.activator.in()));
}
int bind_return = this->server_map_.bind (server, options.activator.in());
ACE_UNUSED_ARG (bind_return);
ACE_ASSERT(bind_return == 0);
}
// Updates the startup information about the server <server>.
// Can not currently be used to move a server from one activator to another,
// this simply updates the registered info.
void
ImR_Locator_i::reregister_server (
const char *server,
const ImplementationRepository::StartupOptions &options
ACE_ENV_ARG_DECL )
ACE_THROW_SPEC ((CORBA::SystemException,ImplementationRepository::NotFound))
{
ACE_CString activator;
if (this->server_map_.find(server, activator) != 0)
{
ACE_THROW(ImplementationRepository::NotFound());
}
if (activator.compare(options.activator.in()) != 0)
{
ACE_THROW(ImplementationRepository::NotFound());
}
ImplementationRepository::Administration_var admin =
this->choose_activator (activator.c_str() ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
if (OPTIONS::instance()->debug() >= 1)
{
ACE_DEBUG ((LM_DEBUG, "ImR Locator: Reregister server %s "
"in activator %s.\n", server, activator.c_str()));
}
admin->reregister_server (server, options ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
// Removes the server <server> from the repository.
void
ImR_Locator_i::remove_server (const char *server ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException, ImplementationRepository::NotFound))
{
if (OPTIONS::instance()->debug() >= 1)
{
ACE_DEBUG ((LM_DEBUG, "ImR Locator: Remove server %s.\n", server));
}
ACE_CString activator;
if (this->server_map_.find(server, activator) == 0)
{
this->remove_server_in_activator(server, activator.c_str());
}
else
{
ACE_ERROR ((LM_ERROR, "ImR Locator: Couldn't find an activator for server:%s\n", server));
ACE_THROW(ImplementationRepository::NotFound());
}
}
// Removes the server <server> from the repository.
void
ImR_Locator_i::remove_server_in_activator (const char *server,
const char *activator
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
ImplementationRepository::NotFound
))
{
if (OPTIONS::instance()->debug() >= 1)
{
ACE_DEBUG ((LM_DEBUG, "ImR Locator: Remove server %s "
"from activator %s.\n", server, activator));
}
ACE_CString registered_activator;
if (this->server_map_.find(server, registered_activator) != 0)
{
ACE_THROW(ImplementationRepository::NotFound()); // todo : Add to signature in pidl and others
}
if (registered_activator.compare(activator) != 0)
{
ACE_ASSERT(false);
}
ImplementationRepository::Administration_var admin =
this->choose_activator (activator ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
admin->remove_server (server ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
int err = this->server_map_.unbind(server);
ACE_UNUSED_ARG (err);
ACE_ASSERT(err == 0);
}
// Attempts to gracefully shut down the server, at all activators that
// it is running.
void
ImR_Locator_i::shutdown_server (const char *server ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException, ImplementationRepository::NotFound))
{
if (OPTIONS::instance()->debug() >= 1)
{
ACE_DEBUG ((LM_DEBUG, "ImR Locator: Shutdown server %s.\n", server));
}
ACE_CString activator;
if (this->server_map_.find(server, activator) == 0)
{
this->shutdown_server_in_activator(server, activator.c_str());
}
else
{
ACE_ERROR ((LM_ERROR, "ImR Locator: Couldn't find an activator for server:%s\n", server));
ACE_THROW(ImplementationRepository::NotFound());
}
}
// Attempts to gracefully shut down the server,
void
ImR_Locator_i::shutdown_server_in_activator (
const char *server,
const char *activator
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException, ImplementationRepository::NotFound))
{
ImplementationRepository::Administration_var admin =
this->choose_activator (activator ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
if (OPTIONS::instance()->debug() >= 1)
{
ACE_DEBUG ((LM_DEBUG, "ImR Locator: Shutdown server %s "
"in activator %s.\n", server, activator));
}
admin->shutdown_server (server ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
void
ImR_Locator_i::server_is_running (const char *,
const char *,
ImplementationRepository::ServerObject_ptr
ACE_ENV_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException,
ImplementationRepository::NotFound))
{
ACE_ERROR((LM_ERROR, "ImR_Locator_i::server_is_running() "
"This operation is only for the ImR_Activator.\n"));
ACE_ASSERT(false);
}
void
ImR_Locator_i::server_is_running_in_activator (const char* server,
const char* activator,
const char* partial_ior,
ImplementationRepository::ServerObject_ptr server_object
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException, ImplementationRepository::NotFound))
{
// todo : At this point we could automatically register the server, so that
// manually started servers don't require tao_imr add first.
ImplementationRepository::Administration_var admin =
this->choose_activator (activator ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
if (OPTIONS::instance()->debug() >= 1)
{
ACE_DEBUG ((LM_DEBUG, "ImR Locator: Server %s "
"running in activator %s.\n", server, activator));
}
admin->server_is_running (server, partial_ior, server_object ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
void
ImR_Locator_i::server_is_shutting_down (const char* ACE_ENV_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException, ImplementationRepository::NotFound))
{
ACE_ERROR((LM_ERROR, "ImR_Locator_i::server_is_shutting_down()"
" This operation is only for the ImR_Activator.\n"));
ACE_ASSERT(false);
}
// What the server should call before it shuts down.
void
ImR_Locator_i::server_is_shutting_down_in_activator (
const char *server,
const char *activator
ACE_ENV_ARG_DECL
) ACE_THROW_SPEC ((CORBA::SystemException, ImplementationRepository::NotFound))
{
ImplementationRepository::Administration_var admin =
this->choose_activator (activator ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
if (OPTIONS::instance()->debug() >= 1)
{
ACE_DEBUG ((LM_DEBUG, "ImR Locator: Server %s "
"shutting down in activator %s.\n", server, activator));
}
admin->server_is_shutting_down (server ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
// Find
void
ImR_Locator_i::find (
const char * server,
ImplementationRepository::ServerInformation_out info
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException, ImplementationRepository::NotFound))
{
ACE_CString activator;
if (this->server_map_.find(server, activator) == 0)
{
this->find_in_activator(server, activator.c_str(), info);
}
else
{
ACE_ERROR ((LM_ERROR, "ImR Locator: Couldn't find an activator for server:%s\n", server));
ACE_THROW(ImplementationRepository::NotFound());
}
}
void
ImR_Locator_i::find_in_activator (
const char* server,
const char* activator,
ImplementationRepository::ServerInformation_out info
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException, ImplementationRepository::NotFound))
{
ImplementationRepository::Administration_var admin =
this->choose_activator (activator ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
if (OPTIONS::instance()->debug() >= 1)
{
ACE_DEBUG ((LM_DEBUG, "ImR Locator: Find server %s "
"in activator %s.\n", server, activator));
}
admin->find(server, info ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
// Used to access the list of servers registered. May also return an
// iterator which can be used to access more than <how_many> of them.
void
ImR_Locator_i::list (CORBA::ULong how_many,
ImplementationRepository::ServerInformationList_out server_list,
ImplementationRepository::ServerInformationIterator_out server_iterator
ACE_ENV_ARG_DECL
) ACE_THROW_SPEC ((CORBA::SystemException))
{
if (OPTIONS::instance()->debug() >= 1)
{
ACE_DEBUG ((LM_DEBUG, "ImR Locator: List servers.\n"));
}
ActivatorMap::ENTRY *next_entry = 0;
int cnt = 0;
for (ActivatorMap::ITERATOR iterator (this->activator_map_);
iterator.next (next_entry) != 0;
iterator.advance ())
{
ImplementationRepository::Administration_ptr admin = next_entry->int_id_.admin.in();
++cnt;
// todo : Check to make sure activator implementation supports repeat calls correctly.
admin->list (how_many,
server_list,
server_iterator
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
if (cnt <= 0)
{
// Temporary fix for the seg fault that occurs when the skel tries to
// handle the unitialised sequence when this method is called and
// no activator has been registered yet.
// @todo A full rework of this method is needed - see bug #1543.
server_iterator =
ImplementationRepository::ServerInformationIterator::_nil ();
ACE_NEW_THROW_EX (server_list,
ImplementationRepository::ServerInformationList (0),
CORBA::NO_MEMORY ());
}
}
ImplementationRepository::Administration_ptr
ImR_Locator_i::choose_activator (const char *activator ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((ImplementationRepository::NotFound, CORBA::SystemException))
{
ActivatorInfo info;
if (this->activator_map_.find (activator, info) != 0)
{
ACE_THROW_RETURN (ImplementationRepository::NotFound (), 0);
}
return info.admin._retn();
}
char *
ImR_Locator_i::find_ior (const char *object_name ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException, ImplementationRepository::NotFound))
{
if (OPTIONS::instance()->debug() >= 1)
{
ACE_DEBUG ((LM_DEBUG, "ImR Locator: Find ior %s.\n", object_name));
}
ActivatorMap::ENTRY *next_entry = 0;
for (ActivatorMap::ITERATOR iterator (this->activator_map_);
iterator.next (next_entry) != 0;
iterator.advance ())
{
ImplementationRepository::Administration_ptr admin = next_entry->int_id_.admin.in();
ACE_TRY
{
char* ior = admin->find_ior (object_name ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
return ior;
}
ACE_CATCH (ImplementationRepository::NotFound, ex)
{
ACE_UNUSED_ARG(ex);
}
ACE_ENDTRY;
}
ACE_ERROR ((LM_ERROR, "ImR Locator: Couldn't find an activator for object:%s\n", object_name));
ACE_THROW_RETURN (ImplementationRepository::NotFound (), 0);
return 0;
}
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
template class ACE_Hash_Map_Manager<ACE_CString, ActivatorInfo, ACE_Null_Mutex>;
template class ACE_Hash_Map_Manager_Ex<ACE_CString, ActivatorInfo, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
template class ACE_Hash_Map_Iterator<ACE_CString, ActivatorInfo, ACE_Null_Mutex>;
template class ACE_Hash_Map_Iterator_Ex<ACE_CString, ActivatorInfo, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
template class ACE_Hash_Map_Entry<ACE_CString, ActivatorInfo>;
template class ACE_Hash_Map_Reverse_Iterator<ACE_CString, ActivatorInfo, ACE_Null_Mutex>;
template class ACE_Hash_Map_Reverse_Iterator_Ex<ACE_CString, ActivatorInfo, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
template class ACE_Hash_Map_Iterator_Base_Ex<ACE_CString, ActivatorInfo, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
template class ACE_Hash_Map_Manager<ACE_CString, ACE_CString, ACE_Null_Mutex>;
template class ACE_Hash_Map_Manager_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
template class ACE_Hash_Map_Iterator<ACE_CString, ACE_CString, ACE_Null_Mutex>;
template class ACE_Hash_Map_Iterator_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
template class ACE_Hash_Map_Entry<ACE_CString, ACE_CString>;
template class ACE_Hash_Map_Reverse_Iterator<ACE_CString, ACE_CString, ACE_Null_Mutex>;
template class ACE_Hash_Map_Reverse_Iterator_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
template class ACE_Hash_Map_Iterator_Base_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
#pragma instantiate ACE_Hash_Map_Manager<ACE_CString,ActivatorInfo,ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Manager_Ex<ACE_CString, ActivatorInfo, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Iterator<ACE_CString,ActivatorInfo,ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Iterator_Ex<ACE_CString, ActivatorInfo, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Entry<ACE_CString, ActivatorInfo>
#pragma instantiate ACE_Hash_Map_Reverse_Iterator<ACE_CString, ActivatorInfo, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex<ACE_CString, ActivatorInfo, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<ACE_CString, ActivatorInfo, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Manager<ACE_CString,ACE_CString,ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Manager_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Iterator<ACE_CString,ACE_CString,ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Iterator_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Entry<ACE_CString, ACE_CString>
#pragma instantiate ACE_Hash_Map_Reverse_Iterator<ACE_CString, ACE_CString, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -