[ECOS] Re: uSTL hello world

Bart Veer bartv@ecoscentric.com
Fri Sep 11 19:25:00 GMT 2009

>>>>> "Jifl" == Jonathan Larmour <jifl@jifvik.org> writes:

    >> Jifl, is there a preferred way to ensure initialisation of the
    >> stdio streams in the file descriptor table? I note that open()
    >> in the file I/O package uses:
    >> CYG_REFERENCE_OBJECT(stdout);
    >> CYG_REFERENCE_OBJECT(stderr);
    >> Is this addressing the same issue that we're observing with
    >> uSTL?

    Jifl> I think there's a more fundamental problem, not specific to
    Jifl> uSTL (so I think Uwe's workaround isn't really appropriate).
    Jifl> That is that something like:

    Jifl>    write(STDOUT_FILENO, buf, n);

    Jifl> can't be guaranteed to just work, at present. That's a bug.

    Jifl> I think those CYG_REFERENCE_OBJECT lines (and surrounding
    Jifl> ifdef) need to move out of open() and into cyg_fd_init().
    Jifl> Theoretically cyg_fp_get() would be slightly better, but
    Jifl> that is called a lot, and there is a trivial but non-zero
    Jifl> overhead to CYG_REFERENCE_OBJECT. I'd appreciate Nick's
    Jifl> opinion on this proposal if possible though. It does mean
    Jifl> that including the fileio package at all in a configuration
    Jifl> would then guarantee pulling in stdin/stdout/stderr, even
    Jifl> irrespective of use. Maybe the number of people this would
    Jifl> affect is too small to care about. Maybe there should be a
    Jifl> default-enabled option, to allow it to be turned off to
    Jifl> remove that dependency.

    Jifl> Taking the usual principle of "leave it to the user", I
    Jifl> think I'd personally lean towards the latter.

I think there is another approach which might fit in better with
linker garbage collection. Instead of #define'ing STDOUT_FILENO as 1,
declare it as an extern const char. Then provide the variable
STDOUT_FILENO in some module which causes the necessary initialization
to happen. It is slightly more expensive: a bit of space for the const
variable, an extra memory access for the write() call. However it
would eliminate the need for CYG_REFERENCE_OBJECT's and it would allow
linker garbage collection to work as normal.

Obviously code which uses write(1, buf, n) would still be broken, and
requires that STDOUT_FILENO be defined as 1. Hence my proposal would
not be fully standards-compliant.


Bart Veer                                   eCos Configuration Architect
eCosCentric Limited    The eCos experts      http://www.ecoscentric.com/
Barnwell House, Barnwell Drive, Cambridge, UK.      Tel: +44 1223 245571
Registered in England and Wales: Reg No 4422071.
 >>>> Visit us at ESC-Boston  http://www.embedded.com/esc/boston <<<<
 >>>> Sep 22-23 on Stand 226  at Hynes Convention Center, Boston <<<<

Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss

More information about the Ecos-discuss mailing list