Go to the documentation of this file.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 cerr << "Invalid memory pool size of " << memSize
00129 << " bytes (TLSF has a several kilobyte overhead)." << endl;
00130 free(rtMem);
00131 return -1;
00132 }
00133 cout << "Real-time memory: " << freeMem << " bytes free of "
00134 << memSize << " allocated." << endl;
00135 }
00136 #endif // ORO_BUILD_RTALLOC
00137
00138 #ifdef ORO_BUILD_LOGGING
00139 log4cpp::HierarchyMaintainer::set_category_factory(
00140 OCL::logging::Category::createOCLCategory);
00141 #endif
00142
00143
00144
00145
00146
00147
00148 if (0 == __os_init(argc - taoIndex, &argv[taoIndex]))
00149 {
00150 #ifdef ORO_BUILD_LOGGING
00151 log(Info) << "OCL factory set for real-time logging" << endlog();
00152 #endif
00153
00154 {
00155 OCL::CorbaDeploymentComponent dc( name, siteFile );
00156
00157
00158
00159
00160 TaskContextServer::InitOrb( argc - taoIndex, &argv[taoIndex] );
00161
00162 if (0 == TaskContextServer::Create( &dc, true, requireNameService ))
00163 {
00164 return -1;
00165 }
00166
00167 for (std::vector<std::string>::const_iterator iter=scriptFiles.begin();
00168 iter!=scriptFiles.end();
00169 ++iter)
00170 {
00171 if ( !(*iter).empty() )
00172 {
00173 if ( (*iter).rfind(".xml",string::npos) == (*iter).length() - 4 || (*iter).rfind(".cpf",string::npos) == (*iter).length() - 4) {
00174 dc.kickStart( (*iter) );
00175 continue;
00176 } if ( (*iter).rfind(".ops",string::npos) == (*iter).length() - 4 || (*iter).rfind(".osd",string::npos) == (*iter).length() - 4) {
00177 dc.runScript( (*iter) );
00178 continue;
00179 }
00180 log(Error) << "Unknown extension of file: '"<< (*iter) <<"'. Must be xml, cpf for XML files or, ops or osd for script files."<<endlog();
00181 }
00182 }
00183
00184
00185 TaskContextServer::RunOrb();
00186
00187 TaskContextServer::ShutdownOrb();
00188
00189 TaskContextServer::DestroyOrb();
00190 }
00191
00192 __os_exit();
00193 }
00194 else
00195 {
00196 std::cerr << "Unable to start Orocos" << std::endl;
00197 return -1;
00198 }
00199 #ifdef ORO_BUILD_LOGGING
00200 log4cpp::HierarchyMaintainer::getDefaultMaintainer().shutdown();
00201 log4cpp::HierarchyMaintainer::getDefaultMaintainer().deleteAllCategories();
00202 #endif
00203
00204 #ifdef ORO_BUILD_RTALLOC
00205 if (!rtMem)
00206 {
00207 destroy_memory_pool(rtMem);
00208 free(rtMem);
00209 }
00210 #endif // ORO_BUILD_RTALLOC
00211
00212 return 0;
00213 }