00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include <rtt/rtt-config.h>
00030 #ifdef OS_RT_MALLOC
00031
00032 #define ORO_MEMORY_POOL
00033 #include <rtt/os/tlsf/tlsf.h>
00034 #endif
00035
00036 #include <rtt/os/main.h>
00037 #include <rtt/RTT.hpp>
00038
00039 #include <deployment/CorbaDeploymentComponent.hpp>
00040 #include <rtt/transports/corba/TaskContextServer.hpp>
00041 #include <iostream>
00042 #include "deployer-funcs.hpp"
00043
00044 #ifdef ORO_BUILD_LOGGING
00045 # ifndef OS_RT_MALLOC
00046 # warning Logging needs rtalloc!
00047 # endif
00048 #include <log4cpp/HierarchyMaintainer.hh>
00049 #include "logging/Category.hpp"
00050 #endif
00051
00052 using namespace std;
00053 using namespace RTT::corba;
00054 using namespace RTT;
00055 using namespace OCL;
00056 namespace po = boost::program_options;
00057
00058 int main(int argc, char** argv)
00059 {
00060 std::string siteFile;
00061 std::vector<std::string> scriptFiles;
00062 std::string name("Deployer");
00063 bool requireNameService = false;
00064 po::variables_map vm;
00065 po::options_description taoOptions("Additional options after a '--' are passed through to TAO");
00066
00067
00068 po::options_description otherOptions;
00069
00070 #ifdef ORO_BUILD_RTALLOC
00071 OCL::memorySize rtallocMemorySize = ORO_DEFAULT_RTALLOC_SIZE;
00072 po::options_description rtallocOptions = OCL::deployerRtallocOptions(rtallocMemorySize);
00073 otherOptions.add(rtallocOptions);
00074 #endif
00075
00076 #if defined(ORO_BUILD_LOGGING) && defined(OROSEM_LOG4CPP_LOGGING)
00077
00078 std::string rttLog4cppConfigFile;
00079 po::options_description rttLog4cppOptions = OCL::deployerRttLog4cppOptions(rttLog4cppConfigFile);
00080 otherOptions.add(rttLog4cppOptions);
00081 #endif
00082
00083
00084 otherOptions.add(taoOptions);
00085
00086
00087 int taoIndex = 0;
00088 bool found = false;
00089
00090 while(!found && taoIndex<argc)
00091 {
00092 found = (0 == strcmp("--", argv[taoIndex]));
00093 if(!found) taoIndex++;
00094 }
00095
00096 if (found) {
00097 argv[taoIndex] = argv[0];
00098 }
00099
00100
00101
00102 int rc = OCL::deployerParseCmdLine(!found ? argc : taoIndex, argv,
00103 siteFile, scriptFiles, name, requireNameService,
00104 vm, &otherOptions);
00105 if (0 != rc)
00106 {
00107 return rc;
00108 }
00109
00110 #if defined(ORO_BUILD_LOGGING) && defined(OROSEM_LOG4CPP_LOGGING)
00111 if (!OCL::deployerConfigureRttLog4cppCategory(rttLog4cppConfigFile))
00112 {
00113 return -1;
00114 }
00115 #endif
00116
00117 #ifdef ORO_BUILD_RTALLOC
00118 size_t memSize = rtallocMemorySize.size;
00119 void* rtMem = 0;
00120 if (0 < memSize)
00121 {
00122
00123 rtMem = malloc(memSize);
00124 assert(rtMem);
00125 size_t freeMem = init_memory_pool(memSize, rtMem);
00126 if ((size_t)-1 == freeMem)
00127 {
00128 log(Critical) << "Invalid memory pool size of " << memSize
00129 << " bytes (TLSF has a several kilobyte overhead)." << endlog();
00130 free(rtMem);
00131 return -1;
00132 }
00133 log(Info) << "Real-time memory: " << freeMem << " bytes free of "
00134 << memSize << " allocated." << endlog();
00135 }
00136 #endif // ORO_BUILD_RTALLOC
00137
00138 #ifdef ORO_BUILD_LOGGING
00139 log(Info) << "Setting OCL factory for real-time logging" << endlog();
00140 log4cpp::HierarchyMaintainer::set_category_factory(
00141 OCL::logging::Category::createOCLCategory);
00142 #endif
00143
00144
00145 if (0 == __os_init(argc - taoIndex, &argv[taoIndex]))
00146 {
00147
00148 {
00149 OCL::CorbaDeploymentComponent dc( name, siteFile );
00150
00151
00152
00153
00154 TaskContextServer::InitOrb( argc - taoIndex, &argv[taoIndex] );
00155
00156 if (0 == TaskContextServer::Create( &dc, true, requireNameService ))
00157 {
00158 return -1;
00159 }
00160
00161 for (std::vector<std::string>::const_iterator iter=scriptFiles.begin();
00162 iter!=scriptFiles.end();
00163 ++iter)
00164 {
00165 if ( !(*iter).empty() )
00166 {
00167 if ( (*iter).rfind(".xml",string::npos) == (*iter).length() - 4 || (*iter).rfind(".cpf",string::npos) == (*iter).length() - 4) {
00168 dc.kickStart( (*iter) );
00169 continue;
00170 } if ( (*iter).rfind(".ops",string::npos) == (*iter).length() - 4 || (*iter).rfind(".osd",string::npos) == (*iter).length() - 4) {
00171 dc.runScript( (*iter) );
00172 continue;
00173 }
00174 log(Error) << "Unknown extension of file: '"<< (*iter) <<"'. Must be xml, cpf for XML files or, ops or osd for script files."<<endlog();
00175 }
00176 }
00177
00178
00179 TaskContextServer::RunOrb();
00180
00181 TaskContextServer::ShutdownOrb();
00182
00183 TaskContextServer::DestroyOrb();
00184 }
00185
00186 __os_exit();
00187 }
00188 else
00189 {
00190 std::cerr << "Unable to start Orocos" << std::endl;
00191 return -1;
00192 }
00193 #ifdef ORO_BUILD_LOGGING
00194 log4cpp::HierarchyMaintainer::getDefaultMaintainer().shutdown();
00195 log4cpp::HierarchyMaintainer::getDefaultMaintainer().deleteAllCategories();
00196 #endif
00197
00198 #ifdef ORO_BUILD_RTALLOC
00199 if (!rtMem)
00200 {
00201 destroy_memory_pool(rtMem);
00202 free(rtMem);
00203 }
00204 #endif // ORO_BUILD_RTALLOC
00205
00206 return 0;
00207 }