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; }
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; }
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; }