Details
-
Type:
Defect
-
Status:
Open
-
Priority:
Minor
-
Resolution: Unresolved
-
Affects Version/s: Release 1.3
-
Fix Version/s: None
-
Component/s: None
-
Labels:None
-
Environment:Windows 7; JVM 1.6; Clojure 1.3 beta 1
-
Approval:Vetted
Description
I'm not sure if this is a supported scenario, but the following deadlocks in Clojure 1.3:
(let [xs (seque (range 150000))
ys (seque (filter odd? xs))]
(apply + ys))
As I understand it, the problem is that ys' fill takes place on an agent thread, so when it calls xs' drain, the (send-off agt fill) does not immediately trigger xs' fill, but is instead put on the nested list to be performed when ys' agent returns. Unfortunately, ys' fill will eventually block trying to take from xs, and so it never returns and the pending send-offs are never sent. Wrapping the send-off in drain to:
(future (send-off agt fill))
is a simple (probably not optimal) way to fix the deadlock.
Activity
Stuart Halloway
made changes -
| Field | Original Value | New Value |
|---|---|---|
| Approval | Triaged [ 10120 ] |
Rich Hickey
made changes -
| Approval | Triaged [ 10120 ] | Vetted [ 10003 ] |
Reproduced on 1.4.0 and 1.5.0-RC1 as well, albeit with this example:
(seque 3 (seque 3 (range 10)))