Kaynağa Gözat

fix leaking ets tables caused by digraphs

pull/720/head
pvmart 9 yıl önce
ebeveyn
işleme
278c0bdfa5
3 değiştirilmiş dosya ile 22 ekleme ve 15 silme
  1. +17
    -14
      src/rebar_digraph.erl
  2. +4
    -1
      src/rebar_erlc_compiler.erl
  3. +1
    -0
      src/rebar_prv_update.erl

+ 17
- 14
src/rebar_digraph.erl Dosyayı Görüntüle

@ -16,20 +16,23 @@ compile_order(Apps) ->
Deps = all_apps_deps(App),
add(Graph, {Name, Deps})
end, Apps),
case digraph_utils:topsort(Graph) of
false ->
case digraph_utils:is_acyclic(Graph) of
true ->
{error, no_sort};
false ->
Cycles = lists:sort(
[lists:sort(Comp) || Comp <- digraph_utils:strong_components(Graph),
length(Comp)>1]),
{error, {cycles, Cycles}}
end;
V ->
{ok, names_to_apps(lists:reverse(V), Apps)}
end.
Order =
case digraph_utils:topsort(Graph) of
false ->
case digraph_utils:is_acyclic(Graph) of
true ->
{error, no_sort};
false ->
Cycles = lists:sort(
[lists:sort(Comp) || Comp <- digraph_utils:strong_components(Graph),
length(Comp)>1]),
{error, {cycles, Cycles}}
end;
V ->
{ok, names_to_apps(lists:reverse(V), Apps)}
end,
true = digraph:delete(Graph),
Order.
add(Graph, {PkgName, Deps}) ->
case digraph:vertex(Graph, PkgName) of

+ 4
- 1
src/rebar_erlc_compiler.erl Dosyayı Görüntüle

@ -165,7 +165,8 @@ doterl_compile(Config, Dir, OutDir, MoreSources, ErlOpts) ->
{DepErls, OtherErls} = lists:partition(
fun(Source) -> digraph:in_degree(G, Source) > 0 end,
[File || File <- NeededErlFiles, not lists:member(File, ErlFirstFiles)]),
DepErlsOrdered = digraph_utils:topsort(digraph_utils:subgraph(G, DepErls)),
SubGraph = digraph_utils:subgraph(G, DepErls),
DepErlsOrdered = digraph_utils:topsort(SubGraph),
FirstErls = ErlFirstFiles ++ lists:reverse(DepErlsOrdered),
?DEBUG("Files to compile first: ~p", [FirstErls]),
rebar_base_compiler:run(
@ -177,6 +178,8 @@ doterl_compile(Config, Dir, OutDir, MoreSources, ErlOpts) ->
end,
internal_erl_compile(C, Dir, S, OutDir1, ErlOpts1)
end),
true = digraph:delete(SubGraph),
true = digraph:delete(G),
ok.
%% Get files which need to be compiled first, i.e. those specified in erl_first_files

+ 1
- 0
src/rebar_prv_update.erl Dosyayı Görüntüle

@ -59,6 +59,7 @@ do(State) ->
ok = file:write_file(HexFile, Unzipped),
{Dict, Graph} = hex_to_graph(HexFile),
write_registry(Dict, Graph, State),
true = digraph:delete(Graph),
ok
catch
_E:C ->

Yükleniyor…
İptal
Kaydet