[PATCH v2 00/11] Decouple global file object list from _GLOBAL_REENT
Corinna Vinschen
vinschen@redhat.com
Thu May 12 19:44:39 GMT 2022
On May 12 21:14, Corinna Vinschen wrote:
> Hi Matt,
>
> On May 12 14:11, Matthew Joyce wrote:
> > From: Matt Joyce <matthew.joyce@embedded-brains.de>
> >
> > Hello Corinna,
> >
> > Per your comments, please see version 2.
> >
> > 1) stdio_atexit is now called stdio_exit_handler
> > 2) declarations for stdio_exit_handler() and _fwalk_sglue() are moved
> > to sys/reent.h
>
> Please see my comments in terms of patch 11, which needs an additional
> tweak. With this change, the patchset is GTG.
Btw., it looks like Cygwin can switch to _REENT_GLOBAL_STDIO_STREAMS
with only minor changes. I'll test this a bit more before pushing,
but it's quite neat so far...
diff --git a/winsup/cygwin/cygtls.cc b/winsup/cygwin/cygtls.cc
index c8352adf9f25..0fd5509d2306 100644
--- a/winsup/cygwin/cygtls.cc
+++ b/winsup/cygwin/cygtls.cc
@@ -55,16 +55,8 @@ _cygtls::init_thread (void *x, DWORD (*func) (void *, void *))
_REENT_INIT_PTR (&local_clib);
stackptr = stack;
altstack.ss_flags = SS_DISABLE;
- if (_GLOBAL_REENT)
- {
- local_clib._stdin = _GLOBAL_REENT->_stdin;
- local_clib._stdout = _GLOBAL_REENT->_stdout;
- local_clib._stderr = _GLOBAL_REENT->_stderr;
- if (_GLOBAL_REENT->__cleanup)
- local_clib.__cleanup = _cygtls::cleanup_early;
- local_clib.__sglue._niobs = 3;
- local_clib.__sglue._iobs = &_GLOBAL_REENT->__sf[0];
- }
+ if (_GLOBAL_REENT && _GLOBAL_REENT->__cleanup)
+ local_clib.__cleanup = _cygtls::cleanup_early;
}
thread_id = GetCurrentThreadId ();
diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc
index 5f460d8a5c78..6b816763e002 100644
--- a/winsup/cygwin/dcrt0.cc
+++ b/winsup/cygwin/dcrt0.cc
@@ -757,9 +757,7 @@ dll_crt0_0 ()
lock_process::init ();
_impure_ptr = _GLOBAL_REENT;
- _impure_ptr->_stdin = &_impure_ptr->__sf[0];
- _impure_ptr->_stdout = &_impure_ptr->__sf[1];
- _impure_ptr->_stderr = &_impure_ptr->__sf[2];
+ _REENT_INIT_PTR_ZEROED (_GLOBAL_REENT);
user_data->impure_ptr = _impure_ptr;
user_data->impure_ptr_ptr = &_impure_ptr;
diff --git a/winsup/cygwin/include/cygwin/config.h b/winsup/cygwin/include/cygwin/config.h
index 71a216fbd16d..56fc326bd43e 100644
--- a/winsup/cygwin/include/cygwin/config.h
+++ b/winsup/cygwin/include/cygwin/config.h
@@ -66,6 +66,7 @@ extern inline struct _reent *__getreent (void)
/* The following block of macros is required to build newlib correctly for
Cygwin. Changing them in applications has no or not the desired effect.
Just leave them alone. */
+#define _REENT_GLOBAL_STDIO_STREAMS 1
#define _READ_WRITE_RETURN_TYPE _ssize_t
#define _READ_WRITE_BUFSIZE_TYPE size_t
#define __LARGE64_FILES 1
diff --git a/winsup/cygwin/tlsoffsets.h b/winsup/cygwin/tlsoffsets.h
[...skipped, just autogenerated data...]
diff --git a/winsup/cygwin/tlsoffsets64.h b/winsup/cygwin/tlsoffsets64.h
[...skipped, just autogenerated data...]
Corinna
More information about the Newlib
mailing list