aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven van Haastregt <sven.vanhaastregt@arm.com>2023-08-29 17:13:03 +0100
committerGitHub <noreply@github.com>2023-08-29 09:13:03 -0700
commit46fde8d051759b6a04c3852cbf40f2e158479f85 (patch)
tree2f43bbaa163932c9672b80e2161463b04f29cd5a
parentddbb0de4b9864b82e1012653b6faa06e1a80ec62 (diff)
downloadOpenCL-CTS-46fde8d051759b6a04c3852cbf40f2e158479f85.tar.gz
atomics: fix memory leaks on error paths (#1732)
Before this change, `add_index_bin_test` would not release `cl_mem` resources or `malloc`ed memory when encountering an error. Fix by using `clMemWrapper` and `std::unique_ptr` to automatically release resources. Signed-off-by: Sven van Haastregt <sven.vanhaastregt@arm.com>
-rw-r--r--test_conformance/atomics/test_indexed_cases.cpp48
1 files changed, 21 insertions, 27 deletions
diff --git a/test_conformance/atomics/test_indexed_cases.cpp b/test_conformance/atomics/test_indexed_cases.cpp
index 7da2dfa7..ce0410bc 100644
--- a/test_conformance/atomics/test_indexed_cases.cpp
+++ b/test_conformance/atomics/test_indexed_cases.cpp
@@ -13,6 +13,9 @@
// See the License for the specific language governing permissions and
// limitations under the License.
//
+
+#include <memory>
+
#include "testBase.h"
#include "harness/conversions.h"
@@ -226,13 +229,13 @@ int add_index_bin_test(size_t *global_threads, cl_command_queue queue,
(int)global_threads[0], (int)local_threads[0]);
// Allocate our storage
- cl_mem bin_counters =
+ clMemWrapper bin_counters =
clCreateBuffer(context, CL_MEM_READ_WRITE,
sizeof(cl_int) * number_of_bins, NULL, NULL);
- cl_mem bins = clCreateBuffer(
+ clMemWrapper bins = clCreateBuffer(
context, CL_MEM_READ_WRITE,
sizeof(cl_int) * number_of_bins * max_counts_per_bin, NULL, NULL);
- cl_mem bin_assignments =
+ clMemWrapper bin_assignments =
clCreateBuffer(context, CL_MEM_READ_ONLY,
sizeof(cl_int) * number_of_items, NULL, NULL);
@@ -253,7 +256,7 @@ int add_index_bin_test(size_t *global_threads, cl_command_queue queue,
}
// Initialize our storage
- cl_int *l_bin_counts = (cl_int *)malloc(sizeof(cl_int) * number_of_bins);
+ std::unique_ptr<cl_int[]> l_bin_counts(new cl_int[number_of_bins]);
if (!l_bin_counts)
{
log_error("add_index_bin_test FAILED to allocate initial values for "
@@ -263,8 +266,8 @@ int add_index_bin_test(size_t *global_threads, cl_command_queue queue,
int i;
for (i = 0; i < number_of_bins; i++) l_bin_counts[i] = 0;
err = clEnqueueWriteBuffer(queue, bin_counters, true, 0,
- sizeof(cl_int) * number_of_bins, l_bin_counts, 0,
- NULL, NULL);
+ sizeof(cl_int) * number_of_bins,
+ l_bin_counts.get(), 0, NULL, NULL);
if (err)
{
log_error("add_index_bin_test FAILED to set initial values for "
@@ -273,8 +276,8 @@ int add_index_bin_test(size_t *global_threads, cl_command_queue queue,
return -1;
}
- cl_int *values =
- (cl_int *)malloc(sizeof(cl_int) * number_of_bins * max_counts_per_bin);
+ std::unique_ptr<cl_int[]> values(
+ new cl_int[number_of_bins * max_counts_per_bin]);
if (!values)
{
log_error(
@@ -285,7 +288,7 @@ int add_index_bin_test(size_t *global_threads, cl_command_queue queue,
err = clEnqueueWriteBuffer(queue, bins, true, 0,
sizeof(cl_int) * number_of_bins
* max_counts_per_bin,
- values, 0, NULL, NULL);
+ values.get(), 0, NULL, NULL);
if (err)
{
log_error(
@@ -293,10 +296,8 @@ int add_index_bin_test(size_t *global_threads, cl_command_queue queue,
err);
return -1;
}
- free(values);
- cl_int *l_bin_assignments =
- (cl_int *)malloc(sizeof(cl_int) * number_of_items);
+ std::unique_ptr<cl_int[]> l_bin_assignments(new cl_int[number_of_items]);
if (!l_bin_assignments)
{
log_error("add_index_bin_test FAILED to allocate initial values for "
@@ -326,7 +327,7 @@ int add_index_bin_test(size_t *global_threads, cl_command_queue queue,
}
err = clEnqueueWriteBuffer(queue, bin_assignments, true, 0,
sizeof(cl_int) * number_of_items,
- l_bin_assignments, 0, NULL, NULL);
+ l_bin_assignments.get(), 0, NULL, NULL);
if (err)
{
log_error("add_index_bin_test FAILED to set initial values for "
@@ -355,8 +356,8 @@ int add_index_bin_test(size_t *global_threads, cl_command_queue queue,
return -1;
}
- cl_int *final_bin_assignments =
- (cl_int *)malloc(sizeof(cl_int) * number_of_bins * max_counts_per_bin);
+ std::unique_ptr<cl_int[]> final_bin_assignments(
+ new cl_int[number_of_bins * max_counts_per_bin]);
if (!final_bin_assignments)
{
log_error("add_index_bin_test FAILED to allocate initial values for "
@@ -366,15 +367,14 @@ int add_index_bin_test(size_t *global_threads, cl_command_queue queue,
err = clEnqueueReadBuffer(queue, bins, true, 0,
sizeof(cl_int) * number_of_bins
* max_counts_per_bin,
- final_bin_assignments, 0, NULL, NULL);
+ final_bin_assignments.get(), 0, NULL, NULL);
if (err)
{
log_error("add_index_bin_test FAILED to read back bins: %d\n", err);
return -1;
}
- cl_int *final_bin_counts =
- (cl_int *)malloc(sizeof(cl_int) * number_of_bins);
+ std::unique_ptr<cl_int[]> final_bin_counts(new cl_int[number_of_bins]);
if (!final_bin_counts)
{
log_error("add_index_bin_test FAILED to allocate initial values for "
@@ -382,8 +382,8 @@ int add_index_bin_test(size_t *global_threads, cl_command_queue queue,
return -1;
}
err = clEnqueueReadBuffer(queue, bin_counters, true, 0,
- sizeof(cl_int) * number_of_bins, final_bin_counts,
- 0, NULL, NULL);
+ sizeof(cl_int) * number_of_bins,
+ final_bin_counts.get(), 0, NULL, NULL);
if (err)
{
log_error("add_index_bin_test FAILED to read back bin_counters: %d\n",
@@ -460,13 +460,7 @@ int add_index_bin_test(size_t *global_threads, cl_command_queue queue,
errors++;
}
}
- free(l_bin_counts);
- free(l_bin_assignments);
- free(final_bin_assignments);
- free(final_bin_counts);
- clReleaseMemObject(bin_counters);
- clReleaseMemObject(bins);
- clReleaseMemObject(bin_assignments);
+
if (errors == 0)
{
log_info("add_index_bin_test passed. Each item was put in the correct "