Concurrency (was: Re: [GUI] Re: events & callbacks)
Wolfgang Thaller
wolfgang.thaller@gmx.net
Wed, 12 Mar 2003 11:35:58 +0100
I hereby propose that:
1) Callbacks will be executed synchronously. No other events will be
handled until a callback returns.
Rationale:
*) This maps directly to the execution model of all backend toolkits
that I know
*) You can easily get concurrency by calling forkIO, but going the
other way is difficult.
2) Calls to the CGA can be made at any time, from any thread. The
implementation is responsible for assuring that
the serialization requirements of the backend toolkit are met.
Number 1) is easy. Number 2) is more work for implementations, but it
is necessary so that concurrent GUIs can easily be built on top of the
CGA.
Point 2) probably requires wrapping each and every foreign call in a
CGA backend with some synchronization code.
And I have one question: How many of the toolkits we are targeting
support posting a user-defined event from a different OS thread than
the event loop? AFAIK, Win32 and Mac OS Cocoa/Carbon do.
We will have to choose between 2a) and 2b):
2a) If the CGA is currently waiting for an (OS-toolkit-level) event, it
is possible that a call to the CGA from another concurrent Haskell
thread will be blocked until an event arrives.
2b) If the CGA is currently waiting for an (OS-toolkit-level) event and
another concurrent Haskell thread calls into the CGA, the CGA backend
implementation has to make sure that the call can be handled in a
reasonable amount of time (e.g. by posting an application-defined event
or by registering a regular timer event).
Can we have a vote on this, and, if we agree, put this down in the
specification? We have to make some progress here sooner or later...
My vote is for 1), 2) and 2b), unless somebody convinces me of
something else... :-)
Cheers,
Wolfgang