[Haskell-cafe] Re: ANN: priority-sync- Cooperative task prioritization.

Christopher Lane Hinson lane at downstairspeople.org
Wed May 13 20:58:20 EDT 2009

> Is 'claim' the only way to execute tasks?
> Lets say you create a task pool for 1 hardware thread.
>  pool <- newTaskPool fast_queue_configuration 1 ()
> If a task blocks/sleeps while holding a claim, none of the other tasks can 
> run right?

Correct, but you can wrap the blocking call inside

claim Release {- . . . -}

to release the claim temporarilty.

> Is it possible to create a task pool for 2 hardware threads having one task 
> dominate 1 CPU (render thread), and have other tasks multiplex IO on the 
> other CPU __without stalling each other when blocked__? What happens if you 
> release the room claim before blocking in IO? Does the thread schedule on a 
> random CPU?

priority-sync only controls access to abstract Rooms that, in the 
motivating example, represent the resource limitation of the number of 
hardware threads.

Tasks run inside their calling thread, on a CPU dictated by the RTS, so 
just use forkOnIO to create a thread that is locked to a specific 
capability if that's really what you want.  priority-sync won't be aware 
that you're doing this.

In your case, you may want to allow the rendering thread to run outside of 
the task pool, and create a room of size (max 1 $ numCapabilities-1) for 
all of the worker threads.  Then wrap all relevant blocking calls as 
described above (if this is prohibitively combersome, please advise me).

Another possibility, if the rendering thread is from something like a GLUT 
callback, is to have the rendering thread claim the Room using the 
Unconstrained context.  Then you will likely end up with more threads 
claiming the room than the size of the Room, but the rendering 
thread will never be made to wait, and the Room will continue to block the 
worker threads until it has returned to within it's configured 


More information about the Haskell-Cafe mailing list