1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
-module(portc).
-vsn(2).
-behaviour(gen_server).
-export([get_data/0]).
-export([init/1, handle_call/3, handle_info/2, code_change/3]).
-record(state, {port, data}).
get_data() -> gen_server:call(portc, get_data).
init([]) ->
PortProg = code:priv_dir(foo) ++ "/bin/portc",
Port = open_port({spawn, PortProg}, [binary, {packet, 2}]),
{ok, #state{port = Port}}.
handle_call(get_data, _From, State) ->
{reply, {ok, State#state.data}, State}.
handle_info({Port, Cmd}, State) ->
NewState = do_cmd(Cmd, State),
{noreply, NewState}.
code_change(_, State, change_port_only) ->
State#state.port ! close,
receive
{Port, closed} -> true
end,
NPortProg = code:priv_dir(foo) ++ "/bin/portc", % get new version
NPort = open_port({spawn, NPortProg}, [binary, {packet, 2}]),
{ok, State#state{port = NPort}};
code_change(1, State, change_erl_only) ->
NState = transform_state(State),
{ok, NState}.
|