[HOpenGL] HOpenGL and --enable-threaded-rts
Simon Marlow
simonmar@microsoft.com
Tue, 18 Jun 2002 14:59:00 +0100
> I'm slowly losing track of this discussion...
so am I :-(
> My initial suggestion
> was that it is guaranteed that the same OS thread which created the
> f.i.w. thunk is used to call back to Haskell for *this*=20
> wrapped function.
> There is no overhead for calls Haskell->C, only for the comparatively
> rare case of C->Haskell. What's wrong with this?
There are two problems with this approach, I think. The situation is
like this (correct me if I'm wrong):
- Haskell thread H1 running on OS thread O1 registers a
callback C.
- Haskell thread H1/O1 makes a blocking call into HOpenGL.
This call is made also in O1. The RTS allocates another
OS worker thread O2, and continues running Haskell threads.
- HOpenGL, running in O1, invokes the callback C. The RTS
stops O1, creates a new Haskell thread H2 in which to run C,
and eventually runs H2 in O2.
Problem #1 is the call-in: our current implementation *always* runs the
callback in a different OS thread from the calling thread. It was
simpler this way, but perhaps this can change.
Problem #2 is that we would have to add some extra machinery to
guarantee that a given Haskell thread executes in a particular OS
thread, and somehow do it in a way that was "fair" (i.e. the Haskell
thread with a preference for its OS thread doesn't get starved, and
doesn't starve other threads). The RTS currently doesn't make any
distinction between OS threads; a given Haskell thread can even migrate
from one OS thread to another during its execution.
Cheers,
Simon