diff --git a/src/base/target_cleanup.c b/src/base/target_cleanup.c index 56d4341..24199d4 100644 --- a/src/base/target_cleanup.c +++ b/src/base/target_cleanup.c @@ -87,5 +87,11 @@ xdd_target_thread_cleanup(target_data_t *tdp) { perror("reason"); } } + /* Free target seek list created in xint_target_init */ + free(tdp->td_seekhdr.seeks); + /* Free target offset table created in xint_target_init */ + tot_destroy(tdp->td_totp); + /* Free filename malloced in xdd_target_name */ + free(tdp->td_target_full_pathname); } // End of xdd_target_thread_cleanup() diff --git a/src/base/target_init.c b/src/base/target_init.c index 499199c..912a343 100644 --- a/src/base/target_init.c +++ b/src/base/target_init.c @@ -305,6 +305,9 @@ xint_target_init_start_worker_threads(target_data_t *tdp) { perror("Reason"); return(-1); } + + pthread_detach(wdp->wd_thread); + /* Wait for the previous thread to initialize before creating the next one */ xdd_barrier(&tdp->td_target_worker_thread_init_barrier,&tdp->td_occupant,1); if (xgp->global_options & GO_REALLYVERBOSE) { diff --git a/src/base/xint_plan.c b/src/base/xint_plan.c index 768d7f3..e780eca 100644 --- a/src/base/xint_plan.c +++ b/src/base/xint_plan.c @@ -161,6 +161,9 @@ int xint_plan_start_targets(xdd_plan_t *planp) { perror("Reason"); return(-1); } + + pthread_detach(tdp->td_thread); + // Wait for the Target Thread to complete initialization and then create the next one xdd_barrier(&planp->main_general_init_barrier,&barrier_occupant,1); @@ -194,6 +197,9 @@ void xint_plan_start_results_manager(xdd_plan_t *planp) { xdd_destroy_all_barriers(planp); exit(XDD_RETURN_VALUE_INIT_FAILURE); } + + pthread_detach(planp->Results_Thread); + // Enter this barrier and wait for the results monitor to initialize xdd_barrier(&planp->main_general_init_barrier,&barrier_occupant,1); @@ -265,6 +271,37 @@ void xint_plan_start_interactive(xdd_plan_t *planp) { } // End of xdd_start_interactive() +/* Will free all malloced objects associated with xdd_plan_t */ +void xint_plan_cleanup(xdd_plan_t *planp) { + + target_data_t *tdp; + worker_data_t *wdp; + worker_data_t *temp; + + for (int32_t i = 0; i < planp->number_of_targets; i++) { + if (planp->target_datap[i] != 0) { + + tdp = planp->target_datap[i]; + wdp = tdp->td_next_wdp; + + while (wdp) { + temp = wdp; + wdp = wdp->wd_next_wdp; + free(temp); + } + + free(tdp); + + if (planp->target_average_resultsp[i] != 0) + free(planp->target_average_resultsp[i]); + } + } + + free(xgp->id); + free(xgp); + free(planp); +}// End of xint_plan_cleaup() + /* * Plan finalize */ diff --git a/src/client/results_manager.c b/src/client/results_manager.c index 3a5f4a6..5735429 100644 --- a/src/client/results_manager.c +++ b/src/client/results_manager.c @@ -58,7 +58,7 @@ xdd_results_manager(void *data) { status = xdd_results_manager_init(planp); if (status < 0) { fprintf(stderr,"%s: xdd_results_manager: ERROR: Exiting due to previous initialization failure.\n",xgp->progname); - return(0); + goto out; } // Enter this barrier to release main indicating that results manager has initialized @@ -66,7 +66,7 @@ xdd_results_manager(void *data) { xdd_barrier(&planp->main_general_init_barrier,&barrier_occupant,0); if (xgp->global_options & GO_DRYRUN) { - return(0); + goto out; } // This is the loop that runs continuously throughout the xdd run @@ -84,7 +84,7 @@ xdd_results_manager(void *data) { xdd_process_run_results(planp); // Release all the Target Threads so that they can do their cleanup and exit xdd_barrier(&planp->results_targets_display_barrier,&barrier_occupant,1); - return(0); + goto out; } // Display the header and units line if necessary @@ -106,7 +106,7 @@ xdd_results_manager(void *data) { // Enter the FINAL barrier to tell XDD MAIN that everything is complete xdd_barrier(&planp->main_results_final_barrier,&barrier_occupant,0); - return(0); + goto out; } else { xdd_process_pass_results(planp); planp->current_pass_number++; @@ -134,6 +134,8 @@ xdd_results_manager(void *data) { xdd_barrier(&planp->results_targets_display_barrier,&barrier_occupant,1); } // End of main WHILE loop for the results_manager() +out: + free(tmprp); return(0); } // End of xdd_results_manager() diff --git a/src/client/xdd.c b/src/client/xdd.c index eb92844..fe67354 100644 --- a/src/client/xdd.c +++ b/src/client/xdd.c @@ -110,6 +110,7 @@ DFLOW("\n----------------------All targets should start now--------------------- xdd_destroy_all_barriers(planp); /* Time to leave... sigh */ + xint_plan_cleanup(planp); return(return_value); } /* end of main() */ diff --git a/src/common/xint_plan.h b/src/common/xint_plan.h index ffcab25..0ba2e17 100644 --- a/src/common/xint_plan.h +++ b/src/common/xint_plan.h @@ -171,6 +171,8 @@ void xint_plan_start_restart_monitor(xdd_plan_t* planp); void xint_plan_start_interactive(xdd_plan_t* planp); +void xint_plan_cleanup(xdd_plan_t* planp); + #endif /* * Local variables: