/** * Destroy the store. * * @param p the store to destroy * @raise IO_ERROR if there is an error deleting the locks */ static void fs_destroy(Store *store) { TRY fs_clear_locks(store); XCATCHALL HANDLED(); XENDTRY free(store->dir.path); store_destroy(store); }
static void ram_close_i(Store *store) { Hash *ht = store->dir.ht; int i; for (i = 0; i <= ht->mask; i++) { RAMFile *rf = (RAMFile *)ht->table[i].value; if (rf) { DEREF(rf); } } h_destroy(store->dir.ht); store_destroy(store); }
static void cmpd_close_i(Store *store) { CompoundStore *cmpd = store->dir.cmpd; if (cmpd->stream == NULL) { RAISE(IO_ERROR, "Tried to close already closed compound store"); } h_destroy(cmpd->entries); is_close(cmpd->stream); cmpd->stream = NULL; free(store->dir.cmpd); store_destroy(store); }
void degenerator_destroy (Degenerator_t * degenerator){ store_destroy(degenerator->_store); free(degenerator); }
int main(int argc, char** argv) { char path[50] = { 0x00 }; if (2 <= argc) { strncpy(path, argv[1], strlen(argv[1])); } else { strncpy(path, "server.cfg", 10); } //读取配置文件 TinyConf* config; char* run; for(;;) { config = conf_open(path, '='); if(NULL == config) { sleep(5); continue; } run = conf_get(config, "run"); if(0 >= strlen(run)) { sleep(5); continue; } if(0 != strcmp(run, "on")) { sleep(5); continue; } break; //一切ok,启动正常处理 } //初始化mysql配置 char* mysql_host = conf_get(config, "mysql_host"); char* mysql_port_str = conf_get(config, "mysql_port"); char* mysql_user = conf_get(config, "mysql_user"); char* mysql_password = conf_get(config, "mysql_password"); char* mysql_database = conf_get(config, "mysql_database"); //将数据库设置存入到map中 TinyMap* store_map = map_create(); map_add(store_map, "host", mysql_host, NULL); map_add(store_map, "port", mysql_port_str, NULL); map_add(store_map, "user", mysql_user, NULL); map_add(store_map, "password", mysql_password, NULL); map_add(store_map, "database", mysql_database, NULL); //初始化tcpserver的相关代码 int tcp_port = 7000; char* tcp_port_str = conf_get(config, "port"); if(0 < strlen(tcp_port_str)) { tcp_port = atoi(tcp_port_str); } TCPServer* tcp_server = tcp_server_create(tcp_port); //生成tcp服务器实例 if(NULL == tcp_server) { fprintf(stderr, "Create server falied.\n"); } tcp_server_set_proc_callback(tcp_server, store_map, analyze_proc); //注册数据处理的回调函数 tcp_server_set_timeout_callback(tcp_server, store_map, analyze_timeout); //注册客户端连接超时的回调函数 int ret = tcp_server_start(tcp_server); //启动tcp服务器 if(-1 == ret) { fprintf(stderr, "Start tcpserver falied.\n"); return 0; } //创建存储实例 Store* store = store_create(mysql_host, atoi(mysql_port_str), mysql_user, mysql_password, mysql_database); //创建网络检测线程 pthread_t thread_id; int p_ret = pthread_create(&thread_id, NULL, (void*)check_networks, store); if(0 != p_ret) { fprintf(stderr, "%s\n", "create networks check thread err."); } for(;;) { //阻塞 sleep(1000); } pthread_cancel(thread_id); //退出线程 store_destroy(store); //销毁存储实例 tcp_server_stop(tcp_server); //停止tcp服务器实例 tcp_server_destroy(tcp_server); //销毁tcp服务器实例 map_destroy(store_map); //销毁store_map实例 conf_close(config); //关闭配置信息读取实例 return 0; }
int main(int argc, char ** argv){ srand(time(NULL)); Config_t * config = config_create (argc, argv); if (!config_is_valid (config)) { config_usage (config); exit(-1); } pDEBUG("Got config from command line\n"); config_set (config); pDEBUG("Config set\n"); // en fonction de la commande switch (config->command){ case COMMAND_TP1_FILTER_EX2: { Filter_t * filter = filter_create(&(config->io), config->filter_size, config->filter_offset); filter_run (filter); filter_destroy (filter); } break; case COMMAND_TP1_DEGREE_EX3: { Degree_t * degree = degree_create (&(config->io), config->nodecount, MODE_DEGREE); degree_set_output (degree, true); degree_fill_from_input_graph (degree); degree_destroy (degree); } break; case COMMAND_TP1_STORE_GRAPH_EX4: { Store_t * store = store_create(&(config->io), config->nodecount); store_fill_from_input_graph (store); store_destroy (store); } break; case COMMAND_TP1_DENSITY_AVGDEGREE_MAXDEGREE_EX5: { Degree_t * degree = degree_create (&(config->io), config->nodecount, MODE_DEGSTATS); degree_set_output (degree, true); degree_fill_from_input_graph (degree); degree_destroy (degree); } break; case COMMAND_TP1_CONNEXITY_EX6: { Store_t * store = store_create(&(config->io), config->nodecount); store_fill_from_input_graph (store); store_connexity (store, NULL); store_destroy (store); } break; case COMMAND_TP1_CONNEXITY_DEFI: { Defi_t * defi = defi_create(&(config->io), config->nodecount); defi_run (defi); defi_destroy (defi); } break; case COMMAND_TP2_DISTANCE_ONE_TO_OTHER_EX1: { fprintf(stderr,"Exercice 1 - Ecrire un programme qui, étant donné un\n"); fprintf(stderr," graphe et un de ses noeud, calcule la distance de ce\n"); fprintf(stderr," noeud a tous les autres, ainsi que la moyenne de\n"); fprintf(stderr," toutes ces distances.\n\n"); Distance_t * distance = distance_create((&config->io), config->nodecount); distance_set_mode (distance, MODE_MAX_AND_AVERAGE); distance_set_root (distance, config->root_index); distance_set_iterations (distance, 1); distance_compute (distance); distance_destroy (distance); } break; case COMMAND_TP2_PLOT_DISTRIB_DISTANCES_EX2: { fprintf(stderr,"Exercice 2 - Tracer la distribution des distances à un\n"); fprintf(stderr," noeud donné, c'est à dire pour chaque entier i le nom-\n"); fprintf(stderr," bre de noeuds à distance i du noeud donné.\n\n"); Distance_t * distance = distance_create((&config->io), config->nodecount); distance_set_mode (distance, MODE_MAX_DISTRIBUTION); distance_set_root (distance, config->root_index); distance_set_iterations (distance, 1); distance_compute (distance); distance_destroy (distance); } break; case COMMAND_TP2_EVOL_OF_DISTS_FNC_NB_PARCOURS_EX3: { fprintf(stderr, "Exercice 3 - Ecrire un programme qui permet de tracer\n"); fprintf(stderr, " l'évolution de l'estimation de la distance moyenne en\n"); fprintf(stderr, " fonction du nombre de parcours effectués.\n"); fprintf(stderr, "A chaque étape, le programme calcule la distance moyenne\n"); fprintf(stderr, " d'un noeud à tous les autres, puis fait la moyenne avec\n"); fprintf(stderr, " toutes les valeurs précédentes.\n\n"); Distance_t * distance = distance_create((&config->io), config->nodecount); distance_set_mode (distance, MODE_EVOLUTION); distance_set_root (distance, config->root_index); distance_set_iterations (distance, config->iterations); distance_compute (distance); distance_destroy (distance); } break; case COMMAND_TP2_LIMIT_INFERIOR_EX4: { fprintf(stderr, "Exercice 4 - Ecrire un programme qui calcule une borne\n"); fprintf(stderr, " inférieure du diamètre, en prenant la distance maximale\n"); fprintf(stderr, " d'un noeud donné à tous les autres.\n\n"); Distance_t * distance = distance_create((&config->io), config->nodecount); distance_set_mode (distance, MODE_SHOW_LIMIT_INF); distance_set_root (distance, config->root_index); distance_set_iterations (distance, config->iterations); distance_compute (distance); distance_destroy (distance); } break; case COMMAND_TP2_LIMIT_SUPERIOR_EX5: { fprintf(stderr, "Exercice 5 - Ecrire un programme qui calcule une borne\n"); fprintf(stderr, " supérieure du diamètre, en prenant la distance maximale\n"); fprintf(stderr, " dans l'arbre du parcours en largeur.\n\n"); Distance_t * distance = distance_create((&config->io), config->nodecount); distance_set_mode (distance, MODE_SHOW_LIMIT_SUP); distance_set_root (distance, config->root_index); distance_set_iterations (distance, config->iterations); distance_compute (distance); distance_destroy (distance); } break; case COMMAND_TP2_EVOLUTION_AND_LIMITS_DEFI: { fprintf(stderr, "Défi - Ecrire un programme qui donne un encadrement de\n"); fprintf(stderr, " plus en plus fin du diamètre d'un graphe. Le programme\n"); fprintf(stderr, " effectue à chaque étape un parcours en largeur et en\n"); fprintf(stderr, " déduit une borne inférieure et une borne supérieure pour\n"); fprintf(stderr, " le diamètre. Si elle améliorent le résultat elle sont\n"); fprintf(stderr, " conservées à la place des meilleures valeurs trouvées\n"); fprintf(stderr, " lors des étapes précédentes.\n\n"); Distance_t * distance = distance_create((&config->io), config->nodecount); distance_set_mode (distance, MODE_DEFI); distance_set_root (distance, config->root_index); distance_set_iterations (distance, config->iterations); distance_compute (distance); distance_destroy (distance); } break; case COMMAND_TP3_DISTRIB_DEG_EX1: { fprintf(stderr, "Exercice 1 - Ecrire un programme qui calcule la distribu-\n"); fprintf(stderr, " tion des degrés d'un graphe.\n"); Degree_t * degree = degree_create (&(config->io), config->nodecount, MODE_DEGREE); degree_set_output (degree, false); degree_fill_from_input_graph (degree); degree_output_distribution (degree); degree_destroy (degree); } break; case COMMAND_TP3_EVOL_AVG_DEG_EX2: { Store_t * store = store_create(&(config->io), config->nodecount); store_fill_from_input_graph (store); store_compute_avg_degree(store, config->iterations); store_destroy (store); } break; case COMMAND_TP3_GENERATE_EX3: { fprintf(stderr, "Generating a random graph\n"); Generator_t * generator = generator_create(&(config->io), config->nodecount, config->filter_size); generator_run (generator); generator_destroy (generator); } break; case COMMAND_TP3_DEGENERATE_EX5: { fprintf(stderr, "Degenerating input graph\n"); Degenerator_t * degen = degenerator_create (&(config->io), config->nodecount, config->iterations); degenerator_set_select_mode (degen, DEGENERATOR_SELECT_RANDOM); degenerator_compute (degen); degenerator_destroy (degen); } break; case COMMAND_TP3_DEGENERATE_MAX_DEG_EX7: { fprintf(stderr, "Degenerating input graph with max degrees first\n"); Degenerator_t * degen = degenerator_create (&(config->io), config->nodecount, config->iterations); degenerator_set_select_mode (degen, DEGENERATOR_SELECT_MAX_DEG); degenerator_compute (degen); degenerator_destroy (degen); } break; default: { printf("Undefined mode\n"); } break; } config_destroy (config); return EXIT_SUCCESS; }