-
Notifications
You must be signed in to change notification settings - Fork 9
/
erlide_common_app.erl
61 lines (53 loc) · 1.81 KB
/
erlide_common_app.erl
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
-module(erlide_common_app).
-export([
init/4
]).
init(JRex, Kill, HeapWarnLimit, HeapKillLimit) ->
io:format("Start common app~n"),
spawn(fun () ->
startup(JRex, Kill, HeapWarnLimit, HeapKillLimit)
end).
startup(JRex, Kill, HeapWarnLimit, HeapKillLimit)->
erlide_jrpc:init(JRex),
watch_eclipse(node(JRex), Kill),
erlide_monitor:start(HeapWarnLimit, HeapKillLimit),
erlang:system_monitor(erlang:whereis(erlide_monitor),
[{long_gc, 3000}, {large_heap, HeapWarnLimit*1000000 div 2}]),
ok.
watch_eclipse(JavaNode, Kill) ->
spawn(fun() ->
monitor_node(JavaNode, true),
erlide_log:log({"Monitoring java node", JavaNode}),
write_message({"start monitoring", JavaNode, Kill}),
wait_nodedown(JavaNode, Kill)
end).
shutdown() ->
write_message("SHUTTING DOWN"),
erlide_monitor:stop(),
L = [V || V = "erlide_" ++ _ <- [atom_to_list(X) || X <- registered()]],
[exit(whereis(list_to_atom(X)), kill) || X <- L],
write_message("FINISHED"),
ok.
write_message(Msg) ->
{ok, [[Home]]} = init:get_argument(home),
{ok, F} = file:open(Home++"/erlide_debug.txt", [append, raw]),
file:write(F, io_lib:format("~p: ~p got ~p~n", [erlang:universaltime(), node(), Msg])),
file:sync(F),
file:close(F),
ok.
wait_nodedown(JavaNode, Kill) ->
receive
{nodedown, JavaNode}=_Msg ->
write_message(_Msg),
case Kill of
true ->
erlang:halt(abort, [{flush, false}]),
ok;
false ->
shutdown(),
ok
end,
ok
after 5000 ->
wait_nodedown(JavaNode, Kill)
end.