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
}
})