On Fri, May 24, 2013 at 04:22:43PM +0100, Jonathan Wakely wrote:
> On 24 May 2013 16:03, Jakub Jelinek wrote:
> >
> > So, adjusted patches attached, ok for trunk/4.8 if they pass
> > bootstrap/regtest?
> 
> Yes, they're OK - thanks for sorting it out.

Note, I've already committed the patches, but further testing using
#include <chrono>
#include <unistd.h>

int
main()
{
  using namespace std::chrono;
  steady_clock::time_point t1 = steady_clock::now();
  sleep (2);
  steady_clock::time_point t2 = steady_clock::now();
  auto d1 = t1.time_since_epoch ();
  auto d2 = t2.time_since_epoch ();
  long long l1 = d1.count ();
  long long l2 = d1.zero ().count ();
  long long l3 = d1.min ().count ();
  long long l4 = d1.max ().count ();
  long long l5 = d2.count ();
  __builtin_printf ("%lld %lld %lld %lld %lld %lld\n", l1, l2, l3, l4, l5, l5 - 
l1);
  system_clock::time_point t3 = system_clock::now();
  sleep (2);
  system_clock::time_point t4 = system_clock::now();
  auto d3 = t3.time_since_epoch ();
  auto d4 = t4.time_since_epoch ();
  l1 = d3.count ();
  l2 = d3.zero ().count ();
  l3 = d3.min ().count ();
  l4 = d3.max ().count ();
  l5 = d4.count ();
  __builtin_printf ("%lld %lld %lld %lld %lld %lld\n", l1, l2, l3, l4, l5, l5 - 
l1);
  return 0;
}

seems to point at another possible serious ABI issue.

g++ 4.7 compiled, linked and run against:
1369424708027221 0 -9223372036854775808 9223372036854775807 1369424710027308 
2000087
1369424710027397 0 -9223372036854775808 9223372036854775807 1369424712027522 
2000125
g++ 4.8 head (with the patch) with
-       if test x"$ac_has_clock_monotonic_syscall" = x"yes"; then
+       if test x"$ac_has_clock_monotonic_syscall" = x"yesz"; then
in configure (thus, typedef system_clock steady_clock; plus
steady_clock::now() in libstdc++):
1369424714156881 0 -9223372036854775808 9223372036854775807 1369424716157039 
2000158
1369424716157108 0 -9223372036854775808 9223372036854775807 1369424718157236 
2000128
g++ 4.8 head (with the patch):
1421990971125719 0 -9223372036854775808 9223372036854775807 1421992971246052 
2000120333
1369424821707660285 0 -9223372036854775808 9223372036854775807 
1369424823707805952 2000145667
g++ 4.8 head compiled, but run against libstdc++ built with that configure hack:
1369424720776367000 0 -9223372036854775808 9223372036854775807 
1369424722776515000 2000148000
1369424722776583 0 -9223372036854775808 9223372036854775807 1369424724776704 
2000121
4.7 compiled, run against 4.8 head libstdc++.so:
1369425485748333050 0 -9223372036854775808 9223372036854775807 
1369425487748453585 2000120535
1369425487748521770 0 -9223372036854775808 9223372036854775807 
1369425489748695701 2000173931
4.7 compiled, run against 4.8 head with configure hack libstdc++.so:
1369425496792688 0 -9223372036854775808 9223372036854775807 1369425498792910 
2000222
1369425498792966 0 -9223372036854775808 9223372036854775807 1369425500793089 
2000123

So, there is a minor issue that what is std::chrono::steady_clock has
changed, if you say use it as a function parameter, it will mangle
differently before/after.  Guess not that big a deal, after all, C++11
support is still experimental, right?

But the more important issue is that std::chrono::system_clock broke,
code compiled against the old headers will assume
std::chrono::system_clock::duration is microseconds resolution on Linux,
while code compiled against the new headers will assume it is in
nanoseconds resolution.  That is because of:
#ifdef _GLIBCXX_USE_CLOCK_REALTIME
      typedef chrono::nanoseconds                               duration;
#elif defined(_GLIBCXX_USE_GETTIMEOFDAY)
      typedef chrono::microseconds                              duration;
#else
      typedef chrono::seconds                                   duration;
#endif

Thus, I'm afraid we can't ABI compatibly change either of these macros,
unless we e.g. keep old std::chrono::system_clock as is and introduce
std::chrono::__whatever::system_clock or whatever, that will be typedefed
as std::chrono::system_clock.  Is it a big issue if system_clock will have
just old resolution (usec) and =auto code is reverted to only tweak
steady_clock (aka. _GLIBCXX_USE_CLOCK_MONOTONIC) (then for 4.8 the change
would be just to drop
          ac_has_clock_realtime=yes
line from if test x"$ac_has_clock_monotonic_syscall" = x"yes"; then)?

Ugh, C++ and ABI doesn't go well together...

        Jakub

Reply via email to