How to use __DYNAMIC_REENT__ correctly in multithreaded applications?

J. Johnston jjohnstn@redhat.com
Thu Aug 21 00:16:00 GMT 2003


Thomas Pfaff wrote:
> 
> 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.
> 

That's basically what I was thinking, but like I said I have to think a little bit
to see if this would have any adverse effects.

-- Jeff J.

> 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