[e-lang] [Fwd: Re: Proposal: E / Erlang integration]
Ulf Wiger
ulf@REDACTED
Fri Jun 9 07:54:06 CEST 2006
Den 2006-06-09 06:35:37 skrev David Hopwood
<david.nospam.hopwood@REDACTED>:
> Actually, it can't quite be done this way because messages
> received in the waiting state would cause a crash (and it
> is not correct to ignore them).
Yes, this is the problem.
If one may receive input from multiple, uncoordinated senders, there is no
way to predict the order in which the inputs will arrive. So you either
explicitly handle all permutations, or find a way to reorder messages
where applicable. This is essentially what the selective receive does in
this example.
In the case of allocating a resource, strictly speaking, we shouldn't
allocate the resource if the subscriber has already put the phone down.
But since we have to handle the case that the on_hook signal arrived
*after* we allocated the connection, and the two entities (resource
handler and subscriber) are unsynchronized, we may reorder the events to
fit our logic. This radically reduces the number of combinations we are
forced to write code for.
UML has an attribute, deferrable_event, which allows the designer to do
pretty much the same thing. My gripe with that approach is that the
consequences can be dire if one forgets to add the deferrable_event
attribute (the UML default is to discard unexpected messages.)
So far, I'm of the opinion that this phenomenon is restricted to transient
states. You never (?) need selective receive in top-level states. If this
is true, then one should be able to label states such that they either
leave unexpected messages in the queue, discard them, or raise an
exception. What the default should be probably depends on the domain.
In my presentation, I offered an example of an event-based program that
switched between a selective dispatch loop and a plain dispatch loop
depending on context. This also seems to solve the problem of complexity
explosion in the code.
> If the intent is to delay any messages until we get out of
> the waiting state, then the following would work (but would
> be inefficient, as discussed in the earlier thread at
> <http://www.erlang.org/ml-archive/erlang-questions/200507/msg00301.html>):
> bind waiting {
> match [verb, args] { E.send(pots, verb, args) }
> }
> Hmm, maybe selective receive would be beneficial here.
The efficiency part is in practice (at least in the telco domain) very
seldomly a problem, but of course could be under special circumstances.
OTOH, I've seen several examples of how programmers have defered the
ordering problem to user-level, effecively re-implementing selective
receive there. This doesn't make it more efficient.
Regards,
Ulf W
--
Ulf Wiger
More information about the erlang-questions
mailing list