[dmd-concurrency] draft 4

Sean Kelly sean at invisibleduck.org
Tue Jan 12 15:17:36 PST 2010


On Jan 12, 2010, at 2:16 PM, Andrei Alexandrescu wrote:

> Sean Kelly wrote:
> 
>> What I'd like to do now that I haven't been able to because of a compiler bug is allow a timeout and catchall receiver to be supplied to the full recvmsg call:
>> recvmsg( after(5, { writefln( "no message received!" ); },
>>                  any( (Variant v) { writefln( "got something: %s", v ); } ) );
> 
> This is cute, perhaps a bit too cute. My objections are many but minor:
> 
> * "recvmsg" is an awful name that evokes to me the name of a Cobol routine. It's very difficult to use in a conversation, and my accent doesn't help either :o). I think "receive" is a definite improvement.

Fine with me.  I originally chose recvmsg and sendmsg to try and avoid name collisions.  I'd be just as happy with send and receive or whatever else instead.

> * Instead of after(...) as a clause, I'd rather have a receiveTimed (or recvmsgtmd if you wish) that takes a timeout value and returns true or false. I mean I'm not sure what moving the timeout code inside the call to recvms... I mean receive  would gain us.

Nothing really.  I was mostly trying to model the Erlang pattern matching style as closely as possible.  Seems like it might be annoying to try and prevent:

    receive( after(5, ...), after(10, ...) );

anyway, assuming we wanted to be that strict.  Note that when multiple functions are passed, the match is found via a nested loop:

    foreach( m; messages ) {
        foreach( f; functions ) {
            if( matches( m, f ) ) {
                f( m );
                removeMessage( m );
                return;
            }
        }
    }

so passing multiple functions that accept the same params is valid.  The first will just always get the message.


More information about the dmd-concurrency mailing list