diff options
Diffstat (limited to 'lib/kernel/test/code_SUITE_data/code_archive_dict-1.0/src')
3 files changed, 193 insertions, 0 deletions
diff --git a/lib/kernel/test/code_SUITE_data/code_archive_dict-1.0/src/code_archive_dict.erl b/lib/kernel/test/code_SUITE_data/code_archive_dict-1.0/src/code_archive_dict.erl new file mode 100644 index 0000000000..ccc954ee17 --- /dev/null +++ b/lib/kernel/test/code_SUITE_data/code_archive_dict-1.0/src/code_archive_dict.erl @@ -0,0 +1,125 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(code_archive_dict). +-behaviour(sys). + +%% Public +-export([new/1, store/3, erase/2, find/2, foldl/3, erase/1]). + +%% Internal +-export([init/3, loop/3]). + +%% supervisor callback +-export([start_link/2]). + +%% sys callback functions +-export([ + system_continue/3, + system_terminate/4, + system_code_change/4 + ]). + +-define(SUPERVISOR, code_archive_dict_sup). + +start_link(Name, Debug) -> + proc_lib:start_link(?MODULE, init, [self(), Name, Debug], infinity, []). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Client + +new(Name) -> + supervisor:start_child(?SUPERVISOR, [Name]). + +store(Pid, Key, Val) -> + call(Pid, {store, Key, Val}). + +erase(Pid, Key) -> + call(Pid, {erase, Key}). + +find(Pid, Key) -> + call(Pid, {find, Key}). + +foldl(Pid, Fun, Acc) -> + call(Pid, {foldl, Fun, Acc}). + +erase(Pid) -> + call(Pid, stop). + +call(Name, Msg) when is_atom(Name) -> + call(whereis(Name), Msg); +call(Pid, Msg) when is_pid(Pid) -> + Ref = erlang:monitor(process, Pid), + Pid ! {self(), Ref, Msg}, + receive + {Ref, Reply} -> + erlang:demonitor(Ref, [flush]), + Reply; + {'DOWN', Ref, _, _, Reason} -> + {error, Reason} + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Server + +init(Parent, Name, Debug) -> + register(Name, self()), + Dict = dict:new(), + proc_lib:init_ack(Parent, {ok, self()}), + loop(Dict, Parent, Debug). + +loop(Dict, Parent, Debug) -> + receive + {system, From, Msg} -> + sys:handle_system_msg(Msg, From, Parent, ?MODULE, Debug, Dict); + {ReplyTo, Ref, {store, Key, Val}} -> + Dict2 = dict:store(Key, Val, Dict), + ReplyTo ! {Ref, ok}, + ?MODULE:loop(Dict2, Parent, Debug); + {ReplyTo, Ref, {erase, Key}} -> + Dict2 = dict:erase(Key, Dict), + ReplyTo ! {Ref, ok}, + ?MODULE:loop(Dict2, Parent, Debug); + {ReplyTo, Ref, {find, Key}} -> + Res = dict:find(Key, Dict), + ReplyTo ! {Ref, Res}, + ?MODULE:loop(Dict, Parent, Debug); + {ReplyTo, Ref, {foldl, Fun, Acc}} -> + Acc2 = dict:foldl(Fun, Acc, Dict), + ReplyTo ! {Ref, {ok, Acc2}}, + ?MODULE:loop(Dict, Parent, Debug); + {ReplyTo, Ref, stop} -> + ReplyTo ! {Ref, ok}, + exit(normal); + Msg -> + error_logger:format("~p got unexpected message: ~p\n", + [self(), Msg]), + ?MODULE:loop(Dict, Parent, Debug) + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% sys callbacks + +system_continue(Parent, Debug, Dict) -> + ?MODULE:loop(Dict, Parent, Debug). + +system_terminate(Reason, _Parent, _Debug, _Dict) -> + exit(Reason). + +system_code_change(Dict,_Module,_OldVsn,_Extra) -> + {ok, Dict}. diff --git a/lib/kernel/test/code_SUITE_data/code_archive_dict-1.0/src/code_archive_dict_app.erl b/lib/kernel/test/code_SUITE_data/code_archive_dict-1.0/src/code_archive_dict_app.erl new file mode 100644 index 0000000000..a23ef7001d --- /dev/null +++ b/lib/kernel/test/code_SUITE_data/code_archive_dict-1.0/src/code_archive_dict_app.erl @@ -0,0 +1,29 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(code_archive_dict_app). +-behaviour(application). + +%% Public +-export([start/2, stop/1]). + +start(_Type, Args) -> + code_archive_dict_sup:start_link(Args). + +stop(_State) -> + ok. diff --git a/lib/kernel/test/code_SUITE_data/code_archive_dict-1.0/src/code_archive_dict_sup.erl b/lib/kernel/test/code_SUITE_data/code_archive_dict-1.0/src/code_archive_dict_sup.erl new file mode 100644 index 0000000000..3e427ed34a --- /dev/null +++ b/lib/kernel/test/code_SUITE_data/code_archive_dict-1.0/src/code_archive_dict_sup.erl @@ -0,0 +1,39 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(code_archive_dict_sup). +-behaviour(supervisor). + +%% Public +-export([start_link/1]). + +%% Internal +-export([init/1, start_simple_child/2]). + +-define(CHILD_MOD, code_archive_dict). + +start_link(Debug) -> + supervisor:start_link({local, ?MODULE}, ?MODULE, [Debug]). + +init([Debug]) -> + Flags = {simple_one_for_one, 0, 3600}, + MFA = {?MODULE, start_simple_child, [Debug]}, + {ok, {Flags, [{?MODULE, MFA, transient, timer:seconds(3), worker, [?CHILD_MOD]}]}}. + +start_simple_child(Debug, Name) -> + ?CHILD_MOD:start_link(Name, Debug). |