[PATCH] _fwalk walks through thread local FILE pointer

Thomas Pfaff thomas.pfaff@gmx.net
Mon Feb 2 17:07:00 GMT 2004


I have seen that you checked in a modified version of my patch.

But there is still a problem with stdin/out/err that has nothing to do 
with _fwalk:

setvbuf(stdout, NULL, _IOLBF, 0) will change only the buffering of the 
calling thread, but not for the process as long as every thread has its 
own buffers.

Thomas

Jeff Johnston wrote:
> 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