[PATCH] _fwalk walks through thread local FILE pointer
Jeff Johnston
jjohnstn@redhat.com
Fri Jan 30 19:45:00 GMT 2004
I think that the stdin/stdout/stderr for the thread should also be
walked in addition to the global list for now. I don't think that
should cause problems with Cygwin but if so, we can add an #ifdef check.
-- Jeff J.
Thomas Pfaff wrote:
> Take a look at findfp.c and you will see that all FILE pointers are
> hold in _GLOBAL_REENT, therefore _fwalk simply does not walk through
> the real FILE pointer list, but through the thread lokal ones which
> will contain only stdin, stdout and stderr.
>
> The obsolete REENT ptr can be removed but thats Jeffs decision.
>
> You can search the list why _GLOBAL_REENT was introduced some time
> ago. The former implementation where every thread has its own pointer
> list was incorrect, FILE pointers are process global objects.
>
> There is still a problem with stdin, stdout and stderr because every
> thread has its own buffers for these files. Cygwin has a workaround
> for this problem, it maps the thread lokal stdin, stdout and stderr to
> _GLOBAL_REENT aka _impure_ptr FILE pointers. I think that this will a
> working solution for other platforms as well.
>
> Thomas
>
> Joel Sherrill wrote:
>
>> This isn't right. You are passed a REENT pointer and cannot
>> simply ignore it.
>>
>> This will break any code that depends upon the existing
>> behavior. In RTEMS, we use _fwalk as it exists to
>> implement sync() and walk each thread's open files.
>> It is also used as part of the per-thread cleanup
>> dynamically.
>>
>> If you want to have NULL ptr argument imply the global
>> reent, great but don't break it.
>>
More information about the Newlib
mailing list