Skip to content

Commit 2203de3

Browse files
authored
Implement try_close_finalizer, fix #1048 (#1049)
* Implement try_close_finalizer, do not wait for liblock, fix #1048
1 parent bbb6b26 commit 2203de3

File tree

4 files changed

+24
-10
lines changed

4 files changed

+24
-10
lines changed

src/api/api.jl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ else
1313
)
1414
end
1515

16-
const liblock = ReentrantLock()
17-
16+
include("lock.jl")
1817
include("types.jl")
1918
include("error.jl")
2019
include("functions.jl") # core API ccall wrappers

src/api/lock.jl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const liblock = ReentrantLock()
2+
3+
# Try to acquire the lock (test-test-set) and close if successful
4+
# Otherwise, defer finalization
5+
# https://github.com/JuliaIO/HDF5.jl/issues/1048
6+
function try_close_finalizer(x)
7+
if !islocked(liblock) && trylock(liblock) do
8+
close(x)
9+
true
10+
end
11+
else
12+
finalizer(try_close_finalizer, x)
13+
end
14+
return nothing
15+
end

src/properties.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ macro propertyclass(name, classid)
104104
id::API.hid_t
105105
function $name(id::API.hid_t)
106106
obj = new(id)
107-
finalizer(close, obj)
107+
finalizer(API.try_close_finalizer, obj)
108108
obj
109109
end
110110
end

src/types.jl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ mutable struct File <: H5DataStore
4141
function File(id, filename, toclose::Bool=true)
4242
f = new(id, filename)
4343
if toclose
44-
finalizer(close, f)
44+
finalizer(API.try_close_finalizer, f)
4545
end
4646
f
4747
end
@@ -55,7 +55,7 @@ mutable struct Group <: H5DataStore
5555

5656
function Group(id, file)
5757
g = new(id, file)
58-
finalizer(close, g)
58+
finalizer(API.try_close_finalizer, g)
5959
g
6060
end
6161
end
@@ -69,7 +69,7 @@ mutable struct Dataset
6969

7070
function Dataset(id, file, xfer=DatasetTransferProperties())
7171
dset = new(id, file, xfer)
72-
finalizer(close, dset)
72+
finalizer(API.try_close_finalizer, dset)
7373
dset
7474
end
7575
end
@@ -84,14 +84,14 @@ mutable struct Datatype
8484
function Datatype(id, toclose::Bool=true)
8585
nt = new(id, toclose)
8686
if toclose
87-
finalizer(close, nt)
87+
finalizer(API.try_close_finalizer, nt)
8888
end
8989
nt
9090
end
9191
function Datatype(id, file::File, toclose::Bool=true)
9292
nt = new(id, toclose, file)
9393
if toclose
94-
finalizer(close, nt)
94+
finalizer(API.try_close_finalizer, nt)
9595
end
9696
nt
9797
end
@@ -106,7 +106,7 @@ mutable struct Dataspace
106106

107107
function Dataspace(id)
108108
dspace = new(id)
109-
finalizer(close, dspace)
109+
finalizer(API.try_close_finalizer, dspace)
110110
dspace
111111
end
112112
end
@@ -119,7 +119,7 @@ mutable struct Attribute
119119

120120
function Attribute(id, file)
121121
dset = new(id, file)
122-
finalizer(close, dset)
122+
finalizer(API.try_close_finalizer, dset)
123123
dset
124124
end
125125
end

0 commit comments

Comments
 (0)