This is the mail archive of the newlib@sources.redhat.com mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: How to use __DYNAMIC_REENT__ correctly in multithreaded applications?


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]