void server_clean_exit(int status) { file_transfer_info_list_item_t * item; // terminate immediately all child threads pthread_cancel(file_exp_timer); // delete all incomplete files for(item = file_transfer_info_list.first; item != NULL; item = item->next) { char* filename = (char*) malloc(item->info->filename_len + strlen(item->info->full_dir) +1); strcpy(filename, item->info->full_dir); strcat(filename, item->info->filename); if (remove(filename) < 0) perror("Error eliminating incomplete file:"); printf("Eliminated file %s because incomplete\n", filename); file_transfer_info_list_item_delete(&file_transfer_info_list, item); free(filename); } if (bp_handle_open) { al_bp_close(handle); al_bp_unregister(handle,regid,local_eid); } printf("DTNperf server: Exit.\n"); exit(status); }
// file expiration timer thread void * file_expiration_timer(void * opt) { u32_t current_dtn_time; file_transfer_info_list_item_t * item, * next; while(1) { current_dtn_time = get_current_dtn_time(); pthread_mutex_lock(&mutexdata); for(item = file_transfer_info_list.first; item != NULL; item = next) { next = item->next; if (item->info->last_bundle_time + item->info->expiration < current_dtn_time) { char* filename = (char*) malloc(item->info->filename_len + strlen(item->info->full_dir) +1); strcpy(filename, item->info->full_dir); strcat(filename, item->info->filename); if (remove(filename) < 0) perror("[DTNperf error] in eliminating expired file:"); printf("Eliminated file %s because timer has expired\n", filename); file_transfer_info_list_item_delete(&file_transfer_info_list, item); free(filename); } } pthread_mutex_unlock(&mutexdata); sched_yield(); sleep(1); } pthread_exit(NULL); }