diff --git a/stimBuffApis/livoxGen1/openClCollatingAndMeshingEngine.cpp b/stimBuffApis/livoxGen1/openClCollatingAndMeshingEngine.cpp index 024b90b..e365a68 100644 --- a/stimBuffApis/livoxGen1/openClCollatingAndMeshingEngine.cpp +++ b/stimBuffApis/livoxGen1/openClCollatingAndMeshingEngine.cpp @@ -906,35 +906,33 @@ bool OpenClCollatingAndMeshingEngine::unmapBuffer( } cl_int err; - cl_event unmapEvent = nullptr; + cl_event rawUnmapEvent = nullptr; err = clEnqueueUnmapMemObject( computeDevice->commandQueue, buffer, mappedPtr, - 0, nullptr, &unmapEvent); + 0, nullptr, &rawUnmapEvent); if (err != CL_SUCCESS) { std::cerr << __func__ << ": failed to unmap buffer: " << err << 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 - err = clWaitForEvents(1, &unmapEvent); + cl_event eventPtr = unmapEvent.get(); + err = clWaitForEvents(1, &eventPtr); if (err != CL_SUCCESS) { std::cerr << __func__ << ": failed to wait for unmap event: " << err << std::endl; - goto cleanup_unmapEvent; + return false; } - clReleaseEvent(unmapEvent); mappedPtr = nullptr; return true; - -cleanup_unmapEvent: - clReleaseEvent(unmapEvent); -cleanup: - return false; } bool OpenClCollatingAndMeshingEngine::mapAssemblyBuffer(cl_map_flags mapFlags) diff --git a/stimBuffApis/livoxGen1/openClCollatingAndMeshingEngine.h b/stimBuffApis/livoxGen1/openClCollatingAndMeshingEngine.h index e6978ef..8b933d7 100644 --- a/stimBuffApis/livoxGen1/openClCollatingAndMeshingEngine.h +++ b/stimBuffApis/livoxGen1/openClCollatingAndMeshingEngine.h @@ -40,11 +40,19 @@ struct ClKernelDeleter { if (kernel) { clReleaseKernel(kernel); } } }; +struct ClEventDeleter +{ + void operator()(cl_event event) const + { if (event) { clReleaseEvent(event); } } +}; + // Type aliases for OpenCL handle unique_ptrs using ClProgramPtr = std::unique_ptr< std::remove_pointer_t, ClProgramDeleter>; using ClKernelPtr = std::unique_ptr< std::remove_pointer_t, ClKernelDeleter>; +using ClEventPtr = std::unique_ptr< + std::remove_pointer_t, ClEventDeleter>; class PcloudStimulusProducer;