From 0632e01f44acc8efe11d14fc5b2b45faffc86195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Mon, 1 Oct 2012 23:04:37 -0700 Subject: [PATCH] Use references instead of relying on file names --- lib/elixir/lib/code.ex | 17 +++++---- lib/elixir/src/elixir_code_server.erl | 51 ++++++++++++--------------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/lib/elixir/lib/code.ex b/lib/elixir/lib/code.ex index ff11b8e857..c863fb7984 100644 --- a/lib/elixir/lib/code.ex +++ b/lib/elixir/lib/code.ex @@ -24,7 +24,7 @@ defmodule Code do allowing it to be required again. """ def unload_files(files) do - server_call { :unload_files, files } + server_cast { :unload_files, files } end @doc """ @@ -175,7 +175,7 @@ defmodule Code do file = find_file(file, relative_to) server_call { :acquire, file } loaded = Erlang.elixir_compiler.file file - server_call { :loaded, file } + server_cast { :loaded, file } loaded end @@ -196,12 +196,13 @@ defmodule Code do file = find_file(file, relative_to) case server_call({ :acquire, file }) do - :loaded -> nil - :queued -> - receive do { :elixir_code_server, ^file, :loaded } -> nil end + :loaded -> + nil + { :queued, ref } -> + receive do { :elixir_code_server, ^ref, :loaded } -> nil end :proceed -> loaded = Erlang.elixir_compiler.file file - server_call { :loaded, file } + server_cast { :loaded, file } loaded end end @@ -361,4 +362,8 @@ defmodule Code do defp server_call(args) do Erlang.gen_server.call(:elixir_code_server, args) end + + defp server_cast(args) do + Erlang.gen_server.cast(:elixir_code_server, args) + end end diff --git a/lib/elixir/src/elixir_code_server.erl b/lib/elixir/src/elixir_code_server.erl index b4ca587eb8..7f6230eb61 100644 --- a/lib/elixir/src/elixir_code_server.erl +++ b/lib/elixir/src/elixir_code_server.erl @@ -21,38 +21,14 @@ handle_call({ acquire, Path }, From, Config) -> case orddict:find(Path, Current) of { ok, true } -> { reply, loaded, Config }; - { ok, List } when is_list(List) -> - Queued = orddict:store(Path, [From|List], Current), - { reply, queued, Config#elixir_code_server{loaded=Queued} }; + { ok, { Ref, List } } when is_list(List), is_reference(Ref) -> + Queued = orddict:store(Path, { Ref, [From|List] }, Current), + { reply, { queued, Ref }, Config#elixir_code_server{loaded=Queued} }; error -> - Queued = orddict:store(Path, [], Current), + Queued = orddict:store(Path, { make_ref(), [] }, Current), { reply, proceed, Config#elixir_code_server{loaded=Queued} } end; -handle_call({ loaded, Path }, _From, Config) -> - Current = Config#elixir_code_server.loaded, - case orddict:find(Path, Current) of - { ok, true } -> - { reply, ok, Config }; - { ok, List } when is_list(List) -> - [Pid ! { elixir_code_server, Path, loaded } || { Pid, _Tag } <- lists:reverse(List)], - Done = orddict:store(Path, true, Current), - { reply, ok, Config#elixir_code_server{loaded=Done} }; - error -> - Done = orddict:store(Path, true, Current), - { reply, ok, Config#elixir_code_server{loaded=Done} } - end; - -handle_call({ unload_files, Files }, _From, Config) -> - Current = Config#elixir_code_server.loaded, - Unloaded = lists:foldl(fun(File, Acc) -> - case orddict:find(File, Acc) of - { ok, true } -> orddict:erase(File, Acc); - _ -> Acc - end - end, Current, Files), - { reply, ok, Config#elixir_code_server{loaded=Unloaded} }; - handle_call({ at_exit, AtExit }, _From, Config) -> { reply, ok, Config#elixir_code_server{at_exit=[AtExit|Config#elixir_code_server.at_exit]} }; @@ -78,6 +54,25 @@ handle_call(compiler_options, _From, Config) -> handle_call(_Request, _From, Config) -> { reply, undef, Config }. +handle_cast({ loaded, Path }, Config) -> + Current = Config#elixir_code_server.loaded, + case orddict:find(Path, Current) of + { ok, true } -> + { noreply, Config }; + { ok, { Ref, List } } when is_list(List), is_reference(Ref) -> + [Pid ! { elixir_code_server, Ref, loaded } || { Pid, _Tag } <- lists:reverse(List)], + Done = orddict:store(Path, true, Current), + { noreply, Config#elixir_code_server{loaded=Done} }; + error -> + Done = orddict:store(Path, true, Current), + { noreply, Config#elixir_code_server{loaded=Done} } + end; + +handle_cast({ unload_files, Files }, Config) -> + Current = Config#elixir_code_server.loaded, + Unloaded = lists:foldl(fun(File, Acc) -> orddict:erase(File, Acc) end, Current, Files), + { noreply, Config#elixir_code_server{loaded=Unloaded} }; + handle_cast(_Request, Config) -> { noreply, Config }.