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