Mailinglist Archive: opensuse-bugs (6095 mails)

< Previous Next >
[Bug 1040589] bash/gcc/gzip/python differ between builds because of profiling
  • From: bugzilla_noreply@xxxxxxxxxx
  • Date: Wed, 18 Apr 2018 10:34:31 +0000
  • Message-id: <bug-1040589-21960-sljyXGKkXQ@http.bugzilla.opensuse.org/>
http://bugzilla.opensuse.org/show_bug.cgi?id=1040589
http://bugzilla.opensuse.org/show_bug.cgi?id=1040589#c9

Martin Liška <martin.liska@xxxxxxxx> changed:

What |Removed |Added
----------------------------------------------------------------------------
CC| |martin.liska@xxxxxxxx

--- Comment #9 from Martin Liška <martin.liska@xxxxxxxx> ---
So I did analysis of 2 packages before the changes in Factory happened:

1) gzip - as mentioned a temp file was used and zipped. Temp file name probably
causes the divergence as it's always different.

2) sed - it uses pthreads (but not passed as CFLAGS), thus I added
-fprofile-update=atomic to cflags. See documentation here:

https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html

and I've got it, diff in between 2 runs:

./gnulib-tests/nanosleep.gcda: a3000000: 37:PROGRAM_SUMMARY
checksum=0x99d0fa93
[snip]
./gnulib-tests/nanosleep.gcda: 01a10000: 14:COUNTERS arcs 7 counts
./gnulib-tests/nanosleep.gcda: 0 2 1 1 0 1 29 30

./gnulib-tests/nanosleep.gcda: a3000000: 37:PROGRAM_SUMMARY
checksum=0xc3046d04
[snip]
./gnulib-tests/nanosleep.gcda: 0 2 1 1 0 1 30 31

./lib/stat-time.h:

stat_time_normalize (int result, struct stat *st _GL_UNUSED)
{
#if defined __sun && defined STAT_TIMESPEC
if (result == 0)
{
long int timespec_resolution = 1000000000;
short int const ts_off[] = { offsetof (struct stat, st_atim),
offsetof (struct stat, st_mtim),
offsetof (struct stat, st_ctim) };
int i;
for (i = 0; i < sizeof ts_off / sizeof *ts_off; i++)
{
struct timespec *ts = (struct timespec *) ((char *) st + ts_off[i]);
long int q = ts->tv_nsec / timespec_resolution;
long int r = ts->tv_nsec % timespec_resolution;
if (r < 0)
{
r += timespec_resolution;
q--;
}
ts->tv_nsec = r;
/* Overflow is possible, as Solaris 11 stat can yield
tv_sec == TYPE_MINIMUM (time_t) && tv_nsec == -1000000000.
INT_ADD_WRAPV is OK, since time_t is signed on Solaris. */
if (INT_ADD_WRAPV (q, ts->tv_sec, &ts->tv_sec))
{
errno = EOVERFLOW;
return -1;
}
}
}
#endif
return result;
}

It loops based on how fast time flies. This can't be stable.

--
You are receiving this mail because:
You are on the CC list for the bug.
< Previous Next >