Skip to content

Commit 07fefee

Browse files
committed
Allow epocxy_ets_fsm to give up ownership of an ets table
1 parent edd10ec commit 07fefee

1 file changed

Lines changed: 13 additions & 4 deletions

File tree

src/epocxy_ets_fsm.erl

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@
3030
-export([
3131
start_link/0,
3232
create_ets_table/1, create_ets_table/2,
33-
delete_ets_table/1
33+
delete_ets_table/1,
34+
change_owner/2
3435
]).
3536

3637
%% gen_fsm state functions
@@ -56,6 +57,7 @@
5657
-spec create_ets_table(ets_concurrency()) -> ets:tid().
5758
-spec create_ets_table(atom(), ets_concurrency()) -> ets:tid().
5859
-spec delete_ets_table(atom() | ets:tid()) -> ok.
60+
-spec change_owner(atom() | ets:tid(), pid()) -> ok.
5961

6062
start_link() ->
6163
gen_fsm:start_link({local, ?SERVER}, ?MODULE, {}, []).
@@ -72,6 +74,9 @@ create_ets_table(Name, Concurrency_Type)
7274
delete_ets_table(Table_Id_Or_Name) ->
7375
gen_fsm:sync_send_event(?SERVER, {delete_ets_table, Table_Id_Or_Name}).
7476

77+
change_owner(Table_Id_Or_Name, New_Owner) ->
78+
gen_fsm:sync_send_event(?SERVER, {change_owner, Table_Id_Or_Name, New_Owner}).
79+
7580
make_options(none) -> make_base_options([]);
7681
make_options(read_only) -> make_base_options([{read_concurrency, true}]);
7782
make_options(write_only) -> make_base_options([{write_concurrency, true}]);
@@ -110,9 +115,13 @@ code_change (_OldVsn, State_Name, #eef_state{} = State, _Extra) -> {ok, State_N
110115
(delete_ets_cmd(), from(), internal_state()) -> ok;
111116
(stop_cmd(), from(), internal_state()) -> {stop, normal}.
112117

113-
'READY'({create_ets_table, Name, Options}, _From, #eef_state{} = State) when is_atom(Name), is_list(Options) -> {reply, ets:new(Name, Options), 'READY', State};
114-
'READY'({create_ets_table, Options}, _From, #eef_state{} = State) when is_list(Options) -> {reply, ets:new(noname, Options), 'READY', State};
115-
'READY'({delete_ets_table, Table}, _From, #eef_state{} = State) when is_atom(Table); is_integer(Table) -> {reply, ets:delete(Table), 'READY', State};
118+
-define(READY(__Cmd), 'READY'(__Cmd, _From, #eef_state{} = State)).
119+
-define(REPLY(__Reply), {reply, __Reply, 'READY', State}).
120+
121+
?READY({create_ets_table, Options}) when is_list(Options) -> ?REPLY(ets:new(noname, Options));
122+
?READY({create_ets_table, Name, Options}) when is_list(Options), is_atom(Name) -> ?REPLY(ets:new(Name, Options));
123+
?READY({delete_ets_table, Table}) when is_atom(Table); is_integer(Table) -> ?REPLY(ets:delete(Table));
124+
?READY({change_owner, Table, Pid}) when is_atom(Table); is_integer(Table) -> ?REPLY(ets:give_away(Table, Pid, {}));
116125

117126
%% Stop the ets owner FSM process.
118127
'READY'(stop, _From, #eef_state{}) -> {stop, normal}.

0 commit comments

Comments
 (0)