Always provide exit() & friends prototypes.
Jonathan Larmour
jifl@eCosCentric.com
Fri Oct 5 17:41:00 GMT 2007
Sergei Organov wrote:
>
> Yeah, I see. I'll first try the CYGSEM_LIBC_STARTUP_MAIN_THREAD that
> I've somehow missed, then we will see...
It's possible you might have to enable CYGSEM_LIBC_STARTUP_MAIN_OTHER as
well, I'm not sure. Let me know about any problems (preferably with patches
;-)).
> It seems that GCC uses atexit() facility to register destructors for
> static objects found inside functions, like this:
>
> void foo() {
> [...]
> static SomeClassWithCtor_Dtor var;
> [...]
> }
> As 'var' should be initialized at the first pass through the function,
> GCC registers a function calling destructor with atexit() after
> constructor of the variable is actually called.
Interesting - it doesn't do this normally. I believe this may be a property
of the toolchain. I do vaguely recall there's some option within GCC (i.e.
when you do a GCC port) for whether to use a .dtor section for global
destructors, or atexit. So far, it's always been .dtor.
> Even if user app is plain C, silently calling atexit() seems to be
> dangerous as user application code might still register something with
> atexit() at startup.
True.
>> Unfortunately we have to have a default main, otherwise in our many
>> templates and configurations with the libc_startup package included,
>> any eCos test programs that don't use main() will not link.
>
> Yeah, I see. Maybe Cyg_Thread::self()->suspend() in the main() when
> there is kernel there will help.
That's a good idea. Patch below, and applied.
Jifl
Index: ChangeLog
===================================================================
RCS file: /cvs/ecos/ecos/packages/language/c/libc/startup/current/ChangeLog,v
retrieving revision 1.10
diff -u -5 -p -r1.10 ChangeLog
--- ChangeLog 11 Sep 2007 16:50:54 -0000 1.10
+++ ChangeLog 5 Oct 2007 17:41:22 -0000
@@ -1,5 +1,10 @@
+2007-10-05 Jonathan Larmour <jifl@eCosCentric.com>
+
+ * src/main.cxx (main): Suspend main thread, rather than exit.
+ Thanks to Sergei Organov for the idea.
+
2007-09-11 Andrew Lunn <andrew.lunn@ascom.ch>
* src/cstartup.cxx: Change the INIT priority of
cyg_libc_startup_obj so that it is always called after the thread
has been constructed. Reported by taiyun@sunnorth.com.cn
Index: src/main.cxx
===================================================================
RCS file:
/cvs/ecos/ecos/packages/language/c/libc/startup/current/src/main.cxx,v
retrieving revision 1.3
diff -u -5 -p -r1.3 main.cxx
--- src/main.cxx 23 May 2002 23:07:12 -0000 1.3
+++ src/main.cxx 5 Oct 2007 17:41:22 -0000
@@ -64,10 +64,16 @@
#include <cyg/infra/cyg_type.h> // Common type definitions and support
#include <cyg/infra/cyg_trac.h> // Common tracing support
#include <cyg/infra/cyg_ass.h> // Common assertion support
+#ifdef CYGPKG_KERNEL
+# include <pkgconf/kernel.h> // kernel configuration
+# include <cyg/kernel/thread.hxx> // For thread suspend
+# include <cyg/kernel/thread.inl>
+#endif
+
// FUNCTION PROTOTYPES
// We provide a weakly named main to allow this to link if the user
// doesn't provide their own main. This isn't strictly good behaviour,
// but if the user wants good performance then of _course_ they should
@@ -101,10 +107,14 @@ main( int argc, char *argv[] )
// evidently the user didn't supply one - which can't be right. So we
// assume that they have useful code to run in cyg_user_start() instead.
// Its better than just exiting
#ifndef CYGPKG_KERNEL
cyg_user_start();
+#else
+ // Otherwise we suspend ourselves. This prevents problems caused by
+ // running atexit() handlers.
+ Cyg_Thread::self()->suspend();
#endif
CYG_REPORT_RETVAL(0);
return 0; // some CPUs have 0 hard-wired - faster than a reg
} // main()
--
eCosCentric Limited http://www.eCosCentric.com/ The eCos experts
Barnwell House, Barnwell Drive, Cambridge, UK. Tel: +44 1223 245571
Registered in England and Wales: Reg No 4422071.
>>>> Visit us on stand 810 at The Embedded Systems Show 2007, NEC <<<<
>>>> Oct 17-18 Birmingham, UK http://www.edaexhibitions.com/ess/ <<<<
------["The best things in life aren't things."]------ Opinions==mine
More information about the Ecos-patches
mailing list