Pre-emptive or co-operative concurrency (was: Concurrency)

Simon Marlow simonmar at microsoft.com
Fri Mar 31 07:07:16 EST 2006


On 30 March 2006 22:01, Claus Reinke wrote:

>>> the point being: the FFI says something about how to integrate
>>> foreign and Haskell memory management; should it also say something
>>> about threadability of foreign code (wrt to scheduling, and wrt
>>> thread-safety)?
>> If Haskell' includes concurrency then of course it must say something
>> about the behaviour of foreign calls with respect to concurrency (if
>> that's what you mean by "threadability").  Is that what you're
>> asking? 
> 
> yes. I'm all for Haskell' having both ffi and concurrency, but that
> means that the feature interactions have to be investigated. I know
> you made a start on that, so I was just pointing out some further
> corners that may need looking into:
> 
> - if foreign code is used in Haskell' scheduling, what properties of
>     the foreign code need to be specified, how does long-running
>     foreign code interact with the scheduler, and are the current
>     annotations sufficient for all that?
> 
> - if Haskell' code involving concurrency is foreign exported, what
>     does that mean? does it work out of the box, or what are the
>     limitations?

Rather than answer these directly, I'll point to this paper which
addresses these questions and more:

http://www.haskell.org/~simonmar/papers/conc-ffi.pdf

GHC implements exactly what is in that paper.  For Haskell', I expect we
won't require all of it, some will be relegated to extensions.

> I was looking for a practical example involving concurrency and ffi
> in such a way as to expose some of the questions that need to be
> answered. you're mentioning forkIO, so that's an example of such
> questions: why shouldn't we be able to foreign export that?

The (slightly glib) answer to this question is "because it doesn't have
a legal FFI type".

If you want to foreign export forkIO, you'll have to give me a version
that I can foreign export.  And that involves some important decisions:
just where do you want to run the IO() action, on the server, or the
client?  If it's on the server, then how to I get the IO() in the first
place?  YOu must provide some more API functions to build a
FunPtr(IO()), or something.

(by server I mean the library proferring the forkIO API, by client I
mean the client of this API).

Cheers,
	Simon


More information about the Haskell-prime mailing list