On 14/02/13 20:54, Alexander Kjeldaas wrote:[snip]
I ended up staring at the PrimOps.cmm file today, and porting tryPutMVar
to C so it can be used from the RTS.
During my staring, it occurred to me that it should be possible to
implement a wait-on-multiple MVars with mostly no overhead. I am
guessing that this would be desirable, but I am not sure.
My rough idea is like this:
-- wait for all MVars, return the value of one of them, and the
corresponding index
takeOneMVar :: [MVar a] -> IO (a, Int)
This is implemented by this change:
I've occasionally wondered whether we could do this. So I think you'll have some difficulty implementing the code that blocks, because you have to atomically add your queue element to multiple MVars. You could lock all the MVars, but you'll need to sort them to avoid lock-order problems, or do an STM-like two-phase locking thing. It could get pretty hairy.
Also, what does the primop look like? Lists aren't a primitive type, and you can't put MVar# into an Array# (kind mismatch).
Don't forget to think about throwTo. Though I suspect that's not too hard (just invalidate the queue).