소스 검색

ft: 同步gen_xxx 模块到otp24.1.2

master
SisMaker 3 년 전
부모
커밋
44304c6888
4개의 변경된 파일40개의 추가작업 그리고 14개의 파일을 삭제
  1. +9
    -2
      README.md
  2. +12
    -7
      src/gen_apu.erl
  3. +9
    -0
      src/gen_ipc.erl
  4. +10
    -5
      src/gen_srv.erl

+ 9
- 2
README.md 파일 보기

@ -2,7 +2,7 @@
封装与收集各种有用的erlang行为 封装与收集各种有用的erlang行为
最初目的是想造个非常统一又通用的行为模式-基于这个想法-封装了gen_ipc行为模块 最初目的是想造个非常统一又通用的行为模式-基于这个想法-封装了gen_ipc行为模块
基于gen_ipc gen_srv 基于Otp23.0.2编写 运行otp版本21+
基于gen_ipc gen_srv 基于Otp24.1.2编写 运行otp版本23.0+
# 简写备注 # 简写备注
@ -29,7 +29,14 @@
# gen_srv # gen_srv
出于考虑大部分的行为模式为gen_server, 如果使用gen_ipc大量handle函数会添加一个额外无用的 _ 作为 状态 参数的占位, 可能对于一些追求完美与代码简洁的人来说不可接受, 出于考虑大部分的行为模式为gen_server, 如果使用gen_ipc大量handle函数会添加一个额外无用的 _ 作为 状态 参数的占位, 可能对于一些追求完美与代码简洁的人来说不可接受,
所以出于该考虑, 基于gen_server结合gen_ipc一些便捷式的定时器封装了gen_srv.
所以出于该考虑, 基于gen_server结合gen_ipc一些便捷式的定时器封装了gen_srv.
# gen_emm
gen_event 重写
# gen_apu
功能与gen_srv一致 只是 call和cast消息 不在调用 handle_call handle_cast函数 而是取消息的第一个参数作为函数名 调用回调模块的这个函数

+ 12
- 7
src/gen_apu.erl 파일 보기

