@@ -209,10 +209,10 @@ start(KernelApp) ->
209209% % Returns: ok | {error, Reason}
210210% %-----------------------------------------------------------------
211211load_application (Application ) ->
212- gen_server : call (? AC , {load_application , Application }, infinity ).
212+ call ({load_application , Application }, infinity ).
213213
214214unload_application (AppName ) ->
215- gen_server : call (? AC , {unload_application , AppName }, infinity ).
215+ call ({unload_application , AppName }, infinity ).
216216
217217% %-----------------------------------------------------------------
218218% % Func: start_application/2
@@ -236,7 +236,7 @@ unload_application(AppName) ->
236236% % Returns: ok | {error, Reason}
237237% %-----------------------------------------------------------------
238238start_application (AppName , RestartType ) ->
239- gen_server : call (? AC , {start_application , AppName , RestartType }, infinity ).
239+ call ({start_application , AppName , RestartType }, infinity ).
240240
241241start_application_request (AppName , RestartType ) ->
242242 gen_server :send_request (? AC , {start_application , AppName , RestartType }).
@@ -250,7 +250,7 @@ start_application_request(AppName, RestartType) ->
250250% % Returns: boolean
251251% %-----------------------------------------------------------------
252252is_running (AppName ) when is_atom (AppName ) ->
253- gen_server : call (? AC , {is_running , AppName }, infinity ).
253+ call ({is_running , AppName }, infinity ).
254254
255255% %-----------------------------------------------------------------
256256% % Func: start_boot_application/2
@@ -263,9 +263,9 @@ start_boot_application(Application, RestartType) ->
263263 case {application :load (Application ), RestartType } of
264264 {ok , _ } ->
265265 AppName = get_appl_name (Application ),
266- gen_server : call (? AC , {start_application , AppName , RestartType }, infinity );
266+ call ({start_application , AppName , RestartType }, infinity );
267267 {{error , {already_loaded , AppName }}, _ } ->
268- gen_server : call (? AC , {start_application , AppName , RestartType }, infinity );
268+ call ({start_application , AppName , RestartType }, infinity );
269269 {{error ,{bad_environment_value ,Env }}, permanent } ->
270270 Txt = io_lib :format (" Bad environment variable: ~tp Application: ~p " ,
271271 [Env , Application ]),
@@ -275,15 +275,15 @@ start_boot_application(Application, RestartType) ->
275275 end .
276276
277277stop_application (AppName ) ->
278- gen_server : call (? AC , {stop_application , AppName }, infinity ).
278+ call ({stop_application , AppName }, infinity ).
279279
280280% %-----------------------------------------------------------------
281281% % Returns: [{Name, Descr, Vsn}]
282282% %-----------------------------------------------------------------
283283which_applications () ->
284- gen_server : call (? AC , which_applications ).
284+ call (which_applications ).
285285which_applications (Timeout ) ->
286- gen_server : call (? AC , which_applications , Timeout ).
286+ call (which_applications , Timeout ).
287287
288288loaded_applications () ->
289289 ets :select (ac_tab ,
@@ -295,10 +295,10 @@ loaded_applications() ->
295295
296296% % Returns some debug info
297297info () ->
298- gen_server : call (? AC , info ).
298+ call (info ).
299299
300300control_application (AppName ) ->
301- gen_server : call (? AC , {control_application , AppName }, infinity ).
301+ call ({control_application , AppName }, infinity ).
302302
303303% %-----------------------------------------------------------------
304304% % Func: change_application_data/2
@@ -323,21 +323,14 @@ control_application(AppName) ->
323323% % some applicatation may have got new config data.
324324% %-----------------------------------------------------------------
325325change_application_data (Applications , Config ) ->
326- gen_server :call (? AC ,
327- {change_application_data , Applications , Config },
328- infinity ).
326+ call ({change_application_data , Applications , Config },infinity ).
329327
330328prep_config_change () ->
331- gen_server :call (? AC ,
332- prep_config_change ,
333- infinity ).
329+ call (prep_config_change , infinity ).
334330
335331
336332config_change (EnvPrev ) ->
337- gen_server :call (? AC ,
338- {config_change , EnvPrev },
339- infinity ).
340-
333+ call ({config_change , EnvPrev },infinity ).
341334
342335
343336get_pid_env (Master , Key ) ->
@@ -439,7 +432,7 @@ get_all_key(AppName) ->
439432start_type (Master ) ->
440433 case ets :match (ac_tab , {{application_master , '$1' }, Master }) of
441434 [[AppName ]] ->
442- gen_server : call (? AC , {start_type , AppName }, infinity );
435+ call ({start_type , AppName }, infinity );
443436 _X ->
444437 undefined
445438 end .
@@ -475,31 +468,44 @@ get_application_module(_Module, []) ->
475468 undefined .
476469
477470permit_application (ApplName , Flag ) ->
478- gen_server :call (? AC ,
479- {permit_application , ApplName , Flag },
480- infinity ).
471+ call ({permit_application , ApplName , Flag },infinity ).
481472
482473set_env (Config , Opts ) ->
483474 case check_conf_data (Config ) of
484475 ok ->
485476 Timeout = proplists :get_value (timeout , Opts , 5000 ),
486- gen_server : call (? AC , {set_env , Config , Opts }, Timeout );
477+ call ({set_env , Config , Opts }, Timeout );
487478
488479 {error , _ } = Error ->
489480 Error
490481 end .
491482
492483set_env (AppName , Key , Val ) ->
493- gen_server : call (? AC , {set_env , AppName , Key , Val , []}).
484+ call ({set_env , AppName , Key , Val , []}).
494485set_env (AppName , Key , Val , Opts ) ->
495486 Timeout = proplists :get_value (timeout , Opts , 5000 ),
496- gen_server : call (? AC , {set_env , AppName , Key , Val , Opts }, Timeout ).
487+ call ({set_env , AppName , Key , Val , Opts }, Timeout ).
497488
498489unset_env (AppName , Key ) ->
499- gen_server : call (? AC , {unset_env , AppName , Key , []}).
490+ call ({unset_env , AppName , Key , []}).
500491unset_env (AppName , Key , Opts ) ->
501492 Timeout = proplists :get_value (timeout , Opts , 5000 ),
502- gen_server :call (? AC , {unset_env , AppName , Key , Opts }, Timeout ).
493+ call ({unset_env , AppName , Key , Opts }, Timeout ).
494+
495+ call (Cmd ) ->
496+ case gen_server :call (? AC , Cmd ) of
497+ {error , terminating } ->
498+ exit (terminating );
499+ Res ->
500+ Res
501+ end .
502+ call (Cmd , Timeout ) ->
503+ case gen_server :call (? AC , Cmd , Timeout ) of
504+ {error , terminating } ->
505+ exit (terminating );
506+ Res ->
507+ Res
508+ end .
503509
504510% %%-----------------------------------------------------------------
505511% %% call-back functions from gen_server
@@ -1233,14 +1239,21 @@ terminate(Reason, S) ->
12331239 % % Proc died before link
12341240 {'EXIT' , Id , _ } -> ok
12351241 after 0 ->
1236- receive
1237- {'DOWN' , Ref , process , Id , _ } -> ok
1238- after ShutdownTimeout ->
1239- exit (Id , kill ),
1240- receive
1241- {'DOWN' , Ref , process , Id , _ } -> ok
1242- end
1243- end
1242+ (fun F () ->
1243+ receive
1244+ {'DOWN' , Ref , process , Id , _ } -> ok ;
1245+ % % We need to handle any gen_server:call here
1246+ % % and reply to them so that they don't deadlock
1247+ {'$gen_call' , From , _Msg } ->
1248+ gen_server :reply (From , {error , terminating }),
1249+ F ()
1250+ after ShutdownTimeout ->
1251+ exit (Id , kill ),
1252+ receive
1253+ {'DOWN' , Ref , process , Id , _ } -> ok
1254+ end
1255+ end
1256+ end )()
12441257 end ;
12451258 (_ ) -> ok
12461259 end ,
0 commit comments