[ECOS] Re: uSTL hello world

Jonathan Larmour jifl@jifvik.org
Thu Sep 10 00:32:00 GMT 2009

[ NB Nick, see below... ]

John Dallaway wrote:
> Uwe Kindler wrote:
>>If printf is not present in main, then both functions will not get
>>called for stdin and stdout and I think I now know why. In the ustl
>>package in ofstream.cpp the streams are not created because the streams
>>(cout, cin, cerr) are declared this way:
>>ifstream cin  (STDIN_FILENO);
>>ofstream cout (STDOUT_FILENO);
>>ofstream cerr (STDERR_FILENO);
>>That means they use the fileno to open the streams - they do not create
>>them. But the streams are not present, because no function uses stdout,
>>stdin, that means there are no references and the linker throws stdout
>>and stdin away. This is the reason why the static constructors of stdout
>>and stdin are never get called.
>>Here is my proposal to solve this problem. I changed the declaration of
>>cout, cin and cerr this way:
>>ifstream cin  (((Cyg_StdioStream *)stdin)->get_dev());
>>ofstream cout (((Cyg_StdioStream *)stdout)->get_dev());
>>ofstream cerr (((Cyg_StdioStream *)stderr)->get_dev());
>>This ensures that stdout, stdin and stderr are created. After this
>>change cyg_fd_assign() and cyg_fd_alloc() will get called if there is no
>>printf function in main.cpp. The call cout << "Hello world!\n" works
>>now. I noticed that the message is already printed before cout.flush()
>>is called. So it seems cout.flush() is not required if a proper serial
>>driver is used. If I use the diagnostic serial driver, then I always
>>needed to call cout.flush().
>>If you agree to my proposal then I will provide a patch.
> Uwe, congratulations on tracking this down. Your analysis makes good sense.
> 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:
> Is this addressing the same issue that we're observing with uSTL?

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

   write(STDOUT_FILENO, buf, n);

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

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

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

--["No sense being pessimistic, it wouldn't work anyway"]-- Opinions==mine

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