-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}.
|