File tree Expand file tree Collapse file tree 2 files changed +18
-1
lines changed
std/shared/src/main/scala/cats/effect/std
tests/shared/src/test/scala/cats/effect/std Expand file tree Collapse file tree 2 files changed +18
-1
lines changed Original file line number Diff line number Diff line change 17
17
package cats .effect .std
18
18
19
19
import cats .effect .kernel .{Concurrent , Resource }
20
+ import cats .effect .kernel .Resource .ExitCase .Succeeded
20
21
import cats .syntax .all ._
21
22
22
23
/**
@@ -106,7 +107,13 @@ object Hotswap {
106
107
override def swap (next : Resource [F , R ]): F [R ] =
107
108
nes.swap(next.map(_.some)) *> get.use(_.get.pure[F ])
108
109
109
- override def get : Resource [F , Option [R ]] = nes.get
110
+ override def get : Resource [F , Option [R ]] =
111
+ Resource .applyFull[F , Option [R ]] { poll =>
112
+ poll(nes.get.allocatedCase).flatMap {
113
+ case (None , fin) => fin(Succeeded ) *> F .pure((None , _ => F .unit))
114
+ case (r, fin) => F .pure((r, fin))
115
+ }
116
+ }
110
117
111
118
override def clear : F [Unit ] = nes.clear
112
119
}
Original file line number Diff line number Diff line change @@ -165,5 +165,15 @@ class HotswapSpec extends BaseSpec { outer =>
165
165
166
166
TestControl .executeEmbed(go, IORuntimeConfig (1 , 2 )).replicateA_(1000 ) must completeAs(())
167
167
}
168
+
169
+ " get should not acquire a lock when there is no resource present" in ticked {
170
+ implicit ticker =>
171
+ val go = Hotswap .create[IO , Unit ].use { hs =>
172
+ hs.get.useForever.start *>
173
+ IO .sleep(2 .seconds) *>
174
+ hs.swap(Resource .unit)
175
+ }
176
+ go must completeAs(())
177
+ }
168
178
}
169
179
}
You can’t perform that action at this time.
0 commit comments