Ejemplo n.º 1
0
static bool start_master()
{
  bool is_child;
  //master inherits fds!
  ltr_int_log_message("Start master\n");
  int socket = ltr_int_connect_to_socket(ltr_int_master_socket_name());

  ltr_int_log_message("socket %d\n", socket);
  if(socket < 0){
    //no master there yet, so lets start one
    ltr_int_log_message("Master is not running, start it\n");

    if(!getenv("LTR_KEEP_LD_LIBRARY_PATH")){
      ltr_int_log_message("Reseting LD_LIBRARY_PATH.\n");
      unsetenv("LD_LIBRARY_PATH");
    }else{
      ltr_int_log_message("LTR_KEEP_LD_LIBRARY_PATH set, keeping LD_LIBRARY_PATH set.\n");
    }

    char *args[] = {"srv", NULL};
    args[0] = ltr_int_get_app_path("/ltr_server1");
    ltr_int_fork_child(args, &is_child);
    int status;
    //Disable the wait when not daemonizing master!!!
    wait(&status);
    //At this point master is either running or exited (depending on the state of socket)
    free(args[0]);
  }
  close(socket);
  //At this point either master runs already, or we just started one
  return true;
}
Ejemplo n.º 2
0
static bool open_master_comms(int *l_master_uplink)
{
  ltr_int_log_message("Opening master comms!\n");
  //printf("open_master_comms\n");
  *l_master_uplink = ltr_int_connect_to_socket(ltr_int_master_socket_name());
  //printf("====================");
  if(*l_master_uplink <= 0){
    ltr_int_log_message("Couldn't connect to master's socket!\n");
    return false;
  }

  ltr_int_log_message("Master comms opened => u -> %d\n", *l_master_uplink);

  if(ltr_int_send_message_w_str(*l_master_uplink, CMD_NEW_SOCKET, 0, profile_name) != 0){
    ltr_int_log_message("Master uplink doesn't seem to be working!\n");
    return false;
  }
  ltr_int_log_message("Notification of the '%s' client sent to master!\n", profile_name);

  return true;
}
Ejemplo n.º 3
0
bool ltr_int_master(bool standalone)
{
    current_pose.pose.pitch = 0.0;
    current_pose.pose.yaw = 0.0;
    current_pose.pose.roll = 0.0;
    current_pose.pose.tx = 0.0;
    current_pose.pose.ty = 0.0;
    current_pose.pose.tz = 0.0;
    current_pose.pose.counter = 0;
    current_pose.pose.status = STOPPED;
    current_pose.blobs = 0;
    gui_shutdown_request = false;
    int socket;

    save_prefs = standalone;
    if(standalone) {
        //Detach from the caller, retaining stdin/out/err
        // Does weird things to gui ;)
        if(daemon(0, 1) != 0) {
            return false;
        }
        if(!ltr_int_gui_lock(false)) {
            ltr_int_log_message("Gui is active, quitting!\n");
            return true;
        }
        socket = ltr_int_create_server_socket(ltr_int_master_socket_name());
    } else {
        if(!ltr_int_gui_lock(true)) {
            ltr_int_log_message("Couldn't lock gui lockfile!\n");
            return false;
        }
        int counter = 10;
        while((socket = ltr_int_create_server_socket(ltr_int_master_socket_name())) <= 0) {
            if((counter--) <= 0) {
                ltr_int_log_message("The other master doesn't give up!\n");
                return false;
            }
            sleep(1);
        }
        ltr_int_log_message("Other master gave up, gui master taking over!\n");
    }

    if(socket < 0) {
        ltr_int_log_message("Master already running, quitting!\n");
        return true;
    }
    ltr_int_log_message("Starting as master!\n");
    if(ltr_int_init() != 0) {
        ltr_int_log_message("Could not initialize tracking!\n");
        ltr_int_log_message("Closing socket %d\n", socket);
        close(socket);
        unlink(ltr_int_master_socket_name());
        return false;
    }

    ltr_int_register_cbk(ltr_int_new_frame, NULL, ltr_int_state_changed, NULL);

    ltr_int_master_main_loop(socket);

    ltr_int_log_message("Shutting down tracking!\n");
    ltr_int_shutdown();
    ltr_int_log_message("Master closing socket %d\n", socket);
    close(socket);
    unlink(ltr_int_master_socket_name());
    ltr_int_gui_lock_clean();
    int cntr = 10;
    while((ltr_int_get_tracking_state() != STOPPED) && (cntr > 0)) {
        --cntr;
        ltr_int_log_message("Tracker not stopped yet, waiting for the stop...\n");
        sleep(1);
    }
    ltr_int_gui_lock_clean();
    if(standalone) {
        ltr_int_free_prefs();
    }
    return true;
}