aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaimo Niskanen <[email protected]>2016-10-14 10:08:49 +0200
committerRaimo Niskanen <[email protected]>2016-10-14 10:08:49 +0200
commit5e2d802e29f0a8f81de297f9a3e3922f2d6cd6c0 (patch)
tree66706f557ab80be34b7a4919a5ba8bc34d5dcfaf
parentf4de3f5887be010db178a178e1f20027f3e5d22b (diff)
downloadotp-5e2d802e29f0a8f81de297f9a3e3922f2d6cd6c0.tar.gz
otp-5e2d802e29f0a8f81de297f9a3e3922f2d6cd6c0.tar.bz2
otp-5e2d802e29f0a8f81de297f9a3e3922f2d6cd6c0.zip
Fix race condition in cancel_timer/1
-rw-r--r--lib/stdlib/src/gen_statem.erl11
1 files changed, 6 insertions, 5 deletions
diff --git a/lib/stdlib/src/gen_statem.erl b/lib/stdlib/src/gen_statem.erl
index 5c750cb93d..17d1ebecec 100644
--- a/lib/stdlib/src/gen_statem.erl
+++ b/lib/stdlib/src/gen_statem.erl
@@ -1609,13 +1609,14 @@ cancel_timer(undefined) ->
ok;
cancel_timer(TRef) ->
case erlang:cancel_timer(TRef) of
- TimeLeft when is_integer(TimeLeft) ->
- ok;
false ->
+ %% We have to assume that TRef is the ref of a running timer
+ %% and if so the timer has expired
+ %% hence we must wait for the timeout message
receive
{timeout,TRef,_} ->
ok
- after 0 ->
- ok
- end
+ end;
+ _TimeLeft ->
+ ok
end.