-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}.