This is the mail archive of the
newlib@sourceware.org
mailing list for the newlib project.
Re: How to destroy _reent structure
- From: Joel Sherrill <joel dot sherrill at oarcorp dot com>
- To: newlib at sourceware dot org
- Date: Wed, 24 Apr 2013 09:51:26 -0500
- Subject: Re: How to destroy _reent structure
- References: <5177920B dot 4040100 at embedded-brains dot de> <20130424102604 dot GK26397 at calimero dot vinschen dot de> <5177BD89 dot 8050608 at embedded-brains dot de> <20130424125530 dot GP26397 at calimero dot vinschen dot de>
On 4/24/2013 7:55 AM, Corinna Vinschen wrote:
On Apr 24 13:10, Sebastian Huber wrote:
Hello Corinna,
On 04/24/2013 12:26 PM, Corinna Vinschen wrote:
On Apr 24 10:04, Sebastian Huber wrote:
Hello,
there is _REENT_INIT_PTR() for initialization, but how can I destroy
a _reent structure. Is this _wrapup_reent()?
Try _reclaim_reent. But it's not the same as _REENT_INIT_PTR since
_REENT_INIT_PTR does not allocate any memory.
Corinna
so for initialization we can use:
struct _reent *p = malloc(sizeof(*p));
if (p != NULL) {
_REENT_INIT_PTR(p);
}
For destruction we can use:
_reclaim_reent(p);
free(p);
What is the purpose of _wrapup_reent()? Its not called from within
Newlib and I don't find a function that can register an atexit
handler in a non-global _reent structure. There is also no public
header file for this function.
Sorry, I can't answer this question. This code predates my involvement
in newlib and I never looked deeper into this. Cygwin also uses
_reclaim_reent to get rid of the per-pthread reent structure.
We are looking at ancient history code. The RTEMS code that uses our
extensions
on thread create, delete, restart, and switch for newlib dates back to
the 1992-3
time frame.
My vague recollection is that newlib had leaks. Looking at the comments in
reent.c, my impression is that the code and comments don't match.
_wrapup_reent() has a comment being run at "task exit" but task is undefined
in POSIX. For RTEMS task is synonymous with thread but this routine is
invoking atexit() methods.
_reclaim_reent() frees a lot and also invokes the atexit() but has comments
like this that indicate it is at process exit():
/* Malloc memory not reclaimed; no good way to return memory
anyway. */
Looking at this again, I still don't see a clear indication of what
should be invoked
at thread exit and what should be invoked at process exit.
What does Cygwin do at thread exit and process exit?
Any other insight? Except that the names don't add insight. :)
Corinna
--
Joel Sherrill, Ph.D. Director of Research & Development
joel.sherrill@OARcorp.com On-Line Applications Research
Ask me about RTEMS: a free RTOS Huntsville AL 35805
Support Available (256) 722-9985