mirror of
https://github.com/KhronosGroup/OpenCL-CTS.git
synced 2026-03-19 06:09:01 +00:00
Mem-leaks from conformance pipes (#772)
Fix various memory leaks around events. Convert test to use supplied typewrappers to avoid memory leaks. Also use error helper functions to reduce code size. Use stringstreams to synthesize kernel sources, and raw c+11 string literals. Signed-off-by: John Kesapides <john.kesapides@arm.com>
This commit is contained in:
@@ -64,23 +64,26 @@ const char* pipe_readwrite_errors_kernel_code = {
|
||||
|
||||
int test_pipe_readwrite_errors(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
|
||||
{
|
||||
cl_mem pipe;
|
||||
cl_mem buffers[3];
|
||||
void *outptr;
|
||||
cl_int *inptr;
|
||||
cl_program program;
|
||||
cl_kernel kernel[2];
|
||||
size_t global_work_size[3];
|
||||
cl_int err;
|
||||
cl_int size;
|
||||
cl_int i;
|
||||
cl_int status = 0;
|
||||
cl_event producer_sync_event;
|
||||
cl_event consumer_sync_event;
|
||||
MTdata d = init_genrand( gRandomSeed );
|
||||
const char* kernelName[] = {"test_pipe_write_error", "test_pipe_read_error"};
|
||||
clMemWrapper pipe;
|
||||
clMemWrapper buffers[3];
|
||||
void *outptr;
|
||||
cl_int *inptr;
|
||||
clProgramWrapper program;
|
||||
clKernelWrapper kernel[2];
|
||||
size_t global_work_size[3];
|
||||
cl_int err;
|
||||
cl_int size;
|
||||
cl_int i;
|
||||
cl_int status = 0;
|
||||
clEventWrapper producer_sync_event;
|
||||
clEventWrapper consumer_sync_event;
|
||||
BufferOwningPtr<cl_int> BufferInPtr;
|
||||
BufferOwningPtr<cl_int> BufferOutPtr;
|
||||
MTdataHolder d(gRandomSeed);
|
||||
const char *kernelName[] = { "test_pipe_write_error",
|
||||
"test_pipe_read_error" };
|
||||
|
||||
size_t min_alignment = get_min_alignment(context);
|
||||
size_t min_alignment = get_min_alignment(context);
|
||||
|
||||
global_work_size[0] = num_elements;
|
||||
|
||||
@@ -88,69 +91,36 @@ int test_pipe_readwrite_errors(cl_device_id deviceID, cl_context context, cl_com
|
||||
|
||||
inptr = (cl_int *)align_malloc(size, min_alignment);
|
||||
|
||||
for(i = 0; i < (cl_int)(size / sizeof(int)); i++){
|
||||
for (i = 0; i < num_elements; i++)
|
||||
{
|
||||
inptr[i] = (int)genrand_int32(d);
|
||||
}
|
||||
BufferInPtr.reset(inptr, nullptr, 0, size, true);
|
||||
|
||||
buffers[0] =
|
||||
clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, size, inptr, &err);
|
||||
test_error_ret(err, " clCreateBuffer failed", -1);
|
||||
|
||||
buffers[0] = clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, size, inptr, &err);
|
||||
if(err){
|
||||
clReleaseMemObject(buffers[0]);
|
||||
print_error(err, " clCreateBuffer failed\n");
|
||||
return -1;
|
||||
}
|
||||
outptr = align_malloc(size, min_alignment);
|
||||
BufferOutPtr.reset(outptr, nullptr, 0, size, true);
|
||||
|
||||
buffers[1] = clCreateBuffer(context, CL_MEM_USE_HOST_PTR, size, outptr, &err);
|
||||
if ( err ){
|
||||
clReleaseMemObject(buffers[0]);
|
||||
clReleaseMemObject(buffers[1]);
|
||||
align_free( outptr );
|
||||
print_error(err, " clCreateBuffer failed\n" );
|
||||
return -1;
|
||||
}
|
||||
test_error_ret(err, " clCreateBuffer failed", -1);
|
||||
|
||||
buffers[2] = clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, sizeof(int), &status, &err);
|
||||
if ( err ){
|
||||
clReleaseMemObject(buffers[0]);
|
||||
clReleaseMemObject(buffers[1]);
|
||||
clReleaseMemObject(buffers[2]);
|
||||
align_free( outptr );
|
||||
print_error(err, " clCreateBuffer failed\n" );
|
||||
return -1;
|
||||
}
|
||||
test_error_ret(err, " clCreateBuffer failed", -1);
|
||||
|
||||
//Pipe created with max_packets less than global size
|
||||
pipe = clCreatePipe(context, CL_MEM_HOST_NO_ACCESS, sizeof(int), num_elements - (num_elements/2), NULL, &err);
|
||||
if(err){
|
||||
clReleaseMemObject(buffers[0]);
|
||||
clReleaseMemObject(buffers[1]);
|
||||
clReleaseMemObject(buffers[2]);
|
||||
align_free( outptr );
|
||||
clReleaseMemObject(pipe);
|
||||
print_error(err, " clCreatePipe failed\n");
|
||||
return -1;
|
||||
}
|
||||
test_error_ret(err, " clCreatePipe failed", -1);
|
||||
|
||||
// Create producer kernel
|
||||
err = create_single_kernel_helper_with_build_options(context, &program, &kernel[0], 1, (const char**)&pipe_readwrite_errors_kernel_code, kernelName[0], "-cl-std=CL2.0");
|
||||
if(err){
|
||||
clReleaseMemObject(buffers[0]);
|
||||
clReleaseMemObject(buffers[1]);
|
||||
clReleaseMemObject(buffers[2]);
|
||||
clReleaseMemObject(pipe);
|
||||
align_free(outptr);
|
||||
print_error(err, "Error creating program\n");
|
||||
return -1;
|
||||
}
|
||||
test_error_ret(err, " Error creating program", -1);
|
||||
|
||||
//Create consumer kernel
|
||||
kernel[1] = clCreateKernel(program, kernelName[1], &err);
|
||||
if( kernel[1] == NULL || err != CL_SUCCESS)
|
||||
{
|
||||
clReleaseMemObject(buffers[0]);
|
||||
clReleaseMemObject(buffers[1]);
|
||||
clReleaseMemObject(buffers[2]);
|
||||
clReleaseMemObject(pipe);
|
||||
align_free(outptr);
|
||||
print_error(err, "Error creating kernel\n");
|
||||
return -1;
|
||||
}
|
||||
test_error_ret(err, " Error creating kernel", -1);
|
||||
|
||||
err = clSetKernelArg(kernel[0], 0, sizeof(cl_mem), (void*)&buffers[0]);
|
||||
err |= clSetKernelArg(kernel[0], 1, sizeof(cl_mem), (void*)&pipe);
|
||||
@@ -158,49 +128,15 @@ int test_pipe_readwrite_errors(cl_device_id deviceID, cl_context context, cl_com
|
||||
err |= clSetKernelArg(kernel[1], 0, sizeof(cl_mem), (void*)&pipe);
|
||||
err |= clSetKernelArg(kernel[1], 1, sizeof(cl_mem), (void*)&buffers[1]);
|
||||
err |= clSetKernelArg(kernel[1], 2, sizeof(cl_mem), (void*)&buffers[2]);
|
||||
if ( err != CL_SUCCESS ){
|
||||
clReleaseMemObject(buffers[0]);
|
||||
clReleaseMemObject(buffers[1]);
|
||||
clReleaseMemObject(buffers[2]);
|
||||
clReleaseMemObject(pipe);
|
||||
clReleaseKernel(kernel[0]);
|
||||
clReleaseKernel(kernel[1]);
|
||||
clReleaseProgram(program);
|
||||
align_free(outptr);
|
||||
print_error(err, " clSetKernelArg failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
test_error_ret(err, " clSetKernelArg failed", -1);
|
||||
|
||||
// Launch Consumer kernel for empty pipe
|
||||
err = clEnqueueNDRangeKernel( queue, kernel[1], 1, NULL, global_work_size, NULL, 0, NULL, &consumer_sync_event );
|
||||
if ( err != CL_SUCCESS ){
|
||||
print_error( err, " clEnqueueNDRangeKernel failed" );
|
||||
clReleaseMemObject(buffers[0]);
|
||||
clReleaseMemObject(buffers[1]);
|
||||
clReleaseMemObject(buffers[2]);
|
||||
clReleaseMemObject(pipe);
|
||||
clReleaseKernel(kernel[0]);
|
||||
clReleaseKernel(kernel[1]);
|
||||
clReleaseEvent(consumer_sync_event);
|
||||
clReleaseProgram(program);
|
||||
align_free(outptr);
|
||||
return -1;
|
||||
}
|
||||
test_error_ret(err, " clEnqueueNDRangeKernel failed", -1);
|
||||
|
||||
err = clEnqueueReadBuffer(queue, buffers[2], true, 0, sizeof(status), &status, 1, &consumer_sync_event, NULL);
|
||||
if ( err != CL_SUCCESS ){
|
||||
print_error( err, " clEnqueueReadBuffer failed" );
|
||||
clReleaseMemObject(buffers[0]);
|
||||
clReleaseMemObject(buffers[1]);
|
||||
clReleaseMemObject(buffers[2]);
|
||||
clReleaseMemObject(pipe);
|
||||
clReleaseKernel(kernel[0]);
|
||||
clReleaseKernel(kernel[1]);
|
||||
clReleaseEvent(consumer_sync_event);
|
||||
clReleaseProgram(program);
|
||||
align_free(outptr);
|
||||
return -1;
|
||||
}
|
||||
test_error_ret(err, " clEnqueueReadBuffer failed", -1);
|
||||
|
||||
if(status == 0){
|
||||
log_error("test_pipe_readwrite_errors failed\n");
|
||||
@@ -212,34 +148,13 @@ int test_pipe_readwrite_errors(cl_device_id deviceID, cl_context context, cl_com
|
||||
|
||||
// Launch Producer kernel
|
||||
err = clEnqueueNDRangeKernel( queue, kernel[0], 1, NULL, global_work_size, NULL, 0, NULL, &producer_sync_event );
|
||||
if ( err != CL_SUCCESS ){
|
||||
print_error( err, " clEnqueueNDRangeKernel failed" );
|
||||
clReleaseMemObject(buffers[0]);
|
||||
clReleaseMemObject(buffers[1]);
|
||||
clReleaseMemObject(buffers[2]);
|
||||
clReleaseMemObject(pipe);
|
||||
clReleaseKernel(kernel[0]);
|
||||
clReleaseKernel(kernel[1]);
|
||||
clReleaseProgram(program);
|
||||
align_free(outptr);
|
||||
return -1;
|
||||
}
|
||||
test_error_ret(err, " clEnqueueNDRangeKernel failed", -1);
|
||||
|
||||
err = clEnqueueReadBuffer(queue, buffers[2], true, 0, sizeof(status), &status, 1, &producer_sync_event, NULL);
|
||||
if ( err != CL_SUCCESS ){
|
||||
print_error( err, " clEnqueueReadBuffer failed" );
|
||||
clReleaseMemObject(buffers[0]);
|
||||
clReleaseMemObject(buffers[1]);
|
||||
clReleaseMemObject(buffers[2]);
|
||||
clReleaseMemObject(pipe);
|
||||
clReleaseKernel(kernel[0]);
|
||||
clReleaseKernel(kernel[1]);
|
||||
clReleaseProgram(program);
|
||||
align_free(outptr);
|
||||
return -1;
|
||||
}
|
||||
test_error_ret(err, " clEnqueueReadBuffer failed", -1);
|
||||
|
||||
if(status == 0){
|
||||
if (status == 0)
|
||||
{
|
||||
log_error("test_pipe_readwrite_errors failed\n");
|
||||
return -1;
|
||||
}
|
||||
@@ -247,66 +162,27 @@ int test_pipe_readwrite_errors(cl_device_id deviceID, cl_context context, cl_com
|
||||
status = 0;
|
||||
}
|
||||
|
||||
// We will reuse this variable so release the previous referred event.
|
||||
clReleaseEvent(consumer_sync_event);
|
||||
|
||||
// Launch Consumer kernel
|
||||
err = clEnqueueNDRangeKernel( queue, kernel[1], 1, NULL, global_work_size, NULL, 1, &producer_sync_event, &consumer_sync_event );
|
||||
if ( err != CL_SUCCESS ){
|
||||
print_error( err, " clEnqueueNDRangeKernel failed" );
|
||||
clReleaseMemObject(buffers[0]);
|
||||
clReleaseMemObject(buffers[1]);
|
||||
clReleaseMemObject(buffers[2]);
|
||||
clReleaseMemObject(pipe);
|
||||
clReleaseKernel(kernel[0]);
|
||||
clReleaseKernel(kernel[1]);
|
||||
clReleaseEvent(producer_sync_event);
|
||||
clReleaseEvent(consumer_sync_event);
|
||||
clReleaseProgram(program);
|
||||
align_free(outptr);
|
||||
return -1;
|
||||
}
|
||||
test_error_ret(err, " clEnqueueNDRangeKernel failed", -1);
|
||||
|
||||
err = clEnqueueReadBuffer(queue, buffers[2], true, 0, sizeof(status), &status, 1, &consumer_sync_event, NULL);
|
||||
if ( err != CL_SUCCESS ){
|
||||
print_error( err, " clEnqueueReadBuffer failed" );
|
||||
clReleaseMemObject(buffers[0]);
|
||||
clReleaseMemObject(buffers[1]);
|
||||
clReleaseMemObject(buffers[2]);
|
||||
clReleaseMemObject(pipe);
|
||||
clReleaseKernel(kernel[0]);
|
||||
clReleaseKernel(kernel[1]);
|
||||
clReleaseEvent(producer_sync_event);
|
||||
clReleaseEvent(consumer_sync_event);
|
||||
clReleaseProgram(program);
|
||||
align_free(outptr);
|
||||
return -1;
|
||||
}
|
||||
test_error_ret(err, " clEnqueueReadBuffer failed", -1);
|
||||
|
||||
if(status == 0)
|
||||
if (status == 0)
|
||||
{
|
||||
log_error("test_pipe_readwrite_errors failed\n");
|
||||
clReleaseMemObject(buffers[0]);
|
||||
clReleaseMemObject(buffers[1]);
|
||||
clReleaseMemObject(buffers[2]);
|
||||
clReleaseMemObject(pipe);
|
||||
clReleaseKernel(kernel[0]);
|
||||
clReleaseKernel(kernel[1]);
|
||||
clReleaseEvent(producer_sync_event);
|
||||
clReleaseEvent(consumer_sync_event);
|
||||
clReleaseProgram(program);
|
||||
align_free(outptr);
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
status = 0;
|
||||
}
|
||||
|
||||
log_info("test_pipe_readwrite_errors passed\n");
|
||||
//cleanup
|
||||
clReleaseMemObject(buffers[0]);
|
||||
clReleaseMemObject(buffers[1]);
|
||||
clReleaseMemObject(buffers[2]);
|
||||
clReleaseMemObject(pipe);
|
||||
clReleaseKernel(kernel[0]);
|
||||
clReleaseKernel(kernel[1]);
|
||||
clReleaseEvent(producer_sync_event);
|
||||
clReleaseEvent(consumer_sync_event);
|
||||
clReleaseProgram(program);
|
||||
align_free(outptr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user