aboutsummaryrefslogtreecommitdiffstats
path: root/lib/dialyzer/src/dialyzer_succ_typings.erl
diff options
context:
space:
mode:
authorStavros Aronis <[email protected]>2012-02-20 15:54:43 +0100
committerHenrik Nord <[email protected]>2012-05-21 15:31:19 +0200
commit009710cec5e8b9786a5219dc3f682d6010352160 (patch)
treedb8ad51ffea3f8287b36cc6e531e8495ccfe0b55 /lib/dialyzer/src/dialyzer_succ_typings.erl
parent60e682897f98d9374b96c6324759f302170b2a17 (diff)
downloadotp-009710cec5e8b9786a5219dc3f682d6010352160.tar.gz
otp-009710cec5e8b9786a5219dc3f682d6010352160.tar.bz2
otp-009710cec5e8b9786a5219dc3f682d6010352160.zip
Parallel warning generation
Diffstat (limited to 'lib/dialyzer/src/dialyzer_succ_typings.erl')
-rw-r--r--lib/dialyzer/src/dialyzer_succ_typings.erl45
1 files changed, 27 insertions, 18 deletions
diff --git a/lib/dialyzer/src/dialyzer_succ_typings.erl b/lib/dialyzer/src/dialyzer_succ_typings.erl
index e901677ce2..fbd333f905 100644
--- a/lib/dialyzer/src/dialyzer_succ_typings.erl
+++ b/lib/dialyzer/src/dialyzer_succ_typings.erl
@@ -38,10 +38,11 @@
collect_scc_data/2,
collect_refine_scc_data/2,
find_required_by/2,
- find_depends_on/2
+ find_depends_on/2,
+ collect_warnings/2
]).
--export_type([servers/0, scc_data/0, scc_refine_data/0]).
+-export_type([servers/0, scc_data/0, scc_refine_data/0, warning_servers/0]).
%%-define(DEBUG, true).
@@ -128,20 +129,31 @@ get_warnings(Callgraph, Plt, DocPlt, Codeserver, NoWarnUnused, Parent) ->
init_state_and_get_success_typings(Callgraph, Plt, Codeserver, Parent),
NewState = InitState#st{no_warn_unused = NoWarnUnused},
Mods = dialyzer_callgraph:modules(NewState#st.callgraph),
- CWarns = dialyzer_contracts:get_invalid_contract_warnings(Mods, Codeserver,
- NewState#st.plt),
+ MiniPlt = NewState#st.plt,
+ CWarns =
+ dialyzer_contracts:get_invalid_contract_warnings(Mods, Codeserver, MiniPlt),
MiniDocPlt = dialyzer_plt:get_mini_plt(DocPlt),
- {Warnings, FinalPlt, FinalDocPlt} =
- ?timing("warning",
- get_warnings_from_modules(Mods, NewState, MiniDocPlt, CWarns)),
- {postprocess_warnings(Warnings, Codeserver),
- dialyzer_plt:restore_full_plt(FinalPlt, Plt),
- dialyzer_plt:restore_full_plt(FinalDocPlt, DocPlt)}.
-
-get_warnings_from_modules([M|Ms], State, DocPlt, Acc) when is_atom(M) ->
- send_log(State#st.parent, io_lib:format("Getting warnings for ~w\n", [M])),
+ ModWarns =
+ ?timing("warning", get_warnings_from_modules(Mods, NewState, MiniDocPlt)),
+ {postprocess_warnings(CWarns ++ ModWarns, Codeserver),
+ dialyzer_plt:restore_full_plt(MiniPlt, Plt),
+ dialyzer_plt:restore_full_plt(MiniDocPlt, DocPlt)}.
+
+get_warnings_from_modules(Mods, State, DocPlt) ->
#st{callgraph = Callgraph, codeserver = Codeserver,
no_warn_unused = NoWarnUnused, plt = Plt} = State,
+ Servers = {Callgraph, Codeserver, NoWarnUnused, Plt, DocPlt},
+ Coordinator = dialyzer_coordinator:start('warnings', Servers),
+ Spawner = fun(M) -> dialyzer_coordinator:scc_spawn(M, Coordinator) end,
+ lists:foreach(Spawner, Mods),
+ dialyzer_coordinator:all_spawned(Coordinator),
+ dialyzer_coordinator:receive_warnings().
+
+-type warning_servers() :: term().
+
+-spec collect_warnings(module(), warning_servers()) -> [dial_warning()].
+
+collect_warnings(M, {Callgraph, Codeserver, NoWarnUnused, Plt, DocPlt}) ->
ModCode = dialyzer_codeserver:lookup_mod_code(M, Codeserver),
Records = dialyzer_codeserver:lookup_mod_records(M, Codeserver),
Contracts = dialyzer_codeserver:lookup_mod_contracts(M, Codeserver),
@@ -154,11 +166,8 @@ get_warnings_from_modules([M|Ms], State, DocPlt, Acc) when is_atom(M) ->
Records, NoWarnUnused),
Attrs = cerl:module_attrs(ModCode),
Warnings3 = dialyzer_behaviours:check_callbacks(M, Attrs, Plt, Codeserver),
- NewDocPlt = insert_into_doc_plt(FunTypes, Callgraph, DocPlt),
- get_warnings_from_modules(Ms, State, NewDocPlt,
- [Warnings1, Warnings2, Warnings3|Acc]);
-get_warnings_from_modules([], #st{plt = Plt}, DocPlt, Acc) ->
- {lists:flatten(Acc), Plt, DocPlt}.
+ DocPlt = insert_into_doc_plt(FunTypes, Callgraph, DocPlt),
+ lists:flatten([Warnings1, Warnings2, Warnings3]).
postprocess_warnings(RawWarnings, Codeserver) ->
Pred =