int main()

in bistro/server/main.cpp [56:137]


int main(int argc, char* argv[]) {
  FLAGS_logtostderr = 1;
  folly::init(&argc, &argv);

  registerDefaultSchedulerPolicies();

  boost::filesystem::path config_file(FLAGS_config_file);
  auto config_loader = make_shared<FileConfigLoader>(
    std::chrono::milliseconds(FLAGS_config_update_ms),
    boost::filesystem::absolute(config_file)
  );
  auto nodes_loader = make_shared<NodesLoader>(
    config_loader,
    std::chrono::milliseconds(FLAGS_nodes_update_ms),
    std::chrono::milliseconds(FLAGS_nodes_retry_ms)
  );

  shared_ptr<TaskStore> task_store;
  if (FLAGS_clean_statuses || FLAGS_dry_run || FLAGS_benchmark_run) {
    task_store.reset(new NoOpTaskStore());
  } else {
    CHECK(!FLAGS_status_table.empty()) << "You must pass --status_table";
    task_store.reset(new SQLiteTaskStore(FLAGS_data_dir, FLAGS_status_table));
  }

  auto task_statuses = make_shared<TaskStatuses>(task_store);

  auto monitor = make_shared<Monitor>(
    config_loader,
    nodes_loader,
    task_statuses
  );

  shared_ptr<TaskRunner> task_runner;
  if (FLAGS_dry_run) {
    task_runner.reset(new NoOpRunner());
  } else if (FLAGS_benchmark_run) {
    task_runner.reset(new BenchmarkRunner());
  } else if (!FLAGS_worker_command.empty()) {
    task_runner.reset(new LocalRunner(FLAGS_worker_command, FLAGS_data_dir));
  } else {
    task_runner.reset(new RemoteWorkerRunner(task_statuses, monitor));
  }

  // Initialize the scheduler thread itself
  Bistro bistro(
    config_loader,
    nodes_loader,
    task_statuses,
    task_runner,
    monitor
  );
  folly::ThreadedRepeatingFunctionRunner bistro_thread;
  bistro_thread.add(
    "BistroSchedule", bind(&Bistro::scheduleOnceSystemTime, &bistro)
  );
  SCOPE_EXIT { bistro_thread.stop(); };

  auto http_monitor = make_shared<HTTPMonitor>(
    config_loader,
    nodes_loader,
    task_statuses,
    task_runner,
    monitor
  );

  HTTPMonitorServer http_monitor_server(http_monitor);

  // Initialize the thrift monitor
  auto handler = std::make_unique<ThriftMonitor>(
    config_loader,
    nodes_loader,
    task_statuses,
    task_runner,
    monitor
  );

  auto server = make_shared<apache::thrift::ThriftServer>();
  server->setPort(FLAGS_server_port);
  server->setInterface(std::move(handler));
  server->serve();
}