|
|
- -module(lgBkdThrottle).
-
- %% @doc一个简单的gen_event后端,用于监视邮箱大小和在同步和异步模式之间切换日志消息。
- %%使用gen_event处理程序是因为进程获得了自己的邮箱的大小不涉及获取锁定,
- %% 并且gen_event处理程序在其中运行parent's的进程里。
-
- -behaviour(gen_emm).
-
- -include("lgDef.hrl").
-
- -compile(inline).
- -compile({inline_size, 128}).
-
- -export([
- init/1
- , handleCall/2
- , handleEvent/2
- , handleInfo/2
- , terminate/2
- , code_change/3
- ]).
-
- -record(state, {
- sink :: atom(),
- hwm :: non_neg_integer(),
- window :: non_neg_integer(),
- async = true :: boolean()
- }).
-
- init([Sink, Hwm, Window]) ->
- lgConfig:ptSet({Sink, async}, true),
- {ok, #state{sink = Sink, hwm = Hwm, window = Hwm - Window}}.
-
- handleCall(mGetLogLevel, State) ->
- {reply, ?llvNone, State};
- handleCall({mSetLogLevel, _Level}, State) ->
- {reply, ok, State};
- handleCall(_Msg, State) ->
- ?ERR(<<"~p call receive unexpect msg ~p ~n ">>, [?MODULE, _Msg]),
- {reply, ok, State}.
-
- handleEvent({mWriteLog, _Message}, #state{sink = Sink, hwm = Hwm, window = Window, async = Async} = State) ->
- {_, MsgLen} = erlang:process_info(self(), message_queue_len),
- if
- MsgLen > Hwm andalso Async ->
- %% need to flip to sync mode
- lgConfig:ptSet({Sink, async}, false),
- {ok, State#state{async = false}};
- MsgLen < Window andalso not Async ->
- %% need to flip to async mode
- lgConfig:ptSet({Sink, async}, true),
- {ok, State#state{async = true}};
- true ->
- %% nothing needs to change
- kpS
- end;
- handleEvent(_Event, _State) ->
- kpS.
-
- handleInfo(_Info, _State) ->
- kpS.
-
- terminate(_Reason, _State) ->
- ok.
-
- code_change(_OldVsn, State, _Extra) ->
- {ok, State}.
|