[Haskell-cafe] Re: Bringing Erlang to Haskell
Joel Reymont
joelr1 at gmail.com
Mon Dec 12 11:18:30 EST 2005
Just to elaborate a bit...
On Dec 12, 2005, at 4:00 PM, Joel Reymont wrote:
> 1) Processes, aka threads with single-slot in/out mailboxes
It's obvious that the thread id and the mailboxes (two TMVar's) would
need to be kept together, i.e.
a) data Process = ThreadId (TMVar Dynamic) (TMVar Dynamic)
or
b) data Process a = ThreadId (TMVar a) (TMVar a)
but I'm not sure if I should create a process class, for example.
I think a class is not really needed since a message "receive"
function can just use myThreadId to obtain a key into the map of
processes and retrieve the message from its own mailbox.
receive could take an action that's parameterized on the event and
could pattern-match on it to process the event. This is why I would
much rather prefer (b) above. I foresee myself having a single Event
type throughout my app with various constructors.
Processes can be supervised by rethrowing exceptions back to the
parent thread I think.
> 2) A facility to keep a list of such processes and send events to
> them using their process id
I'm looking to use a global variable for this but then events would
either need to be Dynamic or great care would need to be excercised
with unsafeIO (Tomasz? ;-))
I still think this is the way to tackle the issue (note Process a).
{-# NOINLINE children #-}
children :: MVar [Process a]
children = unsafePerformIO $ newMVar []
So long as everything is parameterized throughout, my experience is
that the type checker complains if you try to use two types of 'a'
throughout the app.
> 3) A socket reader/writer abstraction that communicates with the
> outside world using using its mailboxes
What I would like to do here is to use STM to read either from the
socket loop mailbox or from the socket itself and then dispatch
accordingly. If the message came from the socket then it's posted to
the outbox and if a message was retrieved from the inbox then it gets
posted to the socket.
Some sort of a timeout would be needed for blocking I/O or a
combination of hWaitForInput and -threaded.
Thanks, Joel
P.S. Einar apparently has distributed transactions almost ready.
Putting them together with a polished version of the above should
make distributed concurrent programming in Haskell far less tricky.
--
http://wagerlabs.com/
More information about the Haskell-Cafe
mailing list