diff options
author | Dan Gudmundsson <[email protected]> | 2014-12-19 09:58:42 +0100 |
---|---|---|
committer | Dan Gudmundsson <[email protected]> | 2014-12-19 09:58:42 +0100 |
commit | ddbe8a821ad57bfc2a1bcd29ed80ae8cfffe1c0e (patch) | |
tree | c396eed1aa1a5c3e5fb6c2a7474e366e0f246eb5 | |
parent | 7cf95c33a50a705c38226bccd0caa76a96f92ea5 (diff) | |
download | otp-ddbe8a821ad57bfc2a1bcd29ed80ae8cfffe1c0e.tar.gz otp-ddbe8a821ad57bfc2a1bcd29ed80ae8cfffe1c0e.tar.bz2 otp-ddbe8a821ad57bfc2a1bcd29ed80ae8cfffe1c0e.zip |
wx: Do not crash server when going down
If a connect request was made during the takedown of wx it would crash.
-rw-r--r-- | lib/wx/src/wxe_server.erl | 14 | ||||
-rw-r--r-- | lib/wx/test/wx_event_SUITE.erl | 8 |
2 files changed, 14 insertions, 8 deletions
diff --git a/lib/wx/src/wxe_server.erl b/lib/wx/src/wxe_server.erl index 465b9da2e0..8ef568c102 100644 --- a/lib/wx/src/wxe_server.erl +++ b/lib/wx/src/wxe_server.erl @@ -223,14 +223,18 @@ handle_connect(Object, #evh{handler=undefined, cb=Callback} = EvData0, Error -> {reply, Error, State0} end; -handle_connect(Object, EvData=#evh{handler=Handler}, +handle_connect(Object, EvData=#evh{handler=Handler}, From, State0 = #state{users=Users}) -> %% Correct process is already listening just register it put(Handler, From), - User0 = #user{events=Listeners0} = gb_trees:get(From, Users), - User = User0#user{events=[{Object,EvData}|Listeners0]}, - State = State0#state{users=gb_trees:update(From, User, Users)}, - {reply, ok, State}. + case gb_trees:get(From, Users) of + {value, User0 = #user{events=Listeners0}} -> + User = User0#user{events=[{Object,EvData}|Listeners0]}, + State = State0#state{users=gb_trees:update(From, User, Users)}, + {reply, ok, State}; + none -> %% We are closing up the shop + {reply, {error, terminating}, State0} + end. invoke_cb({{Ev=#wx{}, Ref=#wx_ref{}}, FunId,_}, _S) -> %% Event callbacks diff --git a/lib/wx/test/wx_event_SUITE.erl b/lib/wx/test/wx_event_SUITE.erl index 076f16ba16..f9f8788d8f 100644 --- a/lib/wx/test/wx_event_SUITE.erl +++ b/lib/wx/test/wx_event_SUITE.erl @@ -336,12 +336,14 @@ connect_in_callback(Config) -> end}]), wxWindow:show(F1), receive - {continue, F1} -> Tester ! {continue, F1} + {continue, F1} -> + true = wxFrame:disconnect(F1, size), + Tester ! {continue, F1} end end, - wxFrame:connect(Frame,size, + wxFrame:connect(Frame,show, [{callback, - fun(#wx{event=#wxSize{}},_SizeEv) -> + fun(#wx{event=#wxShow{}},_SizeEv) -> io:format("Frame got size~n",[]), spawn(TestWindow) end}]), |