/usr/share/julia/base/require.jl is in julia-common 0.4.7-6.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | # This file is a part of Julia. License is MIT: http://julialang.org/license
# deprecated require
module OldRequire
function find_in_path(name::AbstractString)
isabspath(name) && return name
isfile(name) && return abspath(name)
base = name
if endswith(name,".jl")
base = name[1:end-3]
else
name = string(base,".jl")
isfile(name) && return abspath(name)
end
for prefix in [Pkg.dir(); LOAD_PATH]
path = joinpath(prefix, name)
isfile(path) && return abspath(path)
path = joinpath(prefix, base, "src", name)
isfile(path) && return abspath(path)
path = joinpath(prefix, name, "src", name)
isfile(path) && return abspath(path)
end
return nothing
end
find_in_node1_path(name) = myid()==1 ?
find_in_path(name) : remotecall_fetch(1, find_in_path, name)
# Store list of files and their load time
package_list = (ByteString=>Float64)[]
# to synchronize multiple tasks trying to require something
package_locks = (ByteString=>Any)[]
# only broadcast top-level (not nested) requires and reloads
toplevel_load = true
require(fname::AbstractString) = require(bytestring(fname))
require(f::AbstractString, fs::AbstractString...) = (require(f); for x in fs require(x); end)
function require(name::ByteString)
path = find_in_node1_path(name)
path == nothing && error("$name not found")
if myid() == 1 && toplevel_load
refs = { @spawnat p _require(path) for p in filter(x->x!=1, procs()) }
_require(path)
for r in refs; wait(r); end
else
_require(path)
end
nothing
end
function _require(path)
global toplevel_load
if haskey(package_list,path)
wait(package_locks[path])
else
last = toplevel_load
toplevel_load = false
try
reload_path(path)
finally
toplevel_load = last
end
end
end
# remote/parallel load
function source_path(default::Union{AbstractString,Void}="")
t = current_task()
while true
s = t.storage
if !is(s, nothing) && haskey(s, :SOURCE_PATH)
return s[:SOURCE_PATH]
end
if is(t, t.parent)
return default
end
t = t.parent
end
end
function include_from_node1(path::AbstractString)
prev = source_path(nothing)
path = (prev == nothing) ? abspath(path) : joinpath(dirname(prev),path)
tls = task_local_storage()
tls[:SOURCE_PATH] = path
local result
try
if myid()==1
# sleep a bit to process file requests from other nodes
nprocs()>1 && sleep(0.005)
result = Core.include(path)
nprocs()>1 && sleep(0.005)
else
result = include_string(remotecall_fetch(1, readall, path), path)
end
finally
if prev == nothing
delete!(tls, :SOURCE_PATH)
else
tls[:SOURCE_PATH] = prev
end
end
result
end
function reload_path(path::AbstractString)
had = haskey(package_list, path)
if !had
package_locks[path] = RemoteRef()
end
package_list[path] = time()
tls = task_local_storage()
prev = pop!(tls, :SOURCE_PATH, nothing)
try
eval(Main, :(Base.include_from_node1($path)))
catch e
had || delete!(package_list, path)
rethrow(e)
finally
if prev != nothing
tls[:SOURCE_PATH] = prev
end
end
if !isready(package_locks[path])
put!(package_locks[path],nothing)
end
nothing
end
end # module
|