int main(int argc, char** argv) { using namespace Sirikata; DynamicLibrary::Initialize(); InitOptions(); Trace::Trace::InitOptions(); OHTrace::InitOptions(); InitSimOHOptions(); ParseOptions(argc, argv); PluginManager plugins; plugins.loadList( GetOptionValue<String>(OPT_PLUGINS) ); plugins.loadList( GetOptionValue<String>(OPT_OH_PLUGINS) ); // Fill defaults after plugin loading to ensure plugin-added // options get their defaults. FillMissingOptionDefaults(); // Rerun original parse to make sure any newly added options are // properly parsed. ParseOptions(argc, argv); ReportVersion(); // After options so log goes to the right place std::string time_server=GetOptionValue<String>("time-server"); NTPTimeSync sync; if (time_server.size() > 0) sync.start(time_server); ObjectHostID oh_id = GetOptionValue<ObjectHostID>("ohid"); String trace_file = GetPerServerFile(STATS_OH_TRACE_FILE, oh_id); Trace::Trace* gTrace = new Trace::Trace(trace_file); MaxDistUpdatePredicate::maxDist = GetOptionValue<float64>(MAX_EXTRAPOLATOR_DIST); BoundingBox3f region = GetOptionValue<BoundingBox3f>("region"); Vector3ui32 layout = GetOptionValue<Vector3ui32>("layout"); Duration duration = GetOptionValue<Duration>("duration"); // Get the starting time String start_time_str = GetOptionValue<String>("wait-until"); Time start_time = start_time_str.empty() ? Timer::now() : Timer::getSpecifiedDate( start_time_str ); start_time += GetOptionValue<Duration>("wait-additional"); srand( GetOptionValue<uint32>("rand-seed") ); Network::IOService* ios = Network::IOServiceFactory::makeIOService(); Network::IOStrand* mainStrand = ios->createStrand(); ODPSST::ConnectionManager* sstConnMgr = new ODPSST::ConnectionManager(); OHDPSST::ConnectionManager* ohSSTConnMgr = new OHDPSST::ConnectionManager(); ObjectHostContext* ctx = new ObjectHostContext("simoh", oh_id, sstConnMgr, ohSSTConnMgr, ios, mainStrand, gTrace, start_time, duration); String servermap_type = GetOptionValue<String>("servermap"); String servermap_options = GetOptionValue<String>("servermap-options"); ServerIDMap * server_id_map = ServerIDMapFactory::getSingleton().getConstructor(servermap_type)(ctx, servermap_options); String timeseries_type = GetOptionValue<String>(OPT_TRACE_TIMESERIES); String timeseries_options = GetOptionValue<String>(OPT_TRACE_TIMESERIES_OPTIONS); Trace::TimeSeries* time_series = Trace::TimeSeriesFactory::getSingleton().getConstructor(timeseries_type)(ctx, timeseries_options); ObjectFactory* obj_factory = new ObjectFactory(ctx, region, duration); ObjectHost* obj_host = new ObjectHost(ctx, gTrace, server_id_map); Scenario* scenario = ScenarioFactory::getSingleton().getConstructor(GetOptionValue<String>("scenario"))(GetOptionValue<String>("scenario-options")); // If we're one of the initial nodes, we'll have to wait until we hit the start time { Time now_time = Timer::now(); if (start_time > now_time) { Duration sleep_time = start_time - now_time; printf("Waiting %f seconds\n", sleep_time.toSeconds() ); fflush(stdout); #if SIRIKATA_PLATFORM == SIRIKATA_WINDOWS Sleep( sleep_time.toMilliseconds() ); #else usleep( sleep_time.toMicroseconds() ); #endif } } ///////////Go go go!! start of simulation///////////////////// ctx->add(ctx); ctx->add(obj_factory); scenario->initialize(ctx); ctx->add(scenario); ctx->add(sstConnMgr); ctx->add(ohSSTConnMgr); ctx->run(2); ctx->cleanup(); if (GetOptionValue<bool>(PROFILE)) { ctx->profiler->report(); } gTrace->prepareShutdown(); delete server_id_map; delete obj_factory; delete scenario; delete obj_host; delete ctx; delete sstConnMgr; delete ohSSTConnMgr; delete time_series; gTrace->shutdown(); delete gTrace; gTrace = NULL; delete mainStrand; Network::IOServiceFactory::destroyIOService(ios); sync.stop(); Sirikata::Logging::finishLog(); return 0; }