Skip to content

Commit

Permalink
Move new_fake_fiber to spec/support/fibers + use it in fiber/list_spec
Browse files Browse the repository at this point in the history
  • Loading branch information
ysbaddaden committed Feb 4, 2025
1 parent 341b84c commit 2655a7a
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 37 deletions.
18 changes: 1 addition & 17 deletions spec/std/fiber/execution_context/spec_helper.cr
Original file line number Diff line number Diff line change
@@ -1,25 +1,9 @@
require "../../spec_helper"
require "../../../support/fibers"
require "crystal/system/thread_wait_group"
require "fiber/execution_context/runnables"
require "fiber/execution_context/global_queue"

# Fake stack for `makecontext` to have somewhere to write in #initialize; We
# don't actually run the fiber. The worst case is windows with ~300 bytes (with
# shadow space and alignment taken into account). We allocate more to be safe.
FAKE_FIBER_STACK = GC.malloc(512)

def new_fake_fiber(name = nil)
stack = FAKE_FIBER_STACK
stack_bottom = FAKE_FIBER_STACK + 128

{% if flag?(:execution_context) %}
execution_context = Fiber::ExecutionContext.current
Fiber.new(name, stack, stack_bottom, execution_context) { }
{% else %}
Fiber.new(name, stack, stack_bottom) { }
{% end %}
end

module Fiber::ExecutionContext
class FiberCounter
def initialize(@fiber : Fiber)
Expand Down
40 changes: 20 additions & 20 deletions spec/std/fiber/list_spec.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
require "../spec_helper"
require "../../support/fibers"
require "fiber/list"

describe Fiber::List do
Expand All @@ -12,8 +12,8 @@ describe Fiber::List do
end

it "creates a filled queue" do
f1 = Fiber.new(name: "f1") { }
f2 = Fiber.new(name: "f2") { }
f1 = new_fake_fiber("f1")
f2 = new_fake_fiber("f2")
f1.list_next = f2
f2.list_next = nil

Expand All @@ -28,9 +28,9 @@ describe Fiber::List do
describe "#push" do
it "to head" do
list = Fiber::List.new
f1 = Fiber.new(name: "f1") { }
f2 = Fiber.new(name: "f2") { }
f3 = Fiber.new(name: "f3") { }
f1 = new_fake_fiber("f1")
f2 = new_fake_fiber("f2")
f3 = new_fake_fiber("f3")

# simulate fibers previously added to other queues
f1.list_next = f3
Expand Down Expand Up @@ -65,9 +65,9 @@ describe Fiber::List do
describe "#bulk_unshift" do
it "to empty queue" do
# manually create a queue
f1 = Fiber.new(name: "f1") { }
f2 = Fiber.new(name: "f2") { }
f3 = Fiber.new(name: "f3") { }
f1 = new_fake_fiber("f1")
f2 = new_fake_fiber("f2")
f3 = new_fake_fiber("f3")
f3.list_next = f2
f2.list_next = f1
f1.list_next = nil
Expand All @@ -82,11 +82,11 @@ describe Fiber::List do
end

it "to filled queue" do
f1 = Fiber.new(name: "f1") { }
f2 = Fiber.new(name: "f2") { }
f3 = Fiber.new(name: "f3") { }
f4 = Fiber.new(name: "f4") { }
f5 = Fiber.new(name: "f5") { }
f1 = new_fake_fiber("f1")
f2 = new_fake_fiber("f2")
f3 = new_fake_fiber("f3")
f4 = new_fake_fiber("f4")
f5 = new_fake_fiber("f5")

# source queue
f3.list_next = f2
Expand Down Expand Up @@ -115,9 +115,9 @@ describe Fiber::List do

describe "#pop" do
it "from head" do
f1 = Fiber.new(name: "f1") { }
f2 = Fiber.new(name: "f2") { }
f3 = Fiber.new(name: "f3") { }
f1 = new_fake_fiber("f1")
f2 = new_fake_fiber("f2")
f3 = new_fake_fiber("f3")
f3.list_next = f2
f2.list_next = f1
f1.list_next = nil
Expand Down Expand Up @@ -149,9 +149,9 @@ describe Fiber::List do

describe "#pop?" do
it "from head" do
f1 = Fiber.new(name: "f1") { }
f2 = Fiber.new(name: "f2") { }
f3 = Fiber.new(name: "f3") { }
f1 = new_fake_fiber("f1")
f2 = new_fake_fiber("f2")
f3 = new_fake_fiber("f3")
f3.list_next = f2
f2.list_next = f1
f1.list_next = nil
Expand Down
18 changes: 18 additions & 0 deletions spec/support/fibers.cr
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,21 @@ def wait_until_finished(f : Fiber, timeout = 5.seconds)
raise "Fiber failed to finish within #{timeout}" if (Time.monotonic - now) > timeout
end
end

# Fake stack for `makecontext` to have somewhere to write in #initialize; We
# don't actually run the fiber. The worst case is windows with ~300 bytes (with
# shadow space and alignment taken into account). We allocate more to be safe.
FAKE_FIBER_STACK = GC.malloc(512)

def new_fake_fiber(name = nil)
stack = FAKE_FIBER_STACK
stack_bottom = FAKE_FIBER_STACK + 128

{% if flag?(:execution_context) %}
execution_context = Fiber::ExecutionContext.current
Fiber.new(name, stack, stack_bottom, execution_context) { }
{% else %}
Fiber.new(name, stack, stack_bottom) { }
{% end %}
end

0 comments on commit 2655a7a

Please sign in to comment.