Re: threading question

From: Alan Cox (alan@lxorguk.ukuu.org.uk)
Date: Sat Jun 16 2001 - 10:19:26 EST


> Can you provide any info and/or examples of co-routines? I'm curious to
> see a good example of co-routines' "betterness."

With co-routines you don't need

        8K of kernel stack
        Scheduler overhead
        Fancy locking

You don't get the automatic thread switching stuff though.

So you might get code that reads like this (note that aio_ stuff works rather
well combined with co-routines as it fixes a lack of asynchronicity in the
unix disk I/O world)

        select(....)

        if(FD_ISSET(copier_fd))
                run_coroutine(&copier_state);

        ...

and the copier might be something like

        while(1)
        {
                // Yes 1 at a time is dumb but this is an example..
                // Yes Im ignoring EOF for this
                if(read(copier_fd, buf[bufptr], 1)==-1)
                {
                        if(errno==-EWOULDBLOCK)
                        {
                                coroutine_return();
                                continue;
                        }
                }
                if(bufptr==255 || buf[bufptr]=='\n')
                {
                        run_coroutine(run_command, buf);
                        bufptr=0;
                }
                else
                        bufptr++;
        }

it lets you express a state machine as a set of multiple such small state
machines instead. run_coroutine() will continue a routine where it last
coroutine_return()'d from. Thus in the above case we are expressing read
bytes until you see a new line cleanly - not mangled in with keeping state
in global structures but by using natural C local variables and code flow

Alan

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sat Jun 23 2001 - 21:00:15 EST