Skip to content

Commit b74255a

Browse files
authoredFeb 23, 2025··
ensure fibers can't be added to Fiber{Handle,Set,Map} during closing (#4496)
1 parent 9dd8979 commit b74255a

File tree

4 files changed

+36
-21
lines changed

4 files changed

+36
-21
lines changed
 

‎.changeset/grumpy-lions-remain.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"effect": patch
3+
---
4+
5+
ensure fibers can't be added to Fiber{Handle,Set,Map} during closing

‎packages/effect/src/FiberHandle.ts

+11-7
Original file line numberDiff line numberDiff line change
@@ -111,13 +111,17 @@ export const make = <A = unknown, E = unknown>(): Effect.Effect<FiberHandle<A, E
111111
Effect.acquireRelease(
112112
Effect.map(Deferred.make<void, E>(), (deferred) => unsafeMake<A, E>(deferred)),
113113
(handle) =>
114-
Effect.zipRight(
115-
clear(handle),
116-
Effect.suspend(() => {
117-
handle.state = { _tag: "Closed" }
118-
return Deferred.done(handle.deferred, Exit.void)
119-
})
120-
)
114+
Effect.withFiberRuntime((parent) => {
115+
const state = handle.state
116+
if (state._tag === "Closed") return Effect.void
117+
handle.state = { _tag: "Closed" }
118+
return state.fiber ?
119+
Effect.intoDeferred(
120+
Effect.asVoid(Fiber.interruptAs(state.fiber, FiberId.combine(parent.id(), internalFiberId))),
121+
handle.deferred
122+
) :
123+
Deferred.done(handle.deferred, Exit.void)
124+
})
121125
)
122126

123127
/**

‎packages/effect/src/FiberMap.ts

+11-7
Original file line numberDiff line numberDiff line change
@@ -125,13 +125,17 @@ export const make = <K, A = unknown, E = unknown>(): Effect.Effect<FiberMap<K, A
125125
deferred
126126
)),
127127
(map) =>
128-
Effect.zipRight(
129-
clear(map),
130-
Effect.suspend(() => {
131-
map.state = { _tag: "Closed" }
132-
return Deferred.done(map.deferred, Exit.void)
133-
})
134-
)
128+
Effect.withFiberRuntime((parent) => {
129+
const state = map.state
130+
if (state._tag === "Closed") return Effect.void
131+
map.state = { _tag: "Closed" }
132+
return Fiber.interruptAllAs(
133+
Iterable.map(state.backing, ([, fiber]) => fiber),
134+
FiberId.combine(parent.id(), internalFiberId)
135+
).pipe(
136+
Effect.intoDeferred(map.deferred)
137+
)
138+
})
135139
)
136140

137141
/**

‎packages/effect/src/FiberSet.ts

+9-7
Original file line numberDiff line numberDiff line change
@@ -118,13 +118,15 @@ export const make = <A = unknown, E = unknown>(): Effect.Effect<FiberSet<A, E>,
118118
Effect.acquireRelease(
119119
Effect.map(Deferred.make<void, unknown>(), (deferred) => unsafeMake(new Set(), deferred)),
120120
(set) =>
121-
Effect.zipRight(
122-
clear(set),
123-
Effect.suspend(() => {
124-
set.state = { _tag: "Closed" }
125-
return Deferred.done(set.deferred, Exit.void)
126-
})
127-
)
121+
Effect.withFiberRuntime((parent) => {
122+
const state = set.state
123+
if (state._tag === "Closed") return Effect.void
124+
set.state = { _tag: "Closed" }
125+
const fibers = state.backing
126+
return Fiber.interruptAllAs(fibers, FiberId.combine(parent.id(), internalFiberId)).pipe(
127+
Effect.intoDeferred(set.deferred)
128+
)
129+
})
128130
)
129131

130132
/**

0 commit comments

Comments
 (0)
Please sign in to comment.