@ -416,6 +416,15 @@ multi_call(Nodes, Name, Request, infinity) ->
multi_call(Nodes, Name, Request, Timeout) when is_list(Nodes), is_atom(Name), is_integer(Timeout), Timeout >= 0 -> multi_call(Nodes, Name, Request, Timeout) when is_list(Nodes), is_atom(Name), is_integer(Timeout), Timeout >= 0 ->
do_multi_call(Nodes, Name, Request, Timeout). do_multi_call(Nodes, Name, Request, Timeout).
do_multi_call([Node], Name, Req, infinity) when Node =:= node() ->
% Special case when multi_call is used with local node only.
% In that case we can leverage the benefit of recv_mark optimisation
% existing in simple gen:call.
try gen:call(Name, '$gen_call', Req, infinity) of
{ok, Res} -> {[{Node, Res}],[]}
catch exit:_ ->
{[], [Node]}
end;
do_multi_call(Nodes, Name, Request, infinity) -> do_multi_call(Nodes, Name, Request, infinity) ->
Tag = make_ref(), Tag = make_ref(),
Monitors = send_nodes(Nodes, Name, Tag, Request), Monitors = send_nodes(Nodes, Name, Tag, Request),
@ -718,7 +727,7 @@ matchCallMsg(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurStat
FunName = element(1, Request), FunName = element(1, Request),
Module:FunName(Request, CurState, From); Module:FunName(Request, CurState, From);
_ -> _ ->
Module:Request(CurState, From)
Module:Request(Request, CurState, From)
end end
of of
Result -> Result ->
@ -738,7 +747,7 @@ matchCastMsg(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurStat
FunName = element(1, Cast), FunName = element(1, Cast),
Module:FunName(Cast, CurState); Module:FunName(Cast, CurState);
_ -> _ ->
Module:Cast(CurState)
Module:Cast(Cast, CurState)
end end
of of
Result -> Result ->
@ -1150,11 +1159,7 @@ format_log_multi(#{label := {gen_apu, terminate},
Args = Args =
case Depth of case Depth of
unlimited -> unlimited ->
[Name, Msg, State, Reason1] ++
case Log of
[] -> [];
_ -> Log
end ++ ClientArgs;
[Name, Msg, State, Reason1] ++ Log ++ ClientArgs;
_ -> _ ->
[Name, Depth, Msg, Depth, State, Depth, Reason1, Depth] ++ [Name, Depth, Msg, Depth, State, Depth, Reason1, Depth] ++
case Log of case Log of

+ 9
- 0
src/gen_ipc.erl 파일 보기

@ -574,6 +574,15 @@ multi_call(Nodes, Name, Request, infinity) ->
multi_call(Nodes, Name, Request, Timeout) when is_list(Nodes), is_atom(Name), is_integer(Timeout), Timeout >= 0 -> multi_call(Nodes, Name, Request, Timeout) when is_list(Nodes), is_atom(Name), is_integer(Timeout), Timeout >= 0 ->
do_multi_call(Nodes, Name, Request, Timeout). do_multi_call(Nodes, Name, Request, Timeout).
do_multi_call([Node], Name, Req, infinity) when Node =:= node() ->
% Special case when multi_call is used with local node only.
% In that case we can leverage the benefit of recv_mark optimisation
% existing in simple gen:call.
try gen:call(Name, '$gen_call', Req, infinity) of
{ok, Res} -> {[{Node, Res}],[]}
catch exit:_ ->
{[], [Node]}
end;
do_multi_call(Nodes, Name, Request, infinity) -> do_multi_call(Nodes, Name, Request, infinity) ->
Tag = make_ref(), Tag = make_ref(),
Monitors = send_nodes(Nodes, Name, Tag, Request), Monitors = send_nodes(Nodes, Name, Tag, Request),

+ 10
- 5
src/gen_srv.erl 파일 보기

@ -412,6 +412,15 @@ multi_call(Nodes, Name, Request, infinity) ->
multi_call(Nodes, Name, Request, Timeout) when is_list(Nodes), is_atom(Name), is_integer(Timeout), Timeout >= 0 -> multi_call(Nodes, Name, Request, Timeout) when is_list(Nodes), is_atom(Name), is_integer(Timeout), Timeout >= 0 ->
do_multi_call(Nodes, Name, Request, Timeout). do_multi_call(Nodes, Name, Request, Timeout).
do_multi_call([Node], Name, Req, infinity) when Node =:= node() ->
% Special case when multi_call is used with local node only.
% In that case we can leverage the benefit of recv_mark optimisation
% existing in simple gen:call.
try gen:call(Name, '$gen_call', Req, infinity) of
{ok, Res} -> {[{Node, Res}],[]}
catch exit:_ ->
{[], [Node]}
end;
do_multi_call(Nodes, Name, Request, infinity) -> do_multi_call(Nodes, Name, Request, infinity) ->
Tag = make_ref(), Tag = make_ref(),
Monitors = send_nodes(Nodes, Name, Tag, Request), Monitors = send_nodes(Nodes, Name, Tag, Request),
@ -1130,11 +1139,7 @@ format_log_multi(#{label := {gen_srv, terminate},
Args = Args =
case Depth of case Depth of
unlimited -> unlimited ->
[Name, Msg, State, Reason1] ++
case Log of
[] -> [];
_ -> Log
end ++ ClientArgs;
[Name, Msg, State, Reason1] ++ Log ++ ClientArgs;
_ -> _ ->
[Name, Depth, Msg, Depth, State, Depth, Reason1, Depth] ++ [Name, Depth, Msg, Depth, State, Depth, Reason1, Depth] ++
case Log of case Log of

불러오는 중...
취소
저장