summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Sackman <matthew@rabbitmq.com>2011-06-28 15:32:31 +0100
committerMatthew Sackman <matthew@rabbitmq.com>2011-06-28 15:32:31 +0100
commit75a04e11e0749f8268ae9f66e7f8a09d2db7879b (patch)
treeeb1030e693a3a5a0103507f3a859219654f4d11b
parenta41f6d5d1f7426f6049be8eccc7d04e3e6a633d5 (diff)
downloadrabbitmq-server-75a04e11e0749f8268ae9f66e7f8a09d2db7879b.tar.gz
Build graph; prune graph; traverse graph; obey graph.
-rw-r--r--src/rabbit.erl22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/rabbit.erl b/src/rabbit.erl
index 5f727a82..ce120570 100644
--- a/src/rabbit.erl
+++ b/src/rabbit.erl
@@ -201,14 +201,14 @@ prepare() ->
start() ->
try
ok = prepare(),
- ok = rabbit_misc:start_applications(?APPS)
+ ok = rabbit_misc:start_applications(application_load_order())
after
%%give the error loggers some time to catch up
timer:sleep(100)
end.
stop() ->
- ok = rabbit_misc:stop_applications(?APPS).
+ ok = rabbit_misc:stop_applications(application_load_order()).
stop_and_halt() ->
init:stop(),
@@ -386,6 +386,24 @@ config_files() ->
%%---------------------------------------------------------------------------
+application_load_order() ->
+ {ok, G} = rabbit_misc:build_acyclic_graph(
+ fun application_graph_vertex/2, fun application_graph_edge/2,
+ [{App, Deps} ||
+ {App, _Desc, _Vsn} <- application:loaded_applications(),
+ {ok, Deps} <- [application:get_key(App, applications)]]),
+ true = digraph:del_vertices(
+ G, digraph:vertices(G) -- digraph_utils:reachable(?APPS, G)),
+ digraph_utils:topsort(G).
+
+application_graph_vertex(App, _Deps) ->
+ [{App, App}].
+
+application_graph_edge(App, Deps) ->
+ [{Dep, App} || Dep <- Deps].
+
+%%---------------------------------------------------------------------------
+
print_banner() ->
{ok, Product} = application:get_key(id),
{ok, Version} = application:get_key(vsn),