aboutsummaryrefslogtreecommitdiffstats
path: root/lib/percept/src
diff options
context:
space:
mode:
authorBjörn-Egil Dahlberg <[email protected]>2010-12-29 17:59:41 +0100
committerBjörn-Egil Dahlberg <[email protected]>2010-12-29 17:59:46 +0100
commitdb945cc0cb32457903854d9b4b1c00af3d68cde6 (patch)
tree3047df07479ff5c675fd258ba008e203c33b3110 /lib/percept/src
parenta80e777da60fe15b30e73ebbe37bb2b5c145b91c (diff)
parent638a610d0b7ada7b2099b6127410aafb9fae3313 (diff)
downloadotp-db945cc0cb32457903854d9b4b1c00af3d68cde6.tar.gz
otp-db945cc0cb32457903854d9b4b1c00af3d68cde6.tar.bz2
otp-db945cc0cb32457903854d9b4b1c00af3d68cde6.zip
Merge branch 'ao/percept-race-cond' into dev
* ao/percept-race-cond: Fixes a race condition found in percept_db start/1 function. OTP-9012
Diffstat (limited to 'lib/percept/src')
-rw-r--r--lib/percept/src/percept_db.erl49
1 files changed, 40 insertions, 9 deletions
diff --git a/lib/percept/src/percept_db.erl b/lib/percept/src/percept_db.erl
index edb0d79a29..52e9afb78f 100644
--- a/lib/percept/src/percept_db.erl
+++ b/lib/percept/src/percept_db.erl
@@ -33,7 +33,7 @@
]).
-include("percept.hrl").
-
+-define(STOP_TIMEOUT, 1000).
%%==========================================================================
%%
%% Type definitions
@@ -77,17 +77,32 @@
start() ->
case erlang:whereis(percept_db) of
undefined ->
- Pid = spawn( fun() -> init_percept_db() end),
- erlang:register(percept_db, Pid),
- {started, Pid};
+ {started, do_start()};
PerceptDB ->
- erlang:unregister(percept_db),
- PerceptDB ! {action, stop},
- Pid = spawn( fun() -> init_percept_db() end),
- erlang:register(percept_db, Pid),
- {restarted, Pid}
+ {restarted, restart(PerceptDB)}
end.
+%% @spec restart(pid()) -> pid()
+%% @private
+%% @doc restarts the percept database.
+
+-spec restart(pid())-> pid().
+
+restart(PerceptDB)->
+ stop_sync(PerceptDB),
+ do_start().
+
+%% @spec do_start(pid()) -> pid()
+%% @private
+%% @doc starts the percept database.
+
+-spec do_start()-> pid().
+
+do_start()->
+ Pid = spawn( fun() -> init_percept_db() end),
+ erlang:register(percept_db, Pid),
+ Pid.
+
%% @spec stop() -> not_started | {stopped, Pid}
%% Pid = pid()
%% @doc Stops the percept database.
@@ -103,6 +118,22 @@ stop() ->
{stopped, Pid}
end.
+%% @spec stop_sync(pid()) -> true
+%% @private
+%% @doc Stops the percept database, with a synchronous call.
+
+-spec stop_sync(pid())-> true.
+
+stop_sync(Pid)->
+ MonitorRef = erlang:monitor(process, Pid),
+ stop(),
+ receive
+ {'DOWN', MonitorRef, _Type, Pid, _Info}->
+ true
+ after ?STOP_TIMEOUT->
+ exit(Pid, kill)
+ end.
+
%% @spec insert(tuple()) -> ok
%% @doc Inserts a trace or profile message to the database.