From 6478ecd2aeba5221cfc57ad2c17030c0c78c3b19 Mon Sep 17 00:00:00 2001 From: Ian Date: Sat, 24 Oct 2020 08:32:47 -0400 Subject: [PATCH 1/3] do checked_import sequentially --- src/loadsave.jl | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/loadsave.jl b/src/loadsave.jl index e457a520..db7a35cf 100644 --- a/src/loadsave.jl +++ b/src/loadsave.jl @@ -1,5 +1,6 @@ const sym2loader = Dict{Symbol,Vector{Symbol}}() const sym2saver = Dict{Symbol,Vector{Symbol}}() +const load_locker = Base.ReentrantLock() is_installed(pkg::Symbol) = get(Pkg.installed(), string(pkg), nothing) != nothing @@ -16,18 +17,20 @@ function topimport(modname) end function checked_import(pkg::Symbol) - # kludge for test suite - if isdefined(Main, pkg) - m1 = getfield(Main, pkg) - isa(m1, Module) && return m1 - end - if isdefined(FileIO, pkg) - m1 = getfield(FileIO, pkg) - isa(m1, Module) && return m1 + lock(load_locker) do + # kludge for test suite + if isdefined(Main, pkg) + m1 = getfield(Main, pkg) + isa(m1, Module) && return m1 + end + if isdefined(FileIO, pkg) + m1 = getfield(FileIO, pkg) + isa(m1, Module) && return m1 + end + m = _findmod(pkg) + m == nothing || return Base.loaded_modules[m] + topimport(pkg) end - m = _findmod(pkg) - m == nothing || return Base.loaded_modules[m] - topimport(pkg) return Base.loaded_modules[_findmod(pkg)] end From f4ee837739f86d794a895fde285d0991d14f7db9 Mon Sep 17 00:00:00 2001 From: Ian Date: Sat, 24 Oct 2020 08:44:33 -0400 Subject: [PATCH 2/3] bring return into lock --- src/loadsave.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/loadsave.jl b/src/loadsave.jl index db7a35cf..a5dd85dc 100644 --- a/src/loadsave.jl +++ b/src/loadsave.jl @@ -30,8 +30,8 @@ function checked_import(pkg::Symbol) m = _findmod(pkg) m == nothing || return Base.loaded_modules[m] topimport(pkg) + return Base.loaded_modules[_findmod(pkg)] end - return Base.loaded_modules[_findmod(pkg)] end From c292520802c7f995458a32406d9944c2343b9b5d Mon Sep 17 00:00:00 2001 From: Ian Date: Sat, 24 Oct 2020 11:16:51 -0400 Subject: [PATCH 3/3] add multithreaded save test --- .appveyor.yml | 1 + .travis.yml | 2 ++ test/loadsave.jl | 7 +++++++ test/runtests.jl | 2 ++ 4 files changed, 12 insertions(+) diff --git a/.appveyor.yml b/.appveyor.yml index ffa0eb5f..6e6cf9ec 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -1,4 +1,5 @@ environment: + JULIA_NUM_THREADS: 2 matrix: - julia_version: 0.7 - julia_version: 1.0 diff --git a/.travis.yml b/.travis.yml index 48ad8cd9..b05a4d61 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,8 @@ julia: - 1.0 - 1 - nightly +env: + - JULIA_NUM_THREADS=2 matrix: allow_failures: - julia: nightly diff --git a/test/loadsave.jl b/test/loadsave.jl index 7c85967a..d4dbd2dd 100644 --- a/test/loadsave.jl +++ b/test/loadsave.jl @@ -255,6 +255,13 @@ end # module Dummy @test load(fn) == a rm(fn) + if Threads.nthreads() > 1 + Threads.@threads for i in 1:(Threads.nthreads() * 5) + fn = string(tempname(), ".dmy") + save(fn, a) + end + end + # force format fn = string(tempname(), ".dmy") savestreaming(format"DUMMY", fn) do writer diff --git a/test/runtests.jl b/test/runtests.jl index aa39fb21..b8adb3bc 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -2,6 +2,8 @@ using FileIO using FilePathsBase using Test +Threads.nthreads() <= 1 && @info "Threads.nthreads() = $(Threads.nthreads()), multithread tests will be disabled" + # Both FileIO and FilePathsBase export filename, but we only want the FileIO definition. using FileIO: filename