Esempio n. 1
0
void carmen_multicentral_reconnect_centrals(carmen_centrallist_p centrallist,
					    void (*register_func)(void),
					    void (*subscribe_func)(void))
{
  int i, err;

  /* try to reconnect to broken centrals */
  for(i = 0; i < centrallist->num_centrals; i++)
    if(!centrallist->central[i].connected && 
       centrallist->central[i].ready_for_reconnect) {
      fprintf(stderr, "MULTICENTRAL: central %s reconnected.\n", 
	      centrallist->central[i].host);
      err = carmen_multicentral_ipc_connect(module_name, 
					    centrallist->central[i].host);
      /* if successful, get IPC context */
      if(err >= 0) {
	centrallist->central[i].connected = 1;
	centrallist->central[i].ready_for_reconnect = 0;
	centrallist->central[i].context = IPC_getContext();

	x_ipcRegisterExitProc(carmen_multicentral_ipc_exit_handler);
	if(register_func != NULL)
	  register_func();
	if(subscribe_func != NULL)
	  subscribe_func();
      }
    }
}
Esempio n. 2
0
int main(int argc, char *argv[])
{
  num_contexts = argc-1;
  context = (IPC_CONTEXT_PTR *)calloc(num_contexts, sizeof(IPC_CONTEXT_PTR));
  /* check_alloc checked */

  IPC_setVerbosity(IPC_Print_Warnings);
  
  for (cur_context = 0; cur_context < num_contexts; cur_context++) {
    IPC_connectModule(argv[0], argv[cur_context+1]);
    context[cur_context] = IPC_getContext();
#if (defined(__x86_64__))
    IPC_subscribe(CARMEN_TEST_IPC_NAME, msgHandler, (void *)(long)cur_context);
#else
    IPC_subscribe(CARMEN_TEST_IPC_NAME, msgHandler, (void *)cur_context);
#endif
    IPC_setMsgQueueLength(CARMEN_TEST_IPC_NAME, 1);
  }

  x_ipcRegisterExitProc(handle_exit);

  while (1) {
    for (cur_context = 0; cur_context < num_contexts; cur_context++) {
      fprintf(stderr, "chunk %d\n", cur_context);
      if (context[cur_context] != NULL) {
	IPC_setContext(context[cur_context]);
	IPC_listenClear(0);
	sleep(1);
      }
    } 
  }
   
  return 0;
}
Esempio n. 3
0
void carmen_multicentral_ipc_exit_handler(void)
{
  IPC_CONTEXT_PTR current_context;
  int i;
  
  current_context = IPC_getContext();
  for(i = 0; i < centrallist_copy->num_centrals; i++)
    if(centrallist_copy->central[i].connected &&
       current_context == centrallist_copy->central[i].context) {
      fprintf(stderr, "MULTICENTRAL: central %s disconnected.\n", 
	      centrallist_copy->central[i].host);
      centrallist_copy->central[i].connected = 0;
      centrallist_copy->central[i].ready_for_reconnect = 0;
    }
  if(client_exit_handler != NULL)
    client_exit_handler();
}
Esempio n. 4
0
static int
get_context_id(void)
{
  int index = 0;
  IPC_CONTEXT_PTR current_context = IPC_getContext();

  if (context_array == NULL)
    return -1;

  while (context_array[index] != NULL) 
    {
      if (context_array[index] == current_context)
	return index;
      index++;
    }

  return -1;

}
Esempio n. 5
0
static int 
add_context(void)
{
  int index;
  
  if (context_array == NULL)
    {
      context_array = (IPC_CONTEXT_PTR *)calloc(10, sizeof(IPC_CONTEXT_PTR));
      carmen_test_alloc(context_array);

      frontlaser_msg = (carmen_robot_laser_message **)
	calloc(10, sizeof(carmen_robot_laser_message *));
      carmen_test_alloc(frontlaser_msg);

      rearlaser_msg = (carmen_robot_laser_message **)
	calloc(10, sizeof(carmen_robot_laser_message *));
      carmen_test_alloc(rearlaser_msg);

      sonar_msg = (carmen_robot_sonar_message **)
	calloc(10, sizeof(carmen_robot_sonar_message *));
      carmen_test_alloc(sonar_msg);

      vector_status_msg = (carmen_robot_vector_status_message **)
	calloc(10, sizeof(carmen_robot_vector_status_message *));
      carmen_test_alloc(vector_status_msg);

      base_data_msg = (carmen_base_binary_data_message **)
	calloc(10, sizeof(carmen_base_binary_data_message *));
      carmen_test_alloc(base_data_msg);

      frontlaser_msg_handler = (carmen_handler_t *)
	calloc(10, sizeof(carmen_handler_t));
      carmen_test_alloc(frontlaser_msg_handler);

      rearlaser_msg_handler = (carmen_handler_t *)
	calloc(10, sizeof(carmen_handler_t));
      carmen_test_alloc(rearlaser_msg_handler);

      sonar_msg_handler = (carmen_handler_t *)
	calloc(10, sizeof(carmen_handler_t));
      carmen_test_alloc(sonar_msg_handler);

      vector_status_msg_handler = (carmen_handler_t *)
	calloc(10, sizeof(carmen_handler_t));
      carmen_test_alloc(vector_status_msg_handler);

      base_data_msg_handler = (carmen_handler_t *)
	calloc(10, sizeof(carmen_handler_t));
      carmen_test_alloc(base_data_msg_handler);

      context_array_size = 10;
      context_array[0] = IPC_getContext();


      return 0;
    }

  index = 0;
  while (index < context_array_size && context_array[index] != NULL) 
    index++;
  
  if (index == context_array_size) 
    {
      context_array_size += 10;
      context_array = (IPC_CONTEXT_PTR *)realloc
	(context_array, context_array_size*sizeof(IPC_CONTEXT_PTR));
      carmen_test_alloc(context_array);
      memset(context_array+index, 0, 10*sizeof(IPC_CONTEXT_PTR));
    }

  context_array[index] = IPC_getContext();
  return index;
}
Esempio n. 6
0
JNIEXPORT jlong JNICALL Java_ipc_java_IPC_IPC_1getContext (JNIEnv *env,
						    jclass theClass)
{
  return (jlong)(size_t)IPC_getContext();
}
Esempio n. 7
0
carmen_centrallist_p carmen_multicentral_initialize(int argc, char **argv,
						    void (*exit_handler)(void))
{
  FILE *fp = NULL;
  carmen_centrallist_p centrallist;
  int err2, valid, i, one_central;
  char filename[256], *centralhost, *err, line[256];

  centrallist = (carmen_centrallist_p)calloc(1, sizeof(carmen_centrallist_t));
  carmen_test_alloc(centrallist);

  centrallist_copy = centrallist;

  valid = 0;
  if(argc >= 3) 
    for(i = 1; i < argc - 1; i++)
      if(strcmp(argv[i], "-central") == 0) {
	strcpy(filename, argv[i + 1]);
	valid = 1;
	break;
      }
  
  if(valid)
    fp = fopen(filename, "r");

  if(valid && fp != NULL) {
    /* read from the file */
    centrallist->num_centrals = 0;
    centrallist->central = NULL;
    do {
      err = fgets(line, 256, fp);
      if(err != NULL) {
	valid = 0;
	for(i = 0; i < (int)strlen(line); i++)
	  if(isalpha(line[i]))
	    valid = 1;
	if(valid) {
	  (centrallist->num_centrals)++;
	  centrallist->central = 
	    (carmen_central_p)realloc(centrallist->central,
				      centrallist->num_centrals *
				      sizeof(carmen_central_t));
	  carmen_test_alloc(centrallist->central);
	  sscanf(line, "%s", 
		 centrallist->central[centrallist->num_centrals - 1].host);
	  centrallist->central[centrallist->num_centrals - 1].connected = 0;
	  centrallist->central[centrallist->num_centrals - 1].ready_for_reconnect = 0;
	}
      }
    } while(err != NULL);
    fclose(fp);
  }
  else {
    /* if we can't open the list of centrals, default to connecting to
       localhost */
    if(valid)
      carmen_warn("Error: could not open central list %s for reading.\n", 
	       filename);
    centrallist->num_centrals = 1;
    
    centrallist->central = (carmen_central_p)
      calloc(1, sizeof(carmen_central_t));
    carmen_test_alloc(centrallist->central);
    
    centralhost = getenv("CENTRALHOST");
    if(centralhost == NULL)
      strcpy(centrallist->central[0].host, "localhost");
    else
      strcpy(centrallist->central[0].host, centralhost);
    centrallist->central[0].connected = 0;
    centrallist->central[0].ready_for_reconnect = 0;
  }

  fprintf(stderr, "CENTRAL List:\n");
  fprintf(stderr, "-------------\n");
  for(i = 0; i < centrallist->num_centrals; i++)
    fprintf(stderr, "%d : %s\n", i, centrallist->central[i].host);
  fprintf(stderr, "\n");

  /* set verbosity level */
  IPC_setVerbosity(IPC_Silent);

  /* construct unique IPC module name */
  snprintf(module_name, 200, "%s-%d", 
	   carmen_extract_filename(argv[0]), getpid());

  /* attempt to connect to each central */
  one_central = 0;
  for(i = 0; i < centrallist->num_centrals; i++) {
    err2 = carmen_multicentral_ipc_connect(module_name, 
					   centrallist->central[i].host);
    /* if successful, get IPC context */
    if(err2 >= 0) {
      fprintf(stderr, "MULTICENTRAL: central %s connected.\n", 
	      centrallist->central[i].host);
      centrallist->central[i].connected = 1;
      centrallist->central[i].context = IPC_getContext();
      x_ipcRegisterExitProc(carmen_multicentral_ipc_exit_handler);
      one_central = 1;
    }
    else
      centrallist->central[i].context = NULL;
  }
  if(!one_central && carmen_allow_no_centrals)
    carmen_warn("Error: could not connect to any central.\n");
  else  if(!one_central)
    carmen_die("Error: could not connect to any central.\n");
  client_exit_handler = exit_handler;
  return centrallist;
}