/*******************************************************************************
* E.S.O. - ACS project
*
* "@(#) $Id: maciContainer.cpp,v 1.5 2003/10/23 08:06:25 acaproni Exp $"
*
* who when what
* -------- -------- ----------------------------------------------
* david 2002-08-15 changed argUnpack.h to acsutilArgUnpack.h
* bgustafs 2002-04-15 corrected activator shutdown on VxWorks
* bgustafs 2001-07-12 added namespace declarations
* msekoran 2001/02/21 created
*/
/** @file maciContainer.cpp
* maciContainer is used to start an Container on the workstation or LCU. There are many different
* parameters which can be passed to maciContainer, but only the container we want to start is required.
* @htmlonly
*
* @endhtmlonly
* @param container This is simply the name of the container in the CDB that we want to start.
* @htmlonly
*
* @endhtmlonly
* @param "-r" Use this optional parameter to run container in recovery mode.
* @htmlonly
*
* @endhtmlonly
* @param "-p filename" Use this optional parameter to write out the process ID of this container to filename.
* @htmlonly
*
* @endhtmlonly
* @param "-m corbaloc::$HOSTNAME:xxxx/Manager" Use this optional parameter to run this container with a
* manager running on a port other than 3000 or for a manager on a different PC.
* @htmlonly
*
* @endhtmlonly
* @param "-ORBEndpoint iiop://$HOST:xxxx" Use this optional parameter to specify which host/port container
* should run on.
* @htmlonly
*
* @endhtmlonly
* @param "-ORBInitRef NameService=corbaloc::$HOST:xxxx/NameService" Use this optional parameter to specify which
* host/port container should get a reference to the naming service from.
* @htmlonly
*
* @endhtmlonly
* @param "-ORBInitRef NotifyEventChannelFactory=corbaloc::$HOST:xxxx/NotifyEventChannelFactory" Use this optional
* parameter to specify which host/port container should get a reference to the notification service from.
* @htmlonly
*
* @endhtmlonly
*/
#include
#include
#include
#include
#include "ECCS.h"
#include
#ifdef MAKE_VXWORKS
# include "rebootLib.h"
# include "acsutilArgUnpack.h"
int g_containerShutdownAction = 0;
#endif
NAMESPACE_USE(maci);
ACE_RCSID(maci, maciContainer, "$Id: maciContainer.cpp,v 1.5 2003/10/23 08:06:25 acaproni Exp $")
bool shutting_down = false;
void TerminationSignalHandler(int)
{
if (shutting_down) return;
shutting_down=true;
// initialize logger (TTS has to be initialized)
if (ContainerImpl::getLogger())
{
LoggingProxy::init(ContainerImpl::getLogger());
LoggingProxy::ThreadName("termination");
}
ACS_LOG(0, "termination", (LM_INFO, "Termination signal detected."));
MACIHelper::terminateResolving();
ACE_TRY
{
if (ContainerImpl::getContainer() &&
ContainerImpl::getContainer()->getContainerCORBAProxy() != maci::Container::_nil())
{
ContainerImpl::getContainer()->getContainerCORBAProxy()->shutdown(CONTAINER_EXIT << 8);
//ContainerImpl::getContainer()->shutdown(CONTAINER_EXIT << 8);
}
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION(ACE_ANY_EXCEPTION, "TerminationSignalHandler");
}
ACE_ENDTRY;
}
int main(int argc, char *argv[])
{
ACS_SHORT_LOG((LM_INFO, "Starting Container...\n"));
ACE_OS::signal(SIGINT, TerminationSignalHandler); // Ctrl+C
ACE_OS::signal(SIGTERM, TerminationSignalHandler); // termination request
ccsCOMPL_STAT stat;
stat = ccsInit("vltccs");
if(stat == FAILURE)
cout << "Failure with CCS Init !!!!!!" << endl;
stat = dbOpen();
if(stat == FAILURE)
cout << "Failure with DB OPEN" << endl;
ContainerImpl container;
// while (container.getShutdownAction() == CONTAINER_RELOAD)
if (container.init(argc, argv))
{
// reinitialization of signal handlers is needed, because of CCS
// the initialization above is needed to stop resolving, etc..
ACE_OS::signal(SIGINT, TerminationSignalHandler); // Ctrl+C
ACE_OS::signal(SIGTERM, TerminationSignalHandler); // termination request
if (container.connect())
container.run();
}
ACS_SHORT_LOG((LM_INFO, "Stopping container... "));
container.done();
ACS_SHORT_LOG((LM_INFO, "Container stopped.\n"));
// reboot/reload action !!!
if (ContainerImpl::getLogger())
{
ContainerImpl::getLogger()->flush();
ContainerImpl::getLogger()->done();
}
#ifdef MAKE_VXWORKS
g_containerShutdownAction = container.getShutdownAction();
#endif
stat = dbExit();
if(stat == FAILURE)
cout << "Failure with CCS Exit!!!!!!" << endl;
return container.getStatus();
}
#ifdef MAKE_VXWORKS
int ContainerStart(char *szCmdLn)
{
int argc;
char *argv[100];
ACE_MAIN_OBJECT_MANAGER
//ACE_OS::string_to_argv(szCmdLn, argc, argv);
argc = argUnpack(szCmdLn, argv);
argv[0] = "Container";
int retval = ace_main(argc, argv);
// 1 -- reboot the computer, 2 -- exit the container - both reboot
if(g_containerShutdownAction == CONTAINER_REBOOT)
reboot(0);
// @@ Deallocate argv as required (cf. ContainerImpl)
return retval;
}
void ContainerStop(int retval)
{
ContainerImpl * container = ContainerImpl::getContainer();
// ACE_TRY
// {
if(container != 0)
{
container->shutdown(retval);
//
}
// }
}
#endif // defined( MAKE_VXWORKS )