Просмотр исходного кода

fix gen_server2 issue, https://github.com/rabbitmq/rabbitmq-server/issues/268

Feng Lee 10 лет назад
Родитель
Сommit
f9eeab89a2
3 измененных файлов с 9 добавлено и 3 удалено
  1. 1 1
      src/emqttd_retained.erl
  2. 1 0
      src/emqttd_session.erl
  3. 7 2
      src/gen_server2.erl

+ 1 - 1
src/emqttd_retained.erl

@@ -122,5 +122,5 @@ dispatch(Topic, CPid) when is_binary(Topic) ->
             end,
             mnesia:async_dirty(fun mnesia:foldl/3, [Fun, [], retained])
     end,
-    [CPid ! {dispatch, Msg} || Msg <- Msgs].
+    lists:foreach(fun(Msg) -> CPid ! {dispatch, Msg} end, lists:reverse(Msgs)).
 

+ 1 - 0
src/emqttd_session.erl

@@ -268,6 +268,7 @@ prioritise_info(Msg, _Len, _State) ->
         session_expired -> 10;
         {timeout, _, _} -> 5;
         collect_info    -> 2;
+        {dispatch, _}   -> 1;
         _               -> 0
     end.
 

+ 7 - 2
src/gen_server2.erl

@@ -633,8 +633,13 @@ extend_backoff({backoff, InitialTimeout, MinimumTimeout, DesiredHibPeriod}) ->
 %%% The MAIN loop.
 %%% ---------------------------------------------------
 loop(GS2State = #gs2_state { time          = hibernate,
-                             timeout_state = undefined }) ->
-    pre_hibernate(GS2State);
+                             timeout_state = undefined,
+                             queue         = Queue }) ->
+    case priority_queue:is_empty(Queue) of
+        true  -> pre_hibernate(GS2State);
+        false -> process_next_msg(GS2State)
+    end;
+
 loop(GS2State) ->
     process_next_msg(drain(GS2State)).