alloca & coroutining

Neil Webber nw at palladium.UUCP
Mon Jun 13 02:06:08 AEST 1988


In article <16126 at brl-adm.ARPA> ted%nmsu.csnet at relay.cs.net writes:
	>
	>But isn't the following idiom for co-routines useful? 
	>
	>  [ sample coroutine implementation deleted ]
	>

Not on a vax running 4.3BSD it isn't:

	Script started on Sun Jun 12 11:20:08 1988

	% cc -o coroutines coroutines.c
	% ./coroutines
	a b c
	longjmp botch
	Illegal instruction (core dumped)
	%

	script done on Sun Jun 12 11:20:28 1988

This happens because, as Chris Torek points out:

	>longjmp is not suitable for coroutines because it is valid
	>for longjmp to attempt to unwind the stack in order to find 
	>the corresponding setjmp, and it is therefore legal for 
	>longjmp to abort if it is attempting to jump the `wrong way' 
	>on the stack.

I don't believe that there is a portable way to *implement* a
coroutining library in C, short of first implementing a processor
emulation and then writing code for that processor :-).  Perhaps
someone can prove otherwise.

The coroutining code posted by ted%nmsu.csnet at relay.cs.net does
work on our Sun 3, *with the Sun compiler*.  It does not work with the
Greenhills compiler unless you take care to throw all the right
compiler switches (force frame pointers, no delayed stack adjustments).

David DiGiacomo (david at sun.uucp) suggests that the C compiler
recognize alloca() as a special case.  This certainly appears to
be the way of the, er, umm, future.  After all, inlining those
strcpy calls gets the Dhrystone numbers way up ;-}

-- 
Neil Webber / Epoch Systems, Marlboro MA / (617) 481-3717
        {harvard!cfisun, linus!alliant}!palladium!nw



More information about the Comp.unix.wizards mailing list