diff --git a/spec/std/fiber/execution_context/spec_helper.cr b/spec/std/fiber/execution_context/spec_helper.cr index 76a965b28cea..465005bbe5b9 100644 --- a/spec/std/fiber/execution_context/spec_helper.cr +++ b/spec/std/fiber/execution_context/spec_helper.cr @@ -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) diff --git a/spec/std/fiber/list_spec.cr b/spec/std/fiber/list_spec.cr index fb27b865fa57..10fcab1db76a 100644 --- a/spec/std/fiber/list_spec.cr +++ b/spec/std/fiber/list_spec.cr @@ -1,4 +1,4 @@ -require "../spec_helper" +require "../../support/fibers" require "fiber/list" describe Fiber::List do @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 diff --git a/spec/support/fibers.cr b/spec/support/fibers.cr index 1b095a4422d6..92627446837b 100644 --- a/spec/support/fibers.cr +++ b/spec/support/fibers.cr @@ -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 +