diff --git a/.changeset/fix-fiberhandle-clear.md b/.changeset/fix-fiberhandle-clear.md new file mode 100644 index 00000000000..9b2d91e037a --- /dev/null +++ b/.changeset/fix-fiberhandle-clear.md @@ -0,0 +1,5 @@ +--- +"effect": patch +--- + +fix(FiberHandle): prevent clear() from wiping newer fiber during interrupt wait diff --git a/packages/effect/src/FiberHandle.ts b/packages/effect/src/FiberHandle.ts index d9112671abf..e2eb3859832 100644 --- a/packages/effect/src/FiberHandle.ts +++ b/packages/effect/src/FiberHandle.ts @@ -313,10 +313,12 @@ export const clear = (self: FiberHandle): Effect.Effect => if (self.state._tag === "Closed" || self.state.fiber === undefined) { return Effect.void } + const target = self.state.fiber + return Effect.zipRight( - restore(Fiber.interruptAs(self.state.fiber, FiberId.combine(fiber.id(), internalFiberId))), + restore(Fiber.interruptAs(target, FiberId.combine(fiber.id(), internalFiberId))), Effect.sync(() => { - if (self.state._tag === "Open") { + if (self.state._tag === "Open" && self.state.fiber === target) { self.state.fiber = undefined } })