How to use __DYNAMIC_REENT__ correctly in multithreaded applications?

Thomas Pfaff tpfaff@gmx.net
Wed Aug 20 19:17:00 GMT 2003


I can not do it this way because it must be fixed for cygwin and not on 
an application level.

As far as i can see the only problem with __DYNAMIC_REENT__ is this 
stdio related stuff, so i would suggest to fix it temporarly in newlib.

My proposal is:

Create a new macro _GLOBAL_REENT which returns _impure_ptr.
Change all functions in stdio to use _GLOBAL_REENT instead of _REENT 
until there is a better solution.

Thomas

J. Johnston wrote:

> It's a design problem that isn't the fault of __DYNAMIC_REENT__ and
> is going to require a little bit of thought.  One way you might bypass this problem is
> to create an fopen stub for your application and have it call _fopen_r with 
> the default global reentrancy struct.
> 
> -- Jeff J.
> 
> Thomas Pfaff wrote:
> 
>>Hello,
>>
>>some time ago i have added a __DYNAMIC_REENT__ to the cygwin part of
>>config.h. The main purpose was to get thread safe errnos (without this
>>define errno is stored process global in _impure_ptr).
>>
>>Now the reent structure for every thread is thread local and will be
>>destroyed when the thread has terminated. A __getreent function was
>>implemented to get the thread local reent.
>>
>>This leads to following problem:
>>
>>Each FILE structure contains a pointer to the reent structure of the
>>thread that initially opened the file. If the thread terminates than the
>>   reent pointer will point to an invalid address.
>>
>>Here is a simple testcase to illustrate this probleme:
>>
>>#include <stdio.h>
>>#include <pthread.h>
>>
>>static FILE *fp;
>>
>>static void *threadfunc (void *parm)
>>{
>>   fp = fopen ("/tmp/testreent", "w");
>>   return NULL;
>>}
>>
>>int main(void)
>>{
>>   pthread_t thread;
>>
>>   pthread_create (&thread, NULL, threadfunc, NULL);
>>   pthread_join (thread, NULL);
>>
>>   fprintf (fp, "test");
>>   fclose (fp);
>>
>>   return 0;
>>}
>>
>>A thread opens a file and terminates immediately. The mainthread will
>>try to write to the opened file and segfaults in the CHECK_INIT macro in
>>fwrite since the data part of the FILE pointer is no longer valid.
>>
>>I am a bit clueless now:
>>How was DYNAMIC_REENT stuff meant to work  ?
>>
>>IMHO the only way to get this working is to remove the reent part in the
>>FILE structure, but there might be a better solution.
>>
>>TIA,
>>Thomas
> 
> 




More information about the Newlib mailing list