newlib reentrancy question
Joel Sherrill
joel.sherrill@OARcorp.com
Tue Jun 19 07:17:00 GMT 2001
Where's the best description and/or example of how to
implement newlib pre-thread reentrancy support these
days?
I am investigating a case where cout does not work
for the 2nd task in a system unless the 1st task
uses it. All of the standard C routines work fine.
In fact, the printf immediately before the cout calls
in the 2nd task prints. The clue I think is that
printf does not call fwrite and cout does. Here
is how we do the per-task reentrancy structures
now.
+ At system initialization, we use a global struct _reent.
It is initialized using _REENT_INIT.
+ Each task has its own copy of the reent structure.
+ As part of a context switch the contents of _impure_ptr
are switched.
+ As each task begins execution time, the following code
is executed:
ptr = (struct _reent *) calloc(1, sizeof(struct _reent));
*ptr = (struct _reent) _REENT_INIT((*ptr));
What seems to be happening is that the 2nd task gets to
CHECK_INIT:
#define CHECK_INIT(fp) \
do \
{ \
if ((fp)->_data == 0) \
(fp)->_data = _REENT; \
if (!(fp)->_data->__sdidinit) \
__sinit ((fp)->_data); \
} \
while (0)
and it decides to do the copy in the first if. But since
_REENT_INIT at task_begin time set __sdidinit to 1, it
skips the __sinit portion. Any ideas? Do you think
that our per-task initialization should be different
and make sure __sdidinit is 0?
--
Joel Sherrill, Ph.D. Director of Research & Development
joel@OARcorp.com On-Line Applications Research
Ask me about RTEMS: a free RTOS Huntsville AL 35805
Support Available (256) 722-9985
More information about the Newlib
mailing list