Skip to content

Commit 5269c50

Browse files
committed
use ResumableFunctions
1 parent df79c2f commit 5269c50

15 files changed

Lines changed: 73 additions & 333 deletions

File tree

REQUIRE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
julia 0.6
22
DataStructures
3+
ResumableFunctions
34
TaylorSeries

src/SimJulia.jl

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ module SimJulia
77

88
using DataStructures
99
using Base.Dates
10+
using ResumableFunctions
1011
using TaylorSeries
1112

1213
import Base.run, Base.now, Base.isless, Base.show, Base.interrupt, Base.yield, Base.length
@@ -24,7 +25,6 @@ module SimJulia
2425
export nowDatetime
2526
export Process, @process
2627
export yield, interrupt
27-
export FiniteStateMachine, @resumable, @yield
2828
export Coroutine, @coroutine
2929
export Container, Resource, Store
3030
export Put, Get, Request, Release, cancel, capacity, request, @request
@@ -41,9 +41,6 @@ module SimJulia
4141
include("utils/time.jl")
4242
include("tasks/base.jl")
4343
include("processes.jl")
44-
include("finitestatemachines/utils.jl")
45-
include("finitestatemachines/transforms.jl")
46-
include("finitestatemachines/macros.jl")
4744
include("coroutines.jl")
4845
include("resources/base.jl")
4946
include("resources/containers.jl")

src/coroutines.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
mutable struct Coroutine <: DiscreteProcess
22
bev :: BaseEvent
3-
fsm :: FiniteStateMachine
3+
fsm :: ResumableFunctions.FiniteStateMachineIterator
44
target :: AbstractEvent
55
resume :: Function
66
function Coroutine(func::Function, env::Environment, args::Any...)
@@ -26,7 +26,7 @@ function execute(ev::AbstractEvent, proc::Coroutine)
2626
set_active_process(env, proc)
2727
target = proc.fsm(value(ev))
2828
reset_active_process(env)
29-
if iscoroutinedone(proc.fsm)
29+
if done(proc.fsm)
3030
schedule(proc; value=target)
3131
else
3232
proc.target = state(target) == triggered ? Timeout(env; value=value(target)) : target
@@ -38,7 +38,7 @@ function execute(ev::AbstractEvent, proc::Coroutine)
3838
end
3939

4040
function interrupt(proc::Coroutine, cause::Any=nothing)
41-
if !iscoroutinedone(proc.fsm)
41+
if !done(proc.fsm)
4242
remove_callback(proc.resume, proc.target)
4343
proc.target = Timeout(environment(proc); priority=typemax(Int8), value=InterruptException(proc, cause))
4444
proc.resume = @callback execute(proc.target, proc)

src/finitestatemachines/macros.jl

Lines changed: 0 additions & 54 deletions
This file was deleted.

src/finitestatemachines/transforms.jl

Lines changed: 0 additions & 85 deletions
This file was deleted.

src/finitestatemachines/utils.jl

Lines changed: 0 additions & 34 deletions
This file was deleted.

src/odes/macros.jl

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,27 @@ function number_parameters(ex, n::Int, p::Symbol)
2323
n
2424
end
2525

26+
function getArguments(expr) :: Vector{Symbol}
27+
args = Symbol[]
28+
kws = Symbol[]
29+
params = Symbol[]
30+
expr_args = expr.args[1].head == :call ? expr.args[1].args : expr.args[1].args[1].args
31+
for arg in expr_args
32+
if isa(arg, Symbol)
33+
push!(args, arg)
34+
elseif arg.head == Symbol("::")
35+
push!(args, arg.args[1])
36+
elseif arg.head == :kw
37+
isa(arg.args[1], Symbol) ? push!(kws, arg.args[1]) : push!(kws, arg.args[1].args[1])
38+
elseif arg.head == :parameters
39+
for arg2 in arg.args
40+
isa(arg2.args[1], Symbol) ? push!(params, arg2.args[1]) : push!(params, arg2.args[1].args[1])
41+
end
42+
end
43+
end
44+
[args; kws; params]
45+
end
46+
2647
macro model(expr::Expr)
2748
expr.head != :function && error("Expression is not a function definition!")
2849
args = getArguments(expr)

test/benchmarks/coroutines_MM1.jl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
1-
using SimJulia, Distributions, BenchmarkTools
1+
using ResumableFunctions, SimJulia, Distributions, BenchmarkTools
22

