gen server - Erlang gen_server implementation -
in code below, why module prime_server
not loading?
-module(prime_server). -behaviour(gen_server). -export([new_prime/1, start_link/0]). %% gen_server callbacks -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). start_link() -> gen_server:start_link({local, ?module}, ?module, [], []). new_prime(n) -> %% 20000 timeout (ms) gen_server:call(?module, {prime, n}, 20000). init([]) -> %% note must set trap_exit = true if %% want terminate/2 called when application %% stopped process_flag(trap_exit, true), io:format("~p starting~n" ,[?module]), {ok, 0}. handle_call({prime, k}, _from, n) -> {reply, make_new_prime(k), n+1}. handle_cast(_msg, n) -> {noreply, n}. handle_info(_info, n) -> {noreply, n}. terminate(_reason, _n) -> io:format("~p stopping~n" ,[?module]), ok. code_change(_oldvsn, n, _extra) -> {ok, n}. make_new_prime(k) -> if k > 100 -> alarm_handler:set_alarm(toohot), n = lib_primes:make_prime(k), alarm_handler:clear_alarm(toohot), n; true -> lib_primes:make_prime(k) end.
output:
$ erl -boot start_sasl 1>c(prime_server). {ok,prime_server} 2>c(my_alarm_handler). my_alarm_handler.erl:2: warning: undefined callback function code_change/3 (behaviour 'gen_event') my_alarm_handler.erl:19: warning: variable 'reply' unused {ok,my_alarm_handler} 3> {ok, pid} = prime_server:start_link(). prime_server starting {ok, <0.73.0>} 4> prime_server:new_prime(6). prime_server stopping =error report==== 24-mar-2014::10:59:39 === ** generic server prime_server terminating ** last message in {prime,6} ** when server state == 0 ** reason termination == ** {'module not loaded', [{lib_primes,make_prime,[6],[]}, {prime_server,handle_call,3,[{file,"prime_server.erl"},{line,21}]}, {gen_server,handle_msg,5,[{file,"gen_server.erl"},{line,585}]}, {proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,239}]}]} =crash report==== 24-mar-2014::10:59:39 === crasher: initial call: prime_server:init/1 pid: <0.73.0> registered_name: prime_server exception exit: {undef, [{lib_primes,make_prime,[6],[]}, {prime_server,handle_call,3, [{file,"prime_server.erl"},{line,21}]}, {gen_server,handle_msg,5, [{file,"gen_server.erl"},{line,585}]}, {proc_lib,init_p_do_apply,3, [{file,"proc_lib.erl"},{line,239}]}]} in function gen_server:terminate/6 (gen_server.erl, line 744) ancestors: [<0.71.0>] messages: [] links: [<0.71.0>] dictionary: [] trap_exit: true status: running heap_size: 610 stack_size: 27 reductions: 181 neighbours: neighbour: [{pid,<0.71.0>}, {registered_name,[]}, {initial_call,{erlang,apply,2}}, {current_function,{gen,do_call,4}}, {ancestors,[]}, {messages,[]}, {links,[<0.27.0>,<0.73.0>]}, {dictionary,[]}, {trap_exit,false}, {status,waiting}, {heap_size,610}, {stack_size,36}, {reductions,1303}] ** exception exit: undef in function lib_primes:make_prime/1 called lib_primes:make_prime(6) in call prime_server:handle_call/3 (prime_server.erl, line 21) in call gen_server:handle_msg/5 (gen_server.erl, line 585) in call proc_lib:init_p_do_apply/3 (proc_lib.erl, line 239) 9> gen_server:call(prime_server, 6). ** exception exit: {noproc,{gen_server,call,[prime_server,6]}} in function gen_server:call/2 (gen_server.erl, line 180) 10> gen_server:call(prime_server, new_prime, 6). ** exception exit: {noproc,{gen_server,call,[prime_server,new_prime,6]}} in function gen_server:call/3 (gen_server.erl, line 188) 11> gen_server:call(prime_server, new_prime(5), []). ** exception error: undefined shell command new_prime/1 12> gen_server:call(prime_server, {prime, 4}, []). ** exception exit: {{function_clause, [{gen,call, [prime_server,'$gen_call',{prime,4},[]], [{file,"gen.erl"},{line,147}]}, {gen_server,call,3, [{file,"gen_server.erl"},{line,184}]}, {erl_eval,do_apply,6, [{file,"erl_eval.erl"},{line,573}]}, {shell,exprs,7,[{file,"shell.erl"},{line,674}]}, {shell,eval_exprs,7,[{file,"shell.erl"},{line,629}]}, {shell,eval_loop,3,[{file,"shell.erl"},{line,614}]}]}, {gen_server,call,[prime_server,{prime,4},[]]}}
{'module not loaded',
[{lib_primes,make_prime,[6],[]}, {prime_server,handle_call,3,[{file,"prime_server.erl"},{line,21}]}, {gen_server,handle_msg,5,[{file,"gen_server.erl"},{line,585}]}, {proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,239}]}]}
from log, use module lib_primes
, have file lib_primes.erl
?
i think should compiule , load module lib_primes
first.
Comments
Post a Comment