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/src/loadsave.jl b/src/loadsave.jl index e457a520..a5dd85dc 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,19 +17,21 @@ 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) + return Base.loaded_modules[_findmod(pkg)] end - m = _findmod(pkg) - m == nothing || return Base.loaded_modules[m] - topimport(pkg) - return Base.loaded_modules[_findmod(pkg)] end 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