Skip to content

Commit

Permalink
Make timedout/2 work for jobs_queue_list based queues.
Browse files Browse the repository at this point in the history
  • Loading branch information
jlouis committed Mar 11, 2012
1 parent e7450c9 commit 5a8e59e
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 15 deletions.
7 changes: 3 additions & 4 deletions src/jobs_queue_list.erl
Expand Up @@ -40,7 +40,6 @@
timedout/1, timedout/2]).

-include("jobs.hrl").
-import(jobs_lib, [timestamp/0]).

%-type timestamp() :: integer().
-type job() :: {pid(), reference()}.
Expand Down Expand Up @@ -123,10 +122,10 @@ timedout(#queue{max_time = TO} = Q) ->

timedout(_ , #queue{oldest_job = undefined}) -> [];
timedout(TO, #queue{st = L} = Q) ->
Now = timestamp(),
Now = jobs_lib:timestamp(),
{Left, Timedout} = lists:splitwith(fun({TS,_}) ->
not(is_expired(TS,Now,TO))
end, L),
not(is_expired(TS,Now,TO))
end, L),
OJ = get_oldest_job(Left),
{Timedout, Q#queue{oldest_job = OJ, st = Left}}.

Expand Down
6 changes: 3 additions & 3 deletions test/jobs_eqc_queue.erl
Expand Up @@ -38,7 +38,7 @@ g_time_advance() ->
?LET(N, nat(), N+1).

g_model_type() ->
oneof([jobs_queue, jobs_queue_list]).
oneof([jobs_queue_list]).

g_model(Ty) ->
?SIZED(Size, g_model(Size, Ty)).
Expand All @@ -58,7 +58,7 @@ g_model(N, Ty) ->
[M, g_time_advance()]}},
{200, {call, ?MODULE, in, [Ty, g_job(), M]}},
{100, {call, ?MODULE, out, [Ty, nat(), M]}},
%%{20, {call, ?MODULE, timedout, [Ty, M]}},
{20, {call, ?MODULE, timedout, [Ty, M]}},
{1, {call, ?MODULE, empty, [Ty, M]}}
]))}
]).
Expand Down Expand Up @@ -125,7 +125,7 @@ obs() ->
oneof([{call, ?MODULE, all, [Ty, M]},
{call, ?MODULE, peek, [Ty, M]},
{call, ?MODULE, info, [Ty, g_info(), M]},
%% {call, ?MODULE, timedout_obs, [Ty, M]},
{call, ?MODULE, timedout_obs, [Ty, M]},
{call, ?MODULE, is_empty, [Ty, M]}])
end).

Expand Down
19 changes: 12 additions & 7 deletions test/jobs_queue_model.erl
Expand Up @@ -23,26 +23,31 @@ info(max_time, #queue { max_time = MT}) -> MT;
info(length, #queue { st = Q}) ->
queue:len(Q).

timedout(#queue { max_time = undefined} = Q) ->
timedout(#queue { max_time = undefined}) ->
%% This return value is highly illogical, but it is what the code returns!
[];
timedout(#queue { max_time = TO, st = Queue} = Q) ->
timedout(#queue { type = Ty,
max_time = TO, st = Queue} = Q) ->
Now = jobs_lib:timestamp(),
QL = queue:to_list(Queue),
{Left, Timedout} = lists:splitwith(
{Left, Timedout} = lists:partition(
fun({TS, _}) ->
not(is_expired(TS, Now, TO))
end, QL),
OJ = get_oldest_job(Left),
{Timedout, Q#queue { oldest_job = OJ,
st = queue:from_list(Left)}}.
{case Ty of
fifo -> Timedout;
lifo -> lists:reverse(Timedout)
end, Q#queue { oldest_job = OJ,
st = queue:from_list(Left)}}.

is_expired(TS, Now, TO) ->
(Now - TS) > TO.
MS = Now - TS,
MS > TO.

get_oldest_job([]) -> undefined;
get_oldest_job(L) ->
element(1, hd(lists:reverse(L))).
lists:min([TS || {TS, _} <- L]).

peek(#queue { type = fifo, st = Q }) ->
case queue:peek(Q) of
Expand Down
5 changes: 4 additions & 1 deletion test/t.erl
Expand Up @@ -3,4 +3,7 @@
-compile(export_all).

t() ->
jobs_eqc_queue:test().
t(300).

t(N) ->
jobs_eqc_queue:test(N).

0 comments on commit 5a8e59e

Please sign in to comment.