With earlier changes, Prog::Base#donate is only called by Prog::Base#reap (outside a couple of test calls that don't need to call it). Moving donate into reap avoids a redundant child query. When we would call donate, we already know which children are active, because reap already selected all children, and separated them into reapable children and active children.
149 lines
2.4 KiB
Ruby
149 lines
2.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# A no-operation prog for testing.
|
|
class Prog::Test < Prog::Base
|
|
subject_is :sshable
|
|
semaphore :test_semaphore
|
|
|
|
label def start
|
|
end
|
|
|
|
private def fib(n)
|
|
if n < 2
|
|
1
|
|
else
|
|
fib(n - 2) + fib(n - 1)
|
|
end
|
|
end
|
|
|
|
megabyte = (" " * 1024 * 1024)
|
|
|
|
3.times do |n|
|
|
n1 = n + 1
|
|
label(define_method(:"smoke_test_#{n1}") do
|
|
when_test_semaphore_set? do
|
|
decr_test_semaphore
|
|
dynamic_hop :"smoke_test_#{n}"
|
|
end
|
|
|
|
incr_test_semaphore
|
|
|
|
# CPU
|
|
fib(rand(15...25))
|
|
|
|
# IO
|
|
rand(20).times do
|
|
File.write(File::NULL, megabyte)
|
|
end
|
|
|
|
print n1
|
|
nap rand
|
|
end)
|
|
end
|
|
|
|
label def smoke_test_0
|
|
nap 1000
|
|
end
|
|
|
|
label def pusher1
|
|
pop "1" if retval
|
|
push Prog::Test, {test_level: "2"}, :pusher2
|
|
end
|
|
|
|
label def pusher2
|
|
pop frame["test_level"] if retval
|
|
push Prog::Test, {test_level: "3"}, :pusher3
|
|
end
|
|
|
|
label def pusher3
|
|
pop frame["test_level"]
|
|
end
|
|
|
|
label def hop_entry
|
|
hop_hop_exit
|
|
end
|
|
|
|
label def hop_exit
|
|
pop({msg: "hop finished"})
|
|
end
|
|
|
|
label def reaper
|
|
# below loop is only for ensuring we are able to process reaped strands
|
|
reap(reaper: :exitval.to_proc)
|
|
end
|
|
|
|
label def reap_exit_no_children
|
|
reap { pop({msg: "reap_exit_no_children"}) }
|
|
end
|
|
|
|
label def failer
|
|
fail "failure"
|
|
end
|
|
|
|
label def napper
|
|
nap(123)
|
|
end
|
|
|
|
label def popper
|
|
pop({msg: "popped"})
|
|
end
|
|
|
|
label def invalid_hop
|
|
dynamic_hop "hop_exit"
|
|
end
|
|
|
|
label def invalid_hop_target
|
|
dynamic_hop :black_hole
|
|
end
|
|
|
|
label def budder
|
|
bud self.class, frame, :popper
|
|
hop_reaper
|
|
end
|
|
|
|
label def increment_semaphore
|
|
incr_test_semaphore
|
|
nap 1
|
|
end
|
|
|
|
label def decrement_semaphore
|
|
decr_test_semaphore
|
|
nap 1
|
|
end
|
|
|
|
label def set_expired_deadline
|
|
register_deadline("pusher2", -1)
|
|
hop_pusher1
|
|
end
|
|
|
|
label def extend_deadline
|
|
register_deadline("pusher2", 1, allow_extension: true)
|
|
hop_pusher1
|
|
end
|
|
|
|
label def set_popping_deadline1
|
|
push Prog::Test, {}, :set_popping_deadline2
|
|
end
|
|
|
|
label def set_popping_deadline_via_bud
|
|
bud Prog::Test, {}, :set_popping_deadline2
|
|
hop_reaper
|
|
end
|
|
|
|
label def set_popping_deadline2
|
|
register_deadline("pusher2", -1)
|
|
hop_popper
|
|
end
|
|
|
|
label def bad_pop
|
|
pop nil
|
|
end
|
|
|
|
label def push_subject_id
|
|
push Prog::Test, {"subject_id" => "70b633b7-1d24-4526-a47f-d2580597d53f"}
|
|
end
|
|
end
|
|
|
|
class Prog::Test2 < Prog::Test
|
|
end
|