From 3978f0a525c299aba40b3d1968fcb1b02ece90eb Mon Sep 17 00:00:00 2001 From: Robert Buessow Date: Tue, 26 May 2026 11:41:10 +0000 Subject: [PATCH 1/2] Remove CDataHandle finalizer and leak counter Co-Authored-By: Claude Sonnet 4.6 --- src/cdatainterface.jl | 24 +----------------------- test/cdatainterface.jl | 38 -------------------------------------- 2 files changed, 1 insertion(+), 61 deletions(-) diff --git a/src/cdatainterface.jl b/src/cdatainterface.jl index 3f376856..3c2938e4 100644 --- a/src/cdatainterface.jl +++ b/src/cdatainterface.jl @@ -77,8 +77,6 @@ const CDATA_FLAG_MAP_KEYS_SORTED = Int64(4) Holds C-side pointers for an imported Arrow C Data Interface pair. Call `Arrow.release_c_data` to release C resources explicitly. -If the handle is garbage-collected without being released, an error is logged -and `Arrow.UNRELEASED_HANDLE_COUNT` is incremented. """ mutable struct CDataHandle schema_ptr::Ptr{ArrowSchema} @@ -86,27 +84,7 @@ mutable struct CDataHandle released::Bool end -# Counts CDataHandles that were GC'd without an explicit release_c_data call. -const UNRELEASED_HANDLE_COUNT = Threads.Atomic{Int}(0) - -function _warn_unreleased(h::CDataHandle) - h.released && return - Threads.atomic_add!(UNRELEASED_HANDLE_COUNT, 1) - # Use jl_safe_printf since task switches are forbidden in finalizers. - ccall( - :jl_safe_printf, - Cvoid, - (Cstring,), - "Arrow.CDataHandle GC'd without explicit release_c_data — resource leak detected\n", - ) - _release_cdata_handle(h) -end - -function CDataHandle(sp::Ptr{ArrowSchema}, ap::Ptr{ArrowArray}) - h = CDataHandle(sp, ap, false) - finalizer(_warn_unreleased, h) - return h -end +CDataHandle(sp::Ptr{ArrowSchema}, ap::Ptr{ArrowArray}) = CDataHandle(sp, ap, false) function _release_cdata_handle(h::CDataHandle) h.released && return diff --git a/test/cdatainterface.jl b/test/cdatainterface.jl index 319f4366..ffcafc4c 100644 --- a/test/cdatainterface.jl +++ b/test/cdatainterface.jl @@ -15,8 +15,6 @@ # limitations under the License. @testset "Arrow C Data Interface" begin - _initial_count = Arrow.UNRELEASED_HANDLE_COUNT[] - @testset "struct sizes" begin @test sizeof(Arrow.ArrowSchema) == 9 * 8 @test sizeof(Arrow.ArrowArray) == 10 * 8 @@ -756,36 +754,6 @@ end end - # ── Finalizer / leak counter ────────────────────────────────────────────── - - @testset "finalizer: increments leak counter when not released" begin - before = Arrow.UNRELEASED_HANDLE_COUNT[] - redirect_stderr(devnull) do - let - av = to_arrow(Int32[1, 2, 3]) - s_ref, a_ref = Arrow.to_c_data(av) - Arrow.from_c_data(_cptr(s_ref), _cptr(a_ref)) - # CImportedArray and its CDataHandle go out of scope here - end - GC.gc(true) - GC.gc(true) - end - @test Arrow.UNRELEASED_HANDLE_COUNT[] == before + 1 - end - - @testset "finalizer: does NOT increment counter when released explicitly" begin - before = Arrow.UNRELEASED_HANDLE_COUNT[] - let - av = to_arrow(Int32[1, 2, 3]) - s_ref, a_ref = Arrow.to_c_data(av) - col = Arrow.from_c_data(_cptr(s_ref), _cptr(a_ref)) - Arrow.release_c_data(col) - end - GC.gc(true) - GC.gc(true) - @test Arrow.UNRELEASED_HANDLE_COUNT[] == before - end - # ── Empty arrays ───────────────────────────────────────────────────────── @testset "round-trip: empty Int32 array" begin @@ -829,10 +797,4 @@ @test isequal(collect(imported), data) Arrow.release_c_data(imported) end - - @testset "no unexpected resource leaks" begin - GC.gc(true) - GC.gc(true) - @test Arrow.UNRELEASED_HANDLE_COUNT[] == _initial_count + 1 # +1 for the intentional leak test - end end # @testset "Arrow C Data Interface" From c8ac0d27b3ca6fe17a4b40952c05ec20b3bdbdcc Mon Sep 17 00:00:00 2001 From: Robert Buessow Date: Tue, 26 May 2026 11:41:27 +0000 Subject: [PATCH 2/2] bumb version --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index b87ff796..a2928b83 100644 --- a/Project.toml +++ b/Project.toml @@ -17,7 +17,7 @@ name = "Arrow" uuid = "69666777-d1a9-59fb-9406-91d4454c9d45" authors = ["quinnj "] -version = "2.8.1" +version = "2.9.0" [deps] ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd"