On Mon, 7 Jul 2025 at 22:01, Jonathan Wakely <jwak...@redhat.com> wrote:
>
> On Mon, 7 Jul 2025 at 21:26, Björn Schäpers <g...@hazardy.de> wrote:
> >
> > From: Björn Schäpers <bjo...@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 <bjo...@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
> >

Reply via email to