OClCollMeshEng: Use RAII for unmapBuffer() event destruction

This commit is contained in:
2025-12-07 19:29:20 -04:00
parent 702855a27d
commit 7167cea62c
2 changed files with 17 additions and 11 deletions
@@ -906,35 +906,33 @@ bool OpenClCollatingAndMeshingEngine::unmapBuffer(
} }
cl_int err; cl_int err;
cl_event unmapEvent = nullptr; cl_event rawUnmapEvent = nullptr;
err = clEnqueueUnmapMemObject( err = clEnqueueUnmapMemObject(
computeDevice->commandQueue, buffer, mappedPtr, computeDevice->commandQueue, buffer, mappedPtr,
0, nullptr, &unmapEvent); 0, nullptr, &rawUnmapEvent);
if (err != CL_SUCCESS) if (err != CL_SUCCESS)
{ {
std::cerr << __func__ << ": failed to unmap buffer: " << err std::cerr << __func__ << ": failed to unmap buffer: " << err
<< std::endl; << std::endl;
goto cleanup; return false;
} }
// Wrap event in unique_ptr for automatic cleanup
ClEventPtr unmapEvent(rawUnmapEvent);
// Wait for unmap to complete and release the event // Wait for unmap to complete and release the event
err = clWaitForEvents(1, &unmapEvent); cl_event eventPtr = unmapEvent.get();
err = clWaitForEvents(1, &eventPtr);
if (err != CL_SUCCESS) if (err != CL_SUCCESS)
{ {
std::cerr << __func__ << ": failed to wait for unmap event: " << err std::cerr << __func__ << ": failed to wait for unmap event: " << err
<< std::endl; << std::endl;
goto cleanup_unmapEvent; return false;
} }
clReleaseEvent(unmapEvent);
mappedPtr = nullptr; mappedPtr = nullptr;
return true; return true;
cleanup_unmapEvent:
clReleaseEvent(unmapEvent);
cleanup:
return false;
} }
bool OpenClCollatingAndMeshingEngine::mapAssemblyBuffer(cl_map_flags mapFlags) bool OpenClCollatingAndMeshingEngine::mapAssemblyBuffer(cl_map_flags mapFlags)
@@ -40,11 +40,19 @@ struct ClKernelDeleter
{ if (kernel) { clReleaseKernel(kernel); } } { if (kernel) { clReleaseKernel(kernel); } }
}; };
struct ClEventDeleter
{
void operator()(cl_event event) const
{ if (event) { clReleaseEvent(event); } }
};
// Type aliases for OpenCL handle unique_ptrs // Type aliases for OpenCL handle unique_ptrs
using ClProgramPtr = std::unique_ptr< using ClProgramPtr = std::unique_ptr<
std::remove_pointer_t<cl_program>, ClProgramDeleter>; std::remove_pointer_t<cl_program>, ClProgramDeleter>;
using ClKernelPtr = std::unique_ptr< using ClKernelPtr = std::unique_ptr<
std::remove_pointer_t<cl_kernel>, ClKernelDeleter>; std::remove_pointer_t<cl_kernel>, ClKernelDeleter>;
using ClEventPtr = std::unique_ptr<
std::remove_pointer_t<cl_event>, ClEventDeleter>;
class PcloudStimulusProducer; class PcloudStimulusProducer;