misc/187668: Profiling timer does not work when setting low interval
Vasily Postnicov
shamaz.mazum at gmail.com
Mon Mar 17 18:00:00 UTC 2014
>Number: 187668
>Category: misc
>Synopsis: Profiling timer does not work when setting low interval
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Mon Mar 17 18:00:00 UTC 2014
>Closed-Date:
>Last-Modified:
>Originator: Vasily Postnicov
>Release: Freebsd 10.0
>Organization:
>Environment:
FreeBSD vonbraun 10.0-RELEASE FreeBSD 10.0-RELEASE #1 513d8e6(clocktst): Sun Mar 16 23:02:04 MSK 2014 vasily at vonbraun:/usr/obj/usr/src/sys/MYKERNEL10 am
d64
>Description:
After this commit:
https://github.com/freebsd/freebsd/commit/5dfd8a110a3e6121977586541b839200faef91da
a statistical profiler in SBCL (Steel Bank Common Lisp) does not work when sampling interval is set very low.
I attach a test which gives unexpected results which confuse SBCL when profiling interval is set to 0.1 ms (just as in sb-sprof test from SBCL):
Start
1
0 100 -15 676200
And with that commit reverted it gives following:
Start
14344
0 1000 0 1000
It means that lowest possible profiling interval is set (1 ms). All as expected.
>How-To-Repeat:
Just compile and run my test and wait 15 sec.
>Fix:
Patch attached with submission follows:
#include <sys/time.h>
#include <signal.h>
#include <stdio.h>
int counter = 0;
void handler (int sig)
{
counter++;
}
int main ()
{
printf ("Start\n");
struct sigaction sa;
sa.sa_handler = handler;
sa.sa_flags = 0;
sigemptyset (&sa.sa_mask);
sigaction (SIGPROF, &sa, NULL);
struct itimerval val;
struct itimerval val_old;
val.it_interval.tv_sec = 0;
val.it_interval.tv_usec = 100;
val.it_value.tv_sec = 0;
val.it_value.tv_usec = 100;
struct timeval time;
gettimeofday(&time, 0);
time_t start = time.tv_sec;
time_t cur = start;
setitimer (2, &val, NULL);
do
{
gettimeofday(&time, 0);
cur = time.tv_sec;
}
while (cur < start+15);
val.it_value.tv_sec = 0;
val.it_value.tv_usec = 0;
setitimer (2, &val, &val_old);
printf ("%i\n", counter);
printf ("%li %li %li %li\n",
val_old.it_interval.tv_sec,
val_old.it_interval.tv_usec,
val_old.it_value.tv_sec,
val_old.it_value.tv_usec);
return 0;
}
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list