From ddbe8a821ad57bfc2a1bcd29ed80ae8cfffe1c0e Mon Sep 17 00:00:00 2001
From: Dan Gudmundsson <dgud@erlang.org>
Date: Fri, 19 Dec 2014 09:58:42 +0100
Subject: wx: Do not crash server when going down

If a connect request was made during the takedown of wx it would crash.
---
 lib/wx/src/wxe_server.erl      | 14 +++++++++-----
 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}]),
-- 
cgit v1.2.3