33
@resumable function exp_source(sim::Simulation, lambd::Float64, server::Resource, mu::Float64)
44
while true
55
dt = rand(Exponential(1 / lambd))
6-
@yield return Timeout(sim, dt)
6+
@yield Timeout(sim, dt)
77
@coroutine customer2(sim, server, mu)
88
end
99
end
1010

1111
@resumable function customer(sim::Simulation, server::Resource, mu::Float64)
12-
@yield return Request(server)
12+
@yield Request(server)
1313
dt = rand(Exponential(1 / mu))
14-
@yield return Timeout(sim, dt)
15-
@yield return Release(server)
14+
@yield Timeout(sim, dt)
15+
@yield Release(server)
1616
end
1717

1818
@resumable function customer2(sim::Simulation, server::Resource, mu::Float64)
1919
@request server req begin
20-
@yield return req
20+
@yield req
2121
dt = rand(Exponential(1 / mu))
22-
@yield return Timeout(sim, dt)
22+
@yield Timeout(sim, dt)
2323
end
2424
end
2525

test/benchmarks/coroutines_fibonnaci.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
using SimJulia, BenchmarkTools
1+
using ResumableFunctions, SimJulia, BenchmarkTools
22

33
@resumable function fibonnaci(sim::Simulation)
44
a = 0.0
55
b = 1.0
66
while true
7-
@yield return Timeout(sim, 1)
7+
@yield Timeout(sim, 1)
88
a, b = b, a+b
99
end
1010
end

test/containers.jl

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1+
workspace()
2+
13
using SimJulia
4+
using ResumableFunctions
25

3-
@resumable function client(sim::Simulation, res::Resource, i::Int, priority::Int)
6+
@resumable function client(sim::Simulation, res::Resource, i::Int, prior::Int)
47
println("$(now(sim)), client $i is waiting")
5-
@yield return Request(res, priority=priority)
8+
@yield Request(res, priority=prior)
69
println("$(now(sim)), client $i is being served")
7-
@yield return Timeout(sim, rand())
10+
@yield Timeout(sim, rand())
811
println("$(now(sim)), client $i has been served")
9-
@yield return Release(res)
12+
@yield Release(res)
1013
end
1114

1215
@resumable function generate(sim::Simulation, res::Resource)
13-
i = 1
14-
while true
16+
for i in 1:10
1517
@coroutine client(sim, res, i, 10-i)
16-
@yield return Timeout(sim, 0.5*rand())
17-
i == 10 && break
18-
i += 1
18+
@yield Timeout(sim, 0.5*rand())
1919
end
2020
end
2121

@@ -25,38 +25,30 @@ res = Resource(sim, 2; level=1)
2525
run(sim)
2626

2727
@resumable function my_consumer(sim::Simulation, con::Container)
28-
i = 1
29-
while true
28+
for i in 1:10
3029
amount = 3*rand()
3130
println("$(now(sim)), consumer is demanding $amount")
32-
@yield return Timeout(sim, 1.0*rand())
31+
@yield Timeout(sim, 1.0*rand())
3332
get_ev = Get(con, amount)
34-
val = @yield return get_ev | Timeout(sim, rand())
33+
val = @yield get_ev | Timeout(sim, rand())
3534
if val[get_ev].state == SimJulia.triggered
36-
level = con.level
37-
println("$(now(sim)), consumer is being served, level is $level")
38-
@yield return Timeout(sim, 5.0*rand())
35+
println("$(now(sim)), consumer is being served, level is ", con.level)
36+
@yield Timeout(sim, 5.0*rand())
3937
else
4038
println("$(now(sim)), consumer has timed out")
4139
cancel(con, get_ev)
4240
end
43-
i == 10 && break
44-
i += 1
4541
end
4642
end
4743

4844
@resumable function my_producer(sim::Simulation, con::Container)
49-
i = 1
50-
while true
45+
for i in 1:10
5146
amount = 2*rand()
5247
println("$(now(sim)), producer is offering $amount")
53-
@yield return Timeout(sim, 1.0*rand())
54-
@yield return Put(con, amount)
55-
level = con.level
56-
println("$(now(sim)), producer is being served, level is $level")
57-
@yield return Timeout(sim, 5.0*rand())
58-
i == 10 && break
59-
i += 1
48+
@yield Timeout(sim, 1.0*rand())
49+
@yield Put(con, amount)
50+
println("$(now(sim)), producer is being served, level is ", con.level)
51+
@yield Timeout(sim, 5.0*rand())
6052
end
6153
end
6254

0 commit comments

Comments
 (0)