diff options
| author | Dan Gudmundsson <[email protected]> | 2014-07-04 11:52:21 +0200 | 
|---|---|---|
| committer | Dan Gudmundsson <[email protected]> | 2014-07-04 11:52:21 +0200 | 
| commit | fadb85a2e1ef5d1607947bd070c250e3a6205da9 (patch) | |
| tree | 6e98edbdcfad0f338e3c70dc2f5c6d0a77771a8e /lib/stdlib/src | |
| parent | 98c5cdbe60b6d743ad461b651a586c6f3a502ba9 (diff) | |
| download | otp-fadb85a2e1ef5d1607947bd070c250e3a6205da9.tar.gz otp-fadb85a2e1ef5d1607947bd070c250e3a6205da9.tar.bz2 otp-fadb85a2e1ef5d1607947bd070c250e3a6205da9.zip | |
stdlib: Call format_status even if terminate callback crashes
The format_status callback (if exists) should always be invoked when
logging errors.
Diffstat (limited to 'lib/stdlib/src')
| -rw-r--r-- | lib/stdlib/src/gen_fsm.erl | 49 | ||||
| -rw-r--r-- | lib/stdlib/src/gen_server.erl | 51 | 
2 files changed, 48 insertions, 52 deletions
| diff --git a/lib/stdlib/src/gen_fsm.erl b/lib/stdlib/src/gen_fsm.erl index e914f7d0b2..5afe3e8b09 100644 --- a/lib/stdlib/src/gen_fsm.erl +++ b/lib/stdlib/src/gen_fsm.erl @@ -1,7 +1,7 @@  %%  %% %CopyrightBegin%  %% -%% Copyright Ericsson AB 1996-2013. All Rights Reserved. +%% Copyright Ericsson AB 1996-2014. All Rights Reserved.  %%  %% The contents of this file are subject to the Erlang Public License,  %% Version 1.1, (the "License"); you may not use this file except in @@ -594,7 +594,8 @@ reply(Name, {To, Tag}, Reply, Debug, StateName) ->  terminate(Reason, Name, Msg, Mod, StateName, StateData, Debug) ->      case catch Mod:terminate(Reason, StateName, StateData) of  	{'EXIT', R} -> -	    error_info(R, Name, Msg, StateName, StateData, Debug), +	    FmtStateData = format_status(terminate, Mod, get(), StateData), +	    error_info(R, Name, Msg, StateName, FmtStateData, Debug),  	    exit(R);  	_ ->  	    case Reason of @@ -605,17 +606,7 @@ terminate(Reason, Name, Msg, Mod, StateName, StateData, Debug) ->   		{shutdown,_}=Shutdown ->   		    exit(Shutdown);  		_ -> -                    FmtStateData = -                        case erlang:function_exported(Mod, format_status, 2) of -                            true -> -                                Args = [get(), StateData], -                                case catch Mod:format_status(terminate, Args) of -                                    {'EXIT', _} -> StateData; -                                    Else -> Else -                                end; -                            _ -> -                                StateData -                        end, +                    FmtStateData = format_status(terminate, Mod, get(), StateData),  		    error_info(Reason,Name,Msg,StateName,FmtStateData,Debug),  		    exit(Reason)  	    end @@ -680,21 +671,29 @@ format_status(Opt, StatusData) ->      Header = gen:format_status_header("Status for state machine",                                        Name),      Log = sys:get_debug(log, Debug, []), -    DefaultStatus = [{data, [{"StateData", StateData}]}], -    Specfic = -	case erlang:function_exported(Mod, format_status, 2) of -	    true -> -		case catch Mod:format_status(Opt,[PDict,StateData]) of -		    {'EXIT', _} -> DefaultStatus; -                    StatusList when is_list(StatusList) -> StatusList; -		    Else -> [Else] -		end; -	    _ -> -		DefaultStatus -	end, +    Specfic = format_status(Opt, Mod, PDict, StateData), +    Specfic = case format_status(Opt, Mod, PDict, StateData) of +		  S when is_list(S) -> S; +		  S -> [S] +	      end,      [{header, Header},       {data, [{"Status", SysState},  	     {"Parent", Parent},  	     {"Logged events", Log},  	     {"StateName", StateName}]} |       Specfic]. + +format_status(Opt, Mod, PDict, State) -> +    DefStatus = case Opt of +		    terminate -> State; +		    _ -> [{data, [{"StateData", State}]}] +		end, +    case erlang:function_exported(Mod, format_status, 2) of +	true -> +	    case catch Mod:format_status(Opt, [PDict, State]) of +		{'EXIT', _} -> DefStatus; +		Else -> Else +	    end; +	_ -> +	    DefStatus +    end. diff --git a/lib/stdlib/src/gen_server.erl b/lib/stdlib/src/gen_server.erl index 202a931fae..dadfe56b3d 100644 --- a/lib/stdlib/src/gen_server.erl +++ b/lib/stdlib/src/gen_server.erl @@ -1,7 +1,7 @@  %%  %% %CopyrightBegin%  %% -%% Copyright Ericsson AB 1996-2013. All Rights Reserved. +%% Copyright Ericsson AB 1996-2014. All Rights Reserved.  %%  %% The contents of this file are subject to the Erlang Public License,  %% Version 1.1, (the "License"); you may not use this file except in @@ -720,7 +720,8 @@ print_event(Dev, Event, Name) ->  terminate(Reason, Name, Msg, Mod, State, Debug) ->      case catch Mod:terminate(Reason, State) of  	{'EXIT', R} -> -	    error_info(R, Name, Msg, State, Debug), +	    FmtState = format_status(terminate, Mod, get(), State), +	    error_info(R, Name, Msg, FmtState, Debug),  	    exit(R);  	_ ->  	    case Reason of @@ -731,17 +732,7 @@ terminate(Reason, Name, Msg, Mod, State, Debug) ->  		{shutdown,_}=Shutdown ->  		    exit(Shutdown);  		_ -> -		    FmtState = -			case erlang:function_exported(Mod, format_status, 2) of -			    true -> -				Args = [get(), State], -				case catch Mod:format_status(terminate, Args) of -				    {'EXIT', _} -> State; -				    Else -> Else -				end; -			    _ -> -				State -			end, +		    FmtState = format_status(terminate, Mod, get(), State),  		    error_info(Reason, Name, Msg, FmtState, Debug),  		    exit(Reason)  	    end @@ -875,23 +866,29 @@ name_to_pid(Name) ->  %%-----------------------------------------------------------------  format_status(Opt, StatusData) ->      [PDict, SysState, Parent, Debug, [Name, State, Mod, _Time]] = StatusData, -    Header = gen:format_status_header("Status for generic server", -                                      Name), +    Header = gen:format_status_header("Status for generic server", Name),      Log = sys:get_debug(log, Debug, []), -    DefaultStatus = [{data, [{"State", State}]}], -    Specfic = -	case erlang:function_exported(Mod, format_status, 2) of -	    true -> -		case catch Mod:format_status(Opt, [PDict, State]) of -		    {'EXIT', _} -> DefaultStatus; -                    StatusList when is_list(StatusList) -> StatusList; -		    Else -> [Else] -		end; -	    _ -> -		DefaultStatus -	end, +    Specfic = case format_status(Opt, Mod, PDict, State) of +		  S when is_list(S) -> S; +		  S -> [S] +	      end,      [{header, Header},       {data, [{"Status", SysState},  	     {"Parent", Parent},  	     {"Logged events", Log}]} |       Specfic]. + +format_status(Opt, Mod, PDict, State) -> +    DefStatus = case Opt of +		    terminate -> State; +		    _ -> [{data, [{"State", State}]}] +		end, +    case erlang:function_exported(Mod, format_status, 2) of +	true -> +	    case catch Mod:format_status(Opt, [PDict, State]) of +		{'EXIT', _} -> DefStatus; +		Else -> Else +	    end; +	_ -> +	    DefStatus +    end. | 
