[PATCH] libstdc++: Search for tzdata on Windows (msys)
Jonathan Wakely
jwakely@redhat.com
Mon Jul 7 21:02:34 GMT 2025
On Mon, 7 Jul 2025 at 22:01, Jonathan Wakely <jwakely@redhat.com> wrote:
>
> On Mon, 7 Jul 2025 at 21:26, Björn Schäpers <gcc@hazardy.de> wrote:
> >
> > From: Björn Schäpers <bjoern@hazardy.de>
> >
> > Sorry for the noise, this is the current version of the Patch.
> >
> > -- >8 --
> > Windows does not provide a tzdata.zi, but msys does. Use this, if
> > available, instead of the embedded (and possibly outdated) database.
> >
> > libstdc++-v3/Changelog:
> >
> > Use msys provided time zone information.
> >
> > * src/c++20/tzdb.cc (zoneinfo_file): On Windows look relative
> > from the DLL path for the time zone information.
> >
> > Signed-off-by: Björn Schäpers <bjoern@hazardy.de>
> > ---
> > libstdc++-v3/src/c++20/tzdb.cc | 35 ++++++++++++++++++++++++++++++++++
> > 1 file changed, 35 insertions(+)
> >
> > diff --git a/libstdc++-v3/src/c++20/tzdb.cc b/libstdc++-v3/src/c++20/tzdb.cc
> > index 6e244dc656d..cdc487af3f5 100644
> > --- a/libstdc++-v3/src/c++20/tzdb.cc
> > +++ b/libstdc++-v3/src/c++20/tzdb.cc
> > @@ -44,6 +44,12 @@
> > # include <cstdlib> // getenv
> > #endif
> >
> > +#if _GLIBCXX_HAVE_WINDOWS_H
> > +# define WIN32_LEAN_AND_MEAN
> > +# include <windows.h>
> > +# include <psapi.h>
> > +#endif
> > +
> > #if defined __GTHREADS && ATOMIC_POINTER_LOCK_FREE == 2
> > # define USE_ATOMIC_LIST_HEAD 1
> > // TODO benchmark atomic<shared_ptr<>> vs mutex.
> > @@ -1144,6 +1150,35 @@ namespace std::chrono
> > #ifdef _GLIBCXX_ZONEINFO_DIR
> > else
> > path = _GLIBCXX_ZONEINFO_DIR;
> > +#endif
> > +#ifdef _GLIBCXX_HAVE_WINDOWS_H
> > + if (path.empty())
> > + {
> > + HMODULE dll_module;
> > + if (GetModuleHandleExA(
> > + GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
> > + | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
> > + reinterpret_cast<const char *>(&zoneinfo_file), &dll_module))
> > + {
> > + char dll_path[MAX_PATH];
> > + if (GetModuleFileNameA(dll_module, dll_path, MAX_PATH) != 0)
> > + {
> > + string_view dll_path_view = dll_path;
> > + auto pos = dll_path_view.find_last_of('\\');
> > + dll_path_view = dll_path_view.substr(0, pos);
> > + if (dll_path_view.ends_with("\\bin"))
> > + {
> > + constexpr string_view remaining_path = "share\\zoneinfo";
> > + dll_path_view.remove_suffix(3); // Remove bin
> > + path.resize(dll_path_view.size()
> > + + remaining_path.size());
> > + auto iter
> > + = ranges::copy(dll_path_view, path.begin()).out;
> > + ranges::copy(remaining_path, iter);
>
> Why not simply:
>
> path = dll_path_view;
> path += remaining_path;
>
> ?
And reserve not resize before that.
>
> > + }
> > + }
> > + }
> > + }
> > #endif
> > if (!path.empty())
> > path.append(filename);
> > --
> > 2.50.0
> >
More information about the Libstdc++
mailing list