erlang各种有用的函数包括一些有用nif封装,还有一些性能测试case。
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

84 wiersze
2.6 KiB

  1. -module(dynamic_kvs).
  2. -define(boot_type_supervisor, supervisor).
  3. -define(boot_type_worker, worker).
  4. -define(boot_type_simple_worker, simple_worker).
  5. -type boot_type() :: ?boot_type_simple_worker | ?boot_type_supervisor | ?boot_type_worker.
  6. -define(MATH_INT32_MAX, 4294967296).
  7. -record(boot, {module :: atom(), type :: boot_type(), hasname = true :: boolean(), params :: any()}).
  8. -export([start/1, start/0, get_name/1, init/1, handle_call/3, new/1, new/2]).
  9. %% API
  10. -export([set/3, gen/2]).
  11. -record(dynamic_kvs, {
  12. modules = [] :: [{Mod :: module(), [{Key :: atom(), Val :: any()}]}]
  13. }).
  14. start(FatherPID) ->
  15. boot:start_child(FatherPID, #boot{module = ?MODULE, params = {}, type = ?boot_type_worker}).
  16. start() ->
  17. boot:start(#boot{module = ?MODULE, params = {}, type = ?boot_type_worker}).
  18. get_name(_) ->
  19. ?MODULE.
  20. init(_) ->
  21. {ok, #dynamic_kvs{modules = []}}.
  22. new(ModuleName) ->
  23. new(ModuleName, []).
  24. new(ModuleName, Kvs) ->
  25. boot:call(?MODULE, {new, ModuleName, Kvs}).
  26. set(ModuleName, Key, Val) ->
  27. boot:call(?MODULE, {set, ModuleName, Key, Val}).
  28. handle_call({new, ModuleName, Kvs}, _, DynamicKvs) ->
  29. gen(ModuleName, Kvs),
  30. NewDynamicKvs =
  31. case lists:keyfind(ModuleName, 1, DynamicKvs#dynamic_kvs.modules) of
  32. false ->
  33. DynamicKvs#dynamic_kvs{modules = [{ModuleName, Kvs} | DynamicKvs#dynamic_kvs.modules]};
  34. _ ->
  35. DynamicKvs
  36. end,
  37. {reply, ok, NewDynamicKvs};
  38. handle_call({set, ModuleName, Key, Val}, _, DynamicKvs) ->
  39. case lists:keytake(ModuleName, 1, DynamicKvs#dynamic_kvs.modules) of
  40. false ->
  41. {reply, {error, not_find_module}, DynamicKvs};
  42. {value, {_, Kvs}, RemainMods} ->
  43. NewKvs = lists:keyreplace(Key, 1, Kvs, {Key, Val}),
  44. gen(ModuleName, NewKvs),
  45. {reply, ok, DynamicKvs#dynamic_kvs{modules = [{ModuleName, NewKvs} | RemainMods]}}
  46. end.
  47. concat(List) ->
  48. lists:concat(List).
  49. gen(ModuleName, Kvs) ->
  50. Meta = meta:new(ModuleName),
  51. Fun =
  52. fun({K, V}, MetaTemp) ->
  53. FunStr = concat([K, "() ->\n\t", utTypeCast:term_to_string(V), ".\n"]),
  54. case meta:add_func(MetaTemp, FunStr) of
  55. {ok, MetaTemp2} -> MetaTemp2;
  56. Error ->
  57. io:format("module(~p) define func(~s) error ~p~n", [ModuleName, FunStr, Error]),
  58. exit(Error)
  59. end
  60. end,
  61. FinalMeta = lists:foldl(Fun, Meta, Kvs),
  62. FinalMeta2 = meta:add_func(FinalMeta, concat(["set(Key, Val) ->\n\tdynamic_kvs:set(", ModuleName, ", Key, Val).\n"])),
  63. case meta:compile(FinalMeta2) of
  64. {error, Error} ->
  65. io:format("error ~p", [Error]),
  66. ok;
  67. ok ->
  68. ok
  69. end.