This is the mail archive of the
newlib@sources.redhat.com
mailing list for the newlib project.
Re: How to use __DYNAMIC_REENT__ correctly in multithreaded applications?
- From: "J. Johnston" <jjohnstn at redhat dot com>
- To: Thomas Pfaff <tpfaff at gmx dot net>
- Cc: newlib at sources dot redhat dot com
- Date: Tue, 19 Aug 2003 15:40:02 -0400
- Subject: Re: How to use __DYNAMIC_REENT__ correctly in multithreaded applications?
- Organization: Red Hat Inc.
- References: <3F40EC4D.30704@gmx.net> <3F4134BF.826C3690@redhat.com> <3F41CF80.1030909@gmx.net>
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
> >
> >