Skip to content

Commit 675bcb6

Browse files
committed
Add Docs and show methods
1 parent 062533d commit 675bcb6

File tree

9 files changed

+81
-8
lines changed

9 files changed

+81
-8
lines changed

docs/make.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ makedocs(
1010
"Home" => "index.md",
1111
"Tutorial" => "tutorial.md",
1212
"Topical Guides" => ["Basics" => "guides/basics.md",
13-
"Environments" => "guides/environments.md",],
13+
"Environments" => "guides/environments.md",
14+
"Events" => "guides/events.md",],
1415
"Examples" => ["Ross" => "examples/ross.md",],
1516
"API" => "api.md"
1617
]

docs/src/guides/environments.md

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,64 @@ Note
7474

7575
The function `active_process` is comparable to `Base.Libc.getpid` and returns the current active `Process`. If no process is active, a `NullException` is thrown. A process is active when its process function is being executed. It becomes inactive (or suspended) when it yields an event.
7676

77-
Thus, it only makes sense to call this function from within a process function or a function that is called by your process function:
77+
Thus, it only makes sense to call this function from within a process function or a function that is called by your process function:
78+
79+
```jldoctest
80+
julia> using ResumableFunctions
81+
82+
julia> using SimJulia
83+
84+
julia> function subfunc(env::Environment)
85+
println(active_process(env))
86+
end
87+
subfunc (generic function with 1 method)
88+
89+
julia> @resumable function my_proc(env::Environment)
90+
while true
91+
println(active_process(env))
92+
subfunc(env)
93+
@yield Timeout(env, 1)
94+
end
95+
end
96+
my_proc (generic function with 1 method)
97+
98+
julia> sim = Simulation()
99+
SimJulia.Simulation time: 0.0 active_process: nothing
100+
101+
julia> @process my_proc(sim)
102+
SimJulia.Process 1
103+
104+
julia> active_process(sim)
105+
ERROR: NullException()
106+
[...]
107+
108+
julia> SimJulia.step(sim)
109+
SimJulia.Process 1
110+
SimJulia.Process 1
111+
112+
julia> active_process(sim)
113+
ERROR: NullException()
114+
[...]
115+
```
116+
117+
An exemplary use case for this is the resource system: If a process function calls `request` to request a `Resource`, the resource determines the requesting process via `active_process`.
118+
119+
## Miscellaneous
120+
121+
A generator function can have a return value:
122+
123+
```julia
124+
@resumable function my_proc(env::Environment)
125+
@yield Timeout(sim, 1)
126+
150
127+
end
128+
```
129+
130+
In SimJulia, this can be used to provide return values for processes that can be used by other processes:
131+
132+
```julia
133+
@resumable function other_proc(env::Environment)
134+
ret_val = @yield @process my_proc(env)
135+
@assert ret_val == 150
136+
end
137+
```

docs/src/guides/events.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Events

docs/src/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ julia> @resumable function clock(sim::Simulation, name::String, tick::Float64)
2222
clock (generic function with 1 method)
2323
2424
julia> sim = Simulation()
25-
SimJulia.Simulation(0.0, DataStructures.PriorityQueue{SimJulia.BaseEvent,SimJulia.EventKey,Base.Order.ForwardOrdering}(), 0x0000000000000000, 0x0000000000000000, Nullable{SimJulia.AbstractProcess}())
25+
SimJulia.Simulation time: 0.0 active_process: nothing
2626
2727
julia> @process clock(sim, "fast", 0.5)
2828
SimJulia.Process 1

docs/src/tutorial.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ end
5959

6060
```jldoctest
6161
julia> sim = Simulation()
62-
SimJulia.Simulation(0.0, DataStructures.PriorityQueue{SimJulia.BaseEvent,SimJulia.EventKey,Base.Order.ForwardOrdering}(), 0x0000000000000000, 0x0000000000000000, Nullable{SimJulia.AbstractProcess}())
62+
SimJulia.Simulation time: 0.0 active_process: nothing
6363
6464
julia> @process car(sim)
6565
SimJulia.Process 1
@@ -150,7 +150,7 @@ Starting the simulation is straightforward again: We create a `Simulation`, one
150150

151151
```jldoctest
152152
julia> sim = Simulation()
153-
SimJulia.Simulation(0.0, DataStructures.PriorityQueue{SimJulia.BaseEvent,SimJulia.EventKey,Base.Order.ForwardOrdering}(), 0x0000000000000000, 0x0000000000000000, Nullable{SimJulia.AbstractProcess}())
153+
SimJulia.Simulation time: 0.0 active_process: nothing
154154
155155
julia> @process car(sim)
156156
SimJulia.Process 1
@@ -256,7 +256,7 @@ end
256256

257257
```jldoctest
258258
julia> sim = Simulation()
259-
SimJulia.Simulation(0.0, DataStructures.PriorityQueue{SimJulia.BaseEvent,SimJulia.EventKey,Base.Order.ForwardOrdering}(), 0x0000000000000000, 0x0000000000000000, Nullable{SimJulia.AbstractProcess}())
259+
SimJulia.Simulation time: 0.0 active_process: nothing
260260
261261
julia> car_process = @process car(sim)
262262
SimJulia.Process 1
@@ -331,10 +331,10 @@ end
331331

332332
```jldoctest
333333
julia> sim = Simulation()
334-
SimJulia.Simulation(0.0, DataStructures.PriorityQueue{SimJulia.BaseEvent,SimJulia.EventKey,Base.Order.ForwardOrdering}(), 0x0000000000000000, 0x0000000000000000, Nullable{SimJulia.AbstractProcess}())
334+
SimJulia.Simulation time: 0.0 active_process: nothing
335335
336336
julia> bcs = Resource(sim, 2)
337-
SimJulia.Container{Int64}(SimJulia.Simulation(0.0, DataStructures.PriorityQueue{SimJulia.BaseEvent,SimJulia.EventKey,Base.Order.ForwardOrdering}(), 0x0000000000000000, 0x0000000000000000, Nullable{SimJulia.AbstractProcess}()), 2, 0, 0x0000000000000000, DataStructures.PriorityQueue{SimJulia.Put,SimJulia.ContainerKey{Int64},Base.Order.ForwardOrdering}(), DataStructures.PriorityQueue{SimJulia.Get,SimJulia.ContainerKey{Int64},Base.Order.ForwardOrdering}())
337+
SimJulia.Container{Int64}
338338
```
339339

340340
We can now create the car processes and pass a reference to our resource as well as some additional parameters to them

src/base.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ function show(io::IO, ev::AbstractEvent)
2626
print(io, "$(typeof(ev)) $(ev.bev.id)")
2727
end
2828

29+
function show(io::IO, env::Environment)
30+
active_proc = try get(sim.active_proc) catch; nothing end
31+
print(io, "$(typeof(env)) time: $(now(env)) active_process: $(active_proc)")
32+
end
33+
2934
function environment(ev::AbstractEvent) :: Environment
3035
ev.bev.env
3136
end

src/resources/base.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ abstract type ResourceKey end
22

33
abstract type AbstractResource end
44

5+
function show(io::IO, res::AbstractResource)
6+
print(io, "$(typeof(res))")
7+
end
8+
59
abstract type ResourceEvent <: AbstractEvent end
610

711
struct Put <: ResourceEvent

test/processes.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ end
4242

4343
sim = Simulation()
4444
@process fibonnaci(sim)
45+
println(sim)
4546
run(sim, 10)
4647

4748
sim = Simulation()

test/resources/containers.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ end
1919

2020
sim = Simulation()
2121
res = Resource(sim, 2; level=1)
22+
println(res)
2223
@process generate(sim, res)
2324
run(sim)
2425

0 commit comments

Comments
 (0)