fix(piopencl): release context on command queue creation failure
If clCreateContext succeeded but clCreateCommandQueue failed, the context handle was returned without being released, leaking the OpenCL context and all associated GPU resources.
This commit is contained in:
+18
-17
@@ -213,6 +213,7 @@ PIOpenCL::Context * PIOpenCL::Context::create(const PIOpenCL::DeviceList & dl) {
|
|||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
piCout << "[PIOpenCL::Context]"
|
piCout << "[PIOpenCL::Context]"
|
||||||
<< "clCreateCommandQueue error" << ret;
|
<< "clCreateCommandQueue error" << ret;
|
||||||
|
clReleaseContext(con);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
piCout << "create done for" << dl[0].name;
|
piCout << "create done for" << dl[0].name;
|
||||||
@@ -461,7 +462,7 @@ void PIOpenCL::Buffer::copyFrom(void * data, int elements_count, int elements_fr
|
|||||||
cl_int ret = clEnqueueWriteBuffer(context_->PRIVATEWB->queue,
|
cl_int ret = clEnqueueWriteBuffer(context_->PRIVATEWB->queue,
|
||||||
PRIVATE->buffer,
|
PRIVATE->buffer,
|
||||||
CL_TRUE,
|
CL_TRUE,
|
||||||
elements_from_offset * def.size(),
|
elements_from_offset * def.size(),
|
||||||
elements_count * def.size(),
|
elements_count * def.size(),
|
||||||
data,
|
data,
|
||||||
0,
|
0,
|
||||||
@@ -484,22 +485,22 @@ void PIOpenCL::Buffer::copy(Buffer * buffer_from,
|
|||||||
int elements_count,
|
int elements_count,
|
||||||
int elements_from_offset,
|
int elements_from_offset,
|
||||||
int elements_to_offset) {
|
int elements_to_offset) {
|
||||||
if (!buffer_from || !buffer_to) return;
|
if (!buffer_from || !buffer_to) return;
|
||||||
if (!buffer_from->PRIVATEWB->buffer || !buffer_to->PRIVATEWB->buffer) return;
|
if (!buffer_from->PRIVATEWB->buffer || !buffer_to->PRIVATEWB->buffer) return;
|
||||||
if (elements_count < 0) elements_count = piMini(buffer_from->elements, buffer_to->elements);
|
if (elements_count < 0) elements_count = piMini(buffer_from->elements, buffer_to->elements);
|
||||||
cl_int ret = clEnqueueCopyBuffer(buffer_from->context_->PRIVATEWB->queue,
|
cl_int ret = clEnqueueCopyBuffer(buffer_from->context_->PRIVATEWB->queue,
|
||||||
buffer_from->PRIVATEWB->buffer,
|
buffer_from->PRIVATEWB->buffer,
|
||||||
buffer_to->PRIVATEWB->buffer,
|
buffer_to->PRIVATEWB->buffer,
|
||||||
elements_from_offset * buffer_from->def.size(),
|
elements_from_offset * buffer_from->def.size(),
|
||||||
elements_to_offset * buffer_to->def.size(),
|
elements_to_offset * buffer_to->def.size(),
|
||||||
elements_count * buffer_from->def.size(),
|
elements_count * buffer_from->def.size(),
|
||||||
0,
|
0,
|
||||||
nullptr,
|
nullptr,
|
||||||
nullptr);
|
nullptr);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
piCout << "[PIOpenCL::Buffer]"
|
piCout << "[PIOpenCL::Buffer]"
|
||||||
<< "clEnqueueCopyBuffer error" << ret;
|
<< "clEnqueueCopyBuffer error" << ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user