How to destroy _reent structure
Sebastian Huber
sebastian.huber@embedded-brains.de
Wed Apr 24 17:54:00 GMT 2013
On 24/04/13 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);
If I use this sequence in RTEMS, then I have the following problem.
RTEMS opens (via open()) the file descriptors 0, 1 and 2 during system
initialization. In RTEMS the file descriptors are a global resource. A
thread will do the initialization steps above during creation time. Now
suppose a thread calls fopen(). This will check that _REENT is
initialized. This will execute the following code for stdin, stdout and
stderr FILE streams (newlib/libc/stdio/findfp.c):
[...]
static _VOID
_DEFUN(std, (ptr, flags, file, data),
FILE *ptr _AND
int flags _AND
int file _AND
struct _reent *data)
{
[...]
ptr->_file = file;
[...]
ptr->_close = __sclose;
[...]
}
[...]
It simply assumes that file descriptors 0, 1 and 2 are available and
registers the __sclose() function (which will call close()). During
_reclaim_reent() the stdin, stdout and stderr FILE streams are closed.
Since we have no open() call for these file descriptors this will close
the global file descriptors 0, 1 and 2. I think at least for RTEMS we
should set ptr->_close to NULL.
>
> 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.
I think we should move the _wrapup_reent() into a separate file.
--
Sebastian Huber, embedded brains GmbH
Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone : +49 89 189 47 41-16
Fax : +49 89 189 47 41-09
E-Mail : sebastian.huber@embedded-brains.de
PGP : Public key available on request.
Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
More information about the Newlib
mailing list