mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-12-18 00:37:28 +08:00
gprofng: fix a memory leak in the mxv-pthreads example
Fix a bug where the main program does not free the rows of the matrix. The memory for thread_data_arguments is also not released. In function check_results, the memory for the marker vector is not released. The usage of the verbose veriable has been extended to print more messages. gprofng/ChangeLog 2024-10-16 Ruud van der Pas <ruud.vanderpas@oracle.com> PR 32273 PR 32274 * mxv-pthreads/src/main.c: add calls to free() to release the memory allocated for array A and vector marker. Improve the usage of the verbose variable. * mxv-pthreads/src/manage_data.c: add a diagnostic printf statement. * mxv-pthreads/src/mydefs.h: adapt prototype to match the changes in main.c.
This commit is contained in:
committed by
Vladimir Mezentsev
parent
0e15fd3d54
commit
d6a07eeabb
@@ -28,9 +28,10 @@
|
|||||||
|
|
||||||
#include "mydefs.h"
|
#include "mydefs.h"
|
||||||
|
|
||||||
|
bool verbose;
|
||||||
|
|
||||||
int main (int argc, char **argv)
|
int main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
bool verbose = false;
|
|
||||||
|
|
||||||
thread_data *thread_data_arguments;
|
thread_data *thread_data_arguments;
|
||||||
pthread_t *pthread_ids;
|
pthread_t *pthread_ids;
|
||||||
@@ -62,8 +63,7 @@ int main (int argc, char **argv)
|
|||||||
&number_of_rows,
|
&number_of_rows,
|
||||||
&number_of_columns,
|
&number_of_columns,
|
||||||
&repeat_count,
|
&repeat_count,
|
||||||
&number_of_threads,
|
&number_of_threads);
|
||||||
&verbose);
|
|
||||||
|
|
||||||
if (verbose) printf ("Verbose mode enabled\n");
|
if (verbose) printf ("Verbose mode enabled\n");
|
||||||
|
|
||||||
@@ -191,11 +191,16 @@ int main (int argc, char **argv)
|
|||||||
* Release the allocated memory and end execution.
|
* Release the allocated memory and end execution.
|
||||||
* -----------------------------------------------------------------------------
|
* -----------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
for (int64_t i=0; i<number_of_rows; i++)
|
||||||
|
{
|
||||||
|
free (A[i]);
|
||||||
|
}
|
||||||
free (A);
|
free (A);
|
||||||
free (b);
|
free (b);
|
||||||
free (c);
|
free (c);
|
||||||
free (ref);
|
free (ref);
|
||||||
free (pthread_ids);
|
free (pthread_ids);
|
||||||
|
free (thread_data_arguments);
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
@@ -211,8 +216,7 @@ int get_user_options (int argc, char *argv[],
|
|||||||
int64_t *number_of_rows,
|
int64_t *number_of_rows,
|
||||||
int64_t *number_of_columns,
|
int64_t *number_of_columns,
|
||||||
int64_t *repeat_count,
|
int64_t *repeat_count,
|
||||||
int64_t *number_of_threads,
|
int64_t *number_of_threads)
|
||||||
bool *verbose)
|
|
||||||
{
|
{
|
||||||
int opt;
|
int opt;
|
||||||
int errors = 0;
|
int errors = 0;
|
||||||
@@ -226,7 +230,7 @@ int get_user_options (int argc, char *argv[],
|
|||||||
*number_of_columns = default_columns;
|
*number_of_columns = default_columns;
|
||||||
*number_of_threads = default_number_of_threads;
|
*number_of_threads = default_number_of_threads;
|
||||||
*repeat_count = default_repeat_count;
|
*repeat_count = default_repeat_count;
|
||||||
*verbose = default_verbose;
|
verbose = default_verbose;
|
||||||
|
|
||||||
while ((opt = getopt (argc, argv, "m:n:r:t:vh")) != -1)
|
while ((opt = getopt (argc, argv, "m:n:r:t:vh")) != -1)
|
||||||
{
|
{
|
||||||
@@ -245,7 +249,7 @@ int get_user_options (int argc, char *argv[],
|
|||||||
*number_of_threads = atol (optarg);
|
*number_of_threads = atol (optarg);
|
||||||
break;
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
*verbose = true;
|
verbose = true;
|
||||||
break;
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
default:
|
default:
|
||||||
@@ -370,5 +374,7 @@ int64_t check_results (int64_t m, int64_t n, double *c, double *ref)
|
|||||||
printf (" %c c[%ld] = %f ref[%ld] = %f\n",marker[i],i,c[i],i,ref[i]);
|
printf (" %c c[%ld] = %f ref[%ld] = %f\n",marker[i],i,c[i],i,ref[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free (marker);
|
||||||
|
|
||||||
return (errors);
|
return (errors);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,8 +20,6 @@
|
|||||||
|
|
||||||
#include "mydefs.h"
|
#include "mydefs.h"
|
||||||
|
|
||||||
bool verbose;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* -----------------------------------------------------------------------------
|
* -----------------------------------------------------------------------------
|
||||||
* This function allocates the data and sets up the data structures to be used
|
* This function allocates the data and sets up the data structures to be used
|
||||||
@@ -66,6 +64,10 @@ void allocate_data (int active_threads,
|
|||||||
perror ("vector ref");
|
perror ("vector ref");
|
||||||
exit (-1);
|
exit (-1);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (verbose) printf ("Vector ref allocated\n");
|
||||||
|
}
|
||||||
|
|
||||||
if ((*A = (double **) malloc (number_of_rows * sizeof (double))) == NULL)
|
if ((*A = (double **) malloc (number_of_rows * sizeof (double))) == NULL)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -63,8 +63,7 @@ int get_user_options (int argc,
|
|||||||
int64_t *number_of_rows,
|
int64_t *number_of_rows,
|
||||||
int64_t *number_of_columns,
|
int64_t *number_of_columns,
|
||||||
int64_t *repeat_count,
|
int64_t *repeat_count,
|
||||||
int64_t *number_of_threads,
|
int64_t *number_of_threads);
|
||||||
bool *verbose);
|
|
||||||
|
|
||||||
void init_data (int64_t m,
|
void init_data (int64_t m,
|
||||||
int64_t n,
|
int64_t n,
|
||||||
|
|||||||
Reference in New Issue
Block a user