erlang各种有用的函数包括一些有用nif封装,还有一些性能测试case。
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 
 
 

85 satır
2.6 KiB

-module(dynamic_kvs).
-define(boot_type_supervisor, supervisor).
-define(boot_type_worker, worker).
-define(boot_type_simple_worker, simple_worker).
-type boot_type() :: ?boot_type_simple_worker | ?boot_type_supervisor | ?boot_type_worker.
-define(MATH_INT32_MAX, 4294967296).
-record(boot, {module :: atom(), type :: boot_type(), hasname = true :: boolean(), params :: any()}).
-export([start/1, start/0, get_name/1, init/1, handle_call/3, new/1, new/2]).
%% API
-export([set/3, gen/2]).
-record(dynamic_kvs, {
modules = [] :: [{Mod :: module(), [{Key :: atom(), Val :: any()}]}]
}).
start(FatherPID) ->
boot:start_child(FatherPID, #boot{module = ?MODULE, params = {}, type = ?boot_type_worker}).
start() ->
boot:start(#boot{module = ?MODULE, params = {}, type = ?boot_type_worker}).
get_name(_) ->
?MODULE.
init(_) ->
{ok, #dynamic_kvs{modules = []}}.
new(ModuleName) ->
new(ModuleName, []).
new(ModuleName, Kvs) ->
boot:call(?MODULE, {new, ModuleName, Kvs}).
set(ModuleName, Key, Val) ->
boot:call(?MODULE, {set, ModuleName, Key, Val}).
handle_call({new, ModuleName, Kvs}, _, DynamicKvs) ->
gen(ModuleName, Kvs),
NewDynamicKvs =
case lists:keyfind(ModuleName, 1, DynamicKvs#dynamic_kvs.modules) of
false ->
DynamicKvs#dynamic_kvs{modules = [{ModuleName, Kvs} | DynamicKvs#dynamic_kvs.modules]};
_ ->
DynamicKvs
end,
{reply, ok, NewDynamicKvs};
handle_call({set, ModuleName, Key, Val}, _, DynamicKvs) ->
case lists:keytake(ModuleName, 1, DynamicKvs#dynamic_kvs.modules) of
false ->
{reply, {error, not_find_module}, DynamicKvs};
{value, {_, Kvs}, RemainMods} ->
NewKvs = lists:keyreplace(Key, 1, Kvs, {Key, Val}),
gen(ModuleName, NewKvs),
{reply, ok, DynamicKvs#dynamic_kvs{modules = [{ModuleName, NewKvs} | RemainMods]}}
end.
concat(List) ->
lists:concat(List).
gen(ModuleName, Kvs) ->
Meta = meta:new(ModuleName),
Fun =
fun({K, V}, MetaTemp) ->
FunStr = concat([K, "() ->\n\t", utTypeCast:term_to_string(V), ".\n"]),
case meta:add_func(MetaTemp, FunStr) of
{ok, MetaTemp2} -> MetaTemp2;
Error ->
io:format("module(~p) define func(~s) error ~p~n", [ModuleName, FunStr, Error]),
exit(Error)
end
end,
FinalMeta = lists:foldl(Fun, Meta, Kvs),
FinalMeta2 = meta:add_func(FinalMeta, concat(["set(Key, Val) ->\n\tdynamic_kvs:set(", ModuleName, ", Key, Val).\n"])),
case meta:compile(FinalMeta2) of
{error, Error} ->
io:format("error ~p", [Error]),
ok;
ok ->
ok
end.