Native Threads in the RTS

Simon Marlow simonmar@microsoft.com
Tue, 26 Nov 2002 16:34:04 -0000


Alastair Reid wrote:
> Design
> ~~~~~~
>=20
> Haskell threads may be associated at thread creation time with either
> zero or one native threads.  There are only two ways to create Haskell
> threads so there are two cases to consider:

Umm, Alastair, I think you've got things a bit mixed up here.  Did you
mean two ways to create a native thread? =20

There are currently three ways to create a Haskell thread (forkIO,
foreign export, finalizers) and Wolfgang has proposed a fourth
(forkNativeThread).

Or perhaps you're proposing we do away with forkIO and only have
forkNativeThread?  That was discounted a while back because we want to
continue to have light-weight threads independent of OS threads.

> 1) forkNativeThread :: IO () -> IO ()
>=20
>    The fresh Haskell thread is associated with a fresh native thread.
>=20
>    (ToDo: do we really need to use a fresh native thread or would a
>    pool of threads be ok?  The issue could be avoided by separating
>    creation of the native thread from the 'associate' operation.)
>=20
> 2) Calls to a threadsafe foreign export allocate a fresh Haskell
>    thread which is then associated with the Haskell thread.

I don't know what you mean by a "threadsafe foreign export".  Did you
mean "threadsafe foreign import" perhaps?  And I'm not sure how a fresh
Haskell thread is associated with a Haskell thread ;-)

> Calls to threadsafe foreign imports by threads which have an
> associated native thread are performed by that native thread.
>=20
> Calls to any other foreign imports (i.e., 'safe' or 'unsafe' calls)
> may be made in other threads or, if it exists, in the associated
> native thread at the implementation's discretion.
>=20
> [ToDo: can Haskell threads with no associated thread make foreign
> calls using a thread associated with some other thread? =20

er... overloading the word "thread" was maybe not such a good idea.  I
think you're asking whether a green thread can grab a native thread to
make a foreign call.  The current answer is no... but can you think of a
reason we might want this feature?

Cheers,
	Simon