[HOpenGL] HOpenGL and --enable-threaded-rts
Simon Peyton-Jones
IMCEAEX-_O=MICROSOFT_OU=NORTHAMERICA_CN=RECIPIENTS_CN=428592@microsoft.com
Thu, 20 Jun 2002 09:06:53 +0100
| > Another possibility that Simon and I have discussed is to provide a=20
| > sort of forkIO that says "create a Haskell thread=20
| permanently bound to=20
| > an OS thread". Much more expensive than normal forkIO. More like=20
| > having a permanent secretary at your beck and call, rather than the=20
| > services of a typist from the typing pool.
|=20
| So calling C from this thread would happen inside that OS thread,=20
| callbacks would happen in that OS thread, and the RTS would=20
| continue to=20
| run while that OS thread is blocked?
| How much overhead would that create? I wouldn't like much additional=20
| overhead for my OpenGL programs :-(. Would this require an OS=20
| mutex lock=20
| for every heap allocation, or is there a better way?
The idea would be that we'd keep the invariant that only one OS=20
thread can be executing Haskell at any moment. So no mutex locks on
allocation or thunk entry.
Suppose we call one of a Haskell-thread-with-a-dedicated-OS-thread
a "Haskell super-thread". At any moment, a vanilla OS worker thread
is executing Haskell threads. It keeps picking a new Haskell thread,
running it for a while, then picking a new one. OK, so it decides that
the
next Haskell thread to run is a super-thread. The OS thread hands off
control to the dedicated OS thread bound to the super-thread. The
dedicated
OS thread runs the super-thread. When its time slice is up, the
dedicated
OS thread picks a new Haskell thread to run, but it doesn't run it! No,
it hands off control to a vanilla OS worker thread instead.
The intention is zero overhead if there are no super threads. There'll
be an OS thread switch whenever the super-thread is scheduled, but
that's life.
Havn't worked out the details, but it looks possible.
Sigbjorn: any comments? You'd implemented all this thread-y stuff.
Simon