[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Channels versus Methods

Richard Beton wrote:
> Thomas Umland wrote:
> >   public synchronized Object read (CallChannelFunctionInterface
> >                                    function) {
> >     if (data.getState () == ChannelDataStore.EMPTY) {
> Is this the pathological wait/notify Pooh-trap? I think you might need
>     while (data.getState () == ChannelDataStore.EMPTY) {
> instead. (Someone will correct me if I'm wrong, no doubt)
> Rick


to make things easier for me I just copied the original JCSP code ;-)

And you are right, the code looks a bit strange. But I think the problem
comes from the InterruptedException and a "while" won't really help:
what are the semantics of a caught exception? Which state is still
correct after an exception occured and which is not? 

I would prefer not catching the exception at all and instead make the
whole read statement fail:

public synchronized Object read (CallChannelFunctionInterface  
                                   function) throws InterruptedException
    if (data.getState () == ChannelDataStore.EMPTY) wait ();
    Object value = data.get ();
    data.putReturn (function.accept(value));  // this is new
    notify ();
    return value;

This looks nicer, doesn't it?