From 77cb52705a46ada90fd91f4b64a046d39da8d485 Mon Sep 17 00:00:00 2001
From: Mathieu Faverge <mathieu.faverge@inria.fr>
Date: Thu, 12 Jul 2018 14:32:30 +0200
Subject: [PATCH] Fix memory leak with temporary descriptors

---
 compute/pzgetrf_incpiv.c | 2 +-
 compute/pzhetrd_he2hb.c  | 7 ++-----
 compute/zgelqf.c         | 1 +
 compute/zgelqf_param.c   | 1 +
 compute/zgelqs.c         | 1 +
 compute/zgelqs_param.c   | 1 +
 compute/zgels.c          | 1 +
 compute/zgels_param.c    | 1 +
 compute/zgeqrf.c         | 1 +
 compute/zgeqrf_param.c   | 1 +
 compute/zgeqrs.c         | 1 +
 compute/zgeqrs_param.c   | 1 +
 compute/zgesv_incpiv.c   | 1 +
 compute/zgesvd.c         | 1 +
 compute/zgetrf_incpiv.c  | 1 +
 compute/zheevd.c         | 1 +
 compute/zhetrd.c         | 1 +
 compute/ztpgqrt.c        | 1 +
 compute/zunglq.c         | 1 +
 compute/zunglq_param.c   | 1 +
 compute/zungqr.c         | 1 +
 compute/zungqr_param.c   | 1 +
 compute/zunmlq.c         | 1 +
 compute/zunmlq_param.c   | 1 +
 compute/zunmqr.c         | 1 +
 compute/zunmqr_param.c   | 1 +
 26 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/compute/pzgetrf_incpiv.c b/compute/pzgetrf_incpiv.c
index 4d3bd0958..1053772a1 100644
--- a/compute/pzgetrf_incpiv.c
+++ b/compute/pzgetrf_incpiv.c
@@ -41,7 +41,7 @@
  *  Parallel tile LU factorization - dynamic scheduling
  */
 void chameleon_pzgetrf_incpiv( CHAM_desc_t *A, CHAM_desc_t *L, CHAM_desc_t *D, int *IPIV,
-                           RUNTIME_sequence_t *sequence, RUNTIME_request_t *request )
+                               RUNTIME_sequence_t *sequence, RUNTIME_request_t *request )
 {
     CHAM_context_t *chamctxt;
     RUNTIME_option_t options;
diff --git a/compute/pzhetrd_he2hb.c b/compute/pzhetrd_he2hb.c
index 1aedeae69..2ed482692 100644
--- a/compute/pzhetrd_he2hb.c
+++ b/compute/pzhetrd_he2hb.c
@@ -436,11 +436,8 @@ void chameleon_pzhetrd_he2hb(cham_uplo_t uplo,
     RUNTIME_options_finalize(&options, chamctxt);
 
     CHAMELEON_Sequence_Wait(sequence);
-    chameleon_desc_mat_free(D);
-    free(D);
-
-    chameleon_desc_mat_free(AT);
-    free(AT);
+    CHAMELEON_Desc_Destroy( &D );
+    CHAMELEON_Desc_Destroy( &AT );
 
     (void)E;
 }
diff --git a/compute/zgelqf.c b/compute/zgelqf.c
index d6dfbee95..db512fc7e 100644
--- a/compute/zgelqf.c
+++ b/compute/zgelqf.c
@@ -297,6 +297,7 @@ int CHAMELEON_zgelqf_Tile_Async( CHAM_desc_t *A, CHAM_desc_t *T,
         CHAMELEON_Desc_Flush( T, sequence );
         CHAMELEON_Desc_Flush( Dptr, sequence );
         chameleon_sequence_wait( chamctxt, sequence );
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
diff --git a/compute/zgelqf_param.c b/compute/zgelqf_param.c
index a86809cf4..b967339ad 100644
--- a/compute/zgelqf_param.c
+++ b/compute/zgelqf_param.c
@@ -297,6 +297,7 @@ int CHAMELEON_zgelqf_param_Tile_Async( const libhqr_tree_t *qrtree, CHAM_desc_t
         CHAMELEON_Desc_Flush( TT, sequence );
         CHAMELEON_Desc_Flush( Dptr, sequence );
         chameleon_sequence_wait( chamctxt, sequence );
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
diff --git a/compute/zgelqs.c b/compute/zgelqs.c
index 4b74ebf46..4b1483a7c 100644
--- a/compute/zgelqs.c
+++ b/compute/zgelqs.c
@@ -339,6 +339,7 @@ int CHAMELEON_zgelqs_Tile_Async( CHAM_desc_t *A, CHAM_desc_t *T, CHAM_desc_t *B,
         CHAMELEON_Desc_Flush( T, sequence );
         CHAMELEON_Desc_Flush( Dptr, sequence );
         chameleon_sequence_wait( chamctxt, sequence );
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
diff --git a/compute/zgelqs_param.c b/compute/zgelqs_param.c
index 997117abd..758775ab8 100644
--- a/compute/zgelqs_param.c
+++ b/compute/zgelqs_param.c
@@ -346,6 +346,7 @@ int CHAMELEON_zgelqs_param_Tile_Async( const libhqr_tree_t *qrtree, CHAM_desc_t
         CHAMELEON_Desc_Flush( TT, sequence );
         CHAMELEON_Desc_Flush( Dptr, sequence );
         chameleon_sequence_wait( chamctxt, sequence );
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
diff --git a/compute/zgels.c b/compute/zgels.c
index cd75e4513..4612948cb 100644
--- a/compute/zgels.c
+++ b/compute/zgels.c
@@ -435,6 +435,7 @@ int CHAMELEON_zgels_Tile_Async( cham_trans_t trans, CHAM_desc_t *A,
         CHAMELEON_Desc_Flush( B, sequence );
         CHAMELEON_Desc_Flush( Dptr, sequence );
         chameleon_sequence_wait( chamctxt, sequence );
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
diff --git a/compute/zgels_param.c b/compute/zgels_param.c
index 6547a5371..15233f0a6 100644
--- a/compute/zgels_param.c
+++ b/compute/zgels_param.c
@@ -427,6 +427,7 @@ int CHAMELEON_zgels_param_Tile_Async( const libhqr_tree_t *qrtree, cham_trans_t
         CHAMELEON_Desc_Flush( TT, sequence );
         CHAMELEON_Desc_Flush( Dptr, sequence );
         chameleon_sequence_wait( chamctxt, sequence );
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
diff --git a/compute/zgeqrf.c b/compute/zgeqrf.c
index 67679772b..6a16dbd2a 100644
--- a/compute/zgeqrf.c
+++ b/compute/zgeqrf.c
@@ -296,6 +296,7 @@ int CHAMELEON_zgeqrf_Tile_Async( CHAM_desc_t *A, CHAM_desc_t *T,
         CHAMELEON_Desc_Flush( T, sequence );
         CHAMELEON_Desc_Flush( Dptr, sequence );
         chameleon_sequence_wait( chamctxt, sequence );
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
diff --git a/compute/zgeqrf_param.c b/compute/zgeqrf_param.c
index cb7280422..17f2a2a3d 100644
--- a/compute/zgeqrf_param.c
+++ b/compute/zgeqrf_param.c
@@ -307,6 +307,7 @@ int CHAMELEON_zgeqrf_param_Tile_Async( const libhqr_tree_t *qrtree, CHAM_desc_t
         CHAMELEON_Desc_Flush( TT, sequence );
         CHAMELEON_Desc_Flush( Dptr, sequence );
         chameleon_sequence_wait( chamctxt, sequence );
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
diff --git a/compute/zgeqrs.c b/compute/zgeqrs.c
index 4d7942269..dc42e323f 100644
--- a/compute/zgeqrs.c
+++ b/compute/zgeqrs.c
@@ -334,6 +334,7 @@ int CHAMELEON_zgeqrs_Tile_Async( CHAM_desc_t *A, CHAM_desc_t *T, CHAM_desc_t *B,
         CHAMELEON_Desc_Flush( T, sequence );
         CHAMELEON_Desc_Flush( Dptr, sequence );
         chameleon_sequence_wait( chamctxt, sequence );
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
diff --git a/compute/zgeqrs_param.c b/compute/zgeqrs_param.c
index 66db5b743..306ea555c 100644
--- a/compute/zgeqrs_param.c
+++ b/compute/zgeqrs_param.c
@@ -335,6 +335,7 @@ int CHAMELEON_zgeqrs_param_Tile_Async( const libhqr_tree_t *qrtree,
         CHAMELEON_Desc_Flush( TT, sequence );
         CHAMELEON_Desc_Flush( Dptr, sequence );
         chameleon_sequence_wait( chamctxt, sequence );
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
diff --git a/compute/zgesv_incpiv.c b/compute/zgesv_incpiv.c
index 90a800eb1..7494b34cf 100644
--- a/compute/zgesv_incpiv.c
+++ b/compute/zgesv_incpiv.c
@@ -331,6 +331,7 @@ int CHAMELEON_zgesv_incpiv_Tile_Async( CHAM_desc_t *A, CHAM_desc_t *L, int *IPIV
         CHAMELEON_Desc_Flush( Dptr, sequence );
         CHAMELEON_Desc_Flush( B, sequence );
         chameleon_sequence_wait( chamctxt, sequence );
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
diff --git a/compute/zgesvd.c b/compute/zgesvd.c
index de759169c..7b8e96a93 100644
--- a/compute/zgesvd.c
+++ b/compute/zgesvd.c
@@ -632,6 +632,7 @@ int CHAMELEON_zgesvd_Tile_Async( cham_job_t jobu, cham_job_t jobvt,
 
     free(E);
     if ( Dptr ) {
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
diff --git a/compute/zgetrf_incpiv.c b/compute/zgetrf_incpiv.c
index bdd9c476c..0a68aa402 100644
--- a/compute/zgetrf_incpiv.c
+++ b/compute/zgetrf_incpiv.c
@@ -298,6 +298,7 @@ int CHAMELEON_zgetrf_incpiv_Tile_Async( CHAM_desc_t *A, CHAM_desc_t *L, int *IPI
         CHAMELEON_Desc_Flush( L, sequence );
         CHAMELEON_Desc_Flush( Dptr, sequence );
         chameleon_sequence_wait( chamctxt, sequence );
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
diff --git a/compute/zheevd.c b/compute/zheevd.c
index a203a877c..505bb279a 100644
--- a/compute/zheevd.c
+++ b/compute/zheevd.c
@@ -535,6 +535,7 @@ int CHAMELEON_zheevd_Tile_Async( cham_job_t jobz, cham_uplo_t uplo,
     free(V);
     free(E);
     if (Dptr != NULL) {
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
diff --git a/compute/zhetrd.c b/compute/zhetrd.c
index 660bd5b91..e3d43c5e0 100644
--- a/compute/zhetrd.c
+++ b/compute/zhetrd.c
@@ -430,6 +430,7 @@ int CHAMELEON_zhetrd_Tile_Async( cham_job_t jobz,
     }
 #endif /* !defined(CHAMELEON_SIMULATION) */
     if (Dptr != NULL) {
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     chameleon_desc_mat_free( &descAB );
diff --git a/compute/ztpgqrt.c b/compute/ztpgqrt.c
index f3a65b6a6..a89ef3dbb 100644
--- a/compute/ztpgqrt.c
+++ b/compute/ztpgqrt.c
@@ -426,6 +426,7 @@ int CHAMELEON_ztpgqrt_Tile_Async( int L,
         CHAMELEON_Desc_Flush( Q2, sequence );
         CHAMELEON_Desc_Flush( Dptr, sequence );
         chameleon_sequence_wait( chamctxt, sequence );
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
diff --git a/compute/zunglq.c b/compute/zunglq.c
index e40953f9c..63ff7233b 100644
--- a/compute/zunglq.c
+++ b/compute/zunglq.c
@@ -322,6 +322,7 @@ int CHAMELEON_zunglq_Tile_Async( CHAM_desc_t *A, CHAM_desc_t *T, CHAM_desc_t *Q,
         CHAMELEON_Desc_Flush( T, sequence );
         CHAMELEON_Desc_Flush( Dptr, sequence );
         chameleon_sequence_wait( chamctxt, sequence );
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
diff --git a/compute/zunglq_param.c b/compute/zunglq_param.c
index fefc20d57..10855cc2d 100644
--- a/compute/zunglq_param.c
+++ b/compute/zunglq_param.c
@@ -321,6 +321,7 @@ int CHAMELEON_zunglq_param_Tile_Async( const libhqr_tree_t *qrtree, CHAM_desc_t
         CHAMELEON_Desc_Flush( TT, sequence );
         CHAMELEON_Desc_Flush( Dptr, sequence );
         chameleon_sequence_wait( chamctxt, sequence );
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
diff --git a/compute/zungqr.c b/compute/zungqr.c
index 25b4e8375..dae14adb3 100644
--- a/compute/zungqr.c
+++ b/compute/zungqr.c
@@ -319,6 +319,7 @@ int CHAMELEON_zungqr_Tile_Async( CHAM_desc_t *A, CHAM_desc_t *T, CHAM_desc_t *Q,
         CHAMELEON_Desc_Flush( T, sequence );
         CHAMELEON_Desc_Flush( Dptr, sequence );
         chameleon_sequence_wait( chamctxt, sequence );
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
diff --git a/compute/zungqr_param.c b/compute/zungqr_param.c
index 6dd11ada6..52f3b857f 100644
--- a/compute/zungqr_param.c
+++ b/compute/zungqr_param.c
@@ -319,6 +319,7 @@ int CHAMELEON_zungqr_param_Tile_Async( const libhqr_tree_t *qrtree, CHAM_desc_t
         CHAMELEON_Desc_Flush( TT, sequence );
         CHAMELEON_Desc_Flush( Dptr, sequence );
         chameleon_sequence_wait( chamctxt, sequence );
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
diff --git a/compute/zunmlq.c b/compute/zunmlq.c
index 6d246cd57..89e0ca1dc 100644
--- a/compute/zunmlq.c
+++ b/compute/zunmlq.c
@@ -383,6 +383,7 @@ int CHAMELEON_zunmlq_Tile_Async( cham_side_t side, cham_trans_t trans,
         CHAMELEON_Desc_Flush( T, sequence );
         CHAMELEON_Desc_Flush( Dptr, sequence );
         chameleon_sequence_wait( chamctxt, sequence );
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
diff --git a/compute/zunmlq_param.c b/compute/zunmlq_param.c
index 9eda1ebc7..1ddd96335 100644
--- a/compute/zunmlq_param.c
+++ b/compute/zunmlq_param.c
@@ -382,6 +382,7 @@ int CHAMELEON_zunmlq_param_Tile_Async( const libhqr_tree_t *qrtree, cham_side_t
         CHAMELEON_Desc_Flush( TT, sequence );
         CHAMELEON_Desc_Flush( Dptr, sequence );
         chameleon_sequence_wait( chamctxt, sequence );
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
diff --git a/compute/zunmqr.c b/compute/zunmqr.c
index b6f1e1691..5f275c61b 100644
--- a/compute/zunmqr.c
+++ b/compute/zunmqr.c
@@ -390,6 +390,7 @@ int CHAMELEON_zunmqr_Tile_Async( cham_side_t side, cham_trans_t trans,
         CHAMELEON_Desc_Flush( T, sequence );
         CHAMELEON_Desc_Flush( Dptr, sequence );
         chameleon_sequence_wait( chamctxt, sequence );
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
diff --git a/compute/zunmqr_param.c b/compute/zunmqr_param.c
index e53ed50a7..cc1c09c50 100644
--- a/compute/zunmqr_param.c
+++ b/compute/zunmqr_param.c
@@ -389,6 +389,7 @@ int CHAMELEON_zunmqr_param_Tile_Async( const libhqr_tree_t *qrtree,
         CHAMELEON_Desc_Flush( TT, sequence );
         CHAMELEON_Desc_Flush( Dptr, sequence );
         chameleon_sequence_wait( chamctxt, sequence );
+        RUNTIME_desc_destroy( Dptr );
         chameleon_desc_mat_free( Dptr );
     }
     (void)D;
-- 
GitLab