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) {
|
||||
piCout << "[PIOpenCL::Context]"
|
||||
<< "clCreateCommandQueue error" << ret;
|
||||
clReleaseContext(con);
|
||||
return 0;
|
||||
}
|
||||
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,
|
||||
PRIVATE->buffer,
|
||||
CL_TRUE,
|
||||
elements_from_offset * def.size(),
|
||||
elements_from_offset * def.size(),
|
||||
elements_count * def.size(),
|
||||
data,
|
||||
0,
|
||||
@@ -484,22 +485,22 @@ void PIOpenCL::Buffer::copy(Buffer * buffer_from,
|
||||
int elements_count,
|
||||
int elements_from_offset,
|
||||
int elements_to_offset) {
|
||||
if (!buffer_from || !buffer_to) return;
|
||||
if (!buffer_from->PRIVATEWB->buffer || !buffer_to->PRIVATEWB->buffer) return;
|
||||
if (elements_count < 0) elements_count = piMini(buffer_from->elements, buffer_to->elements);
|
||||
cl_int ret = clEnqueueCopyBuffer(buffer_from->context_->PRIVATEWB->queue,
|
||||
buffer_from->PRIVATEWB->buffer,
|
||||
buffer_to->PRIVATEWB->buffer,
|
||||
elements_from_offset * buffer_from->def.size(),
|
||||
elements_to_offset * buffer_to->def.size(),
|
||||
elements_count * buffer_from->def.size(),
|
||||
0,
|
||||
nullptr,
|
||||
nullptr);
|
||||
if (ret != 0) {
|
||||
piCout << "[PIOpenCL::Buffer]"
|
||||
<< "clEnqueueCopyBuffer error" << ret;
|
||||
}
|
||||
if (!buffer_from || !buffer_to) return;
|
||||
if (!buffer_from->PRIVATEWB->buffer || !buffer_to->PRIVATEWB->buffer) return;
|
||||
if (elements_count < 0) elements_count = piMini(buffer_from->elements, buffer_to->elements);
|
||||
cl_int ret = clEnqueueCopyBuffer(buffer_from->context_->PRIVATEWB->queue,
|
||||
buffer_from->PRIVATEWB->buffer,
|
||||
buffer_to->PRIVATEWB->buffer,
|
||||
elements_from_offset * buffer_from->def.size(),
|
||||
elements_to_offset * buffer_to->def.size(),
|
||||
elements_count * buffer_from->def.size(),
|
||||
0,
|
||||
nullptr,
|
||||
nullptr);
|
||||
if (ret != 0) {
|
||||
piCout << "[PIOpenCL::Buffer]"
|
||||
<< "clEnqueueCopyBuffer error" << ret;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user