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(); } } }
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; }
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(); }
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; }
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; }
JNIEXPORT jlong JNICALL Java_ipc_java_IPC_IPC_1getContext (JNIEnv *env, jclass theClass) { return (jlong)(size_t)IPC_getContext(); }
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; }