c284d669a2
Code move only; no functional change intended. Committer notes: Fix the build on Ubuntu 16.04 x86-64 cross-compiling to S/390, with this set of auto-detected features: ... dwarf: [ on ] ... dwarf_getlocations: [ on ] ... glibc: [ on ] ... gtk2: [ OFF ] ... libaudit: [ OFF ] ... libbfd: [ OFF ] ... libelf: [ on ] ... libnuma: [ OFF ] ... numa_num_possible_cpus: [ OFF ] ... libperl: [ OFF ] ... libpython: [ OFF ] ... libslang: [ OFF ] ... libcrypto: [ OFF ] ... libunwind: [ OFF ] ... libdw-dwarf-unwind: [ on ] ... zlib: [ on ] ... lzma: [ OFF ] ... get_cpuid: [ OFF ] ... bpf: [ on ] Where it was failing with: CC /tmp/build/perf/util/time-utils.o util/time-utils.c: In function 'parse_nsec_time': util/time-utils.c:17:13: error: implicit declaration of function 'strtoul' [-Werror=implicit-function-declaration] time_sec = strtoul(str, &end, 10); ^ util/time-utils.c:17:2: error: nested extern declaration of 'strtoul' [-Werror=nested-externs] time_sec = strtoul(str, &end, 10); ^ util/time-utils.c: In function 'perf_time__parse_str': util/time-utils.c:93:2: error: implicit declaration of function 'free' [-Werror=implicit-function-declaration] free(str); ^ util/time-utils.c:93:2: error: incompatible implicit declaration of built-in function 'free' [-Werror] util/time-utils.c:93:2: note: include '<stdlib.h>' or provide a declaration of 'free' Do as suggested and add a '#include <stdlib.h>' to get the free() and strtoul() declarations and fix the build. Signed-off-by: David Ahern <dsahern@gmail.com> Acked-by: Namhyung Kim <namhyung@kernel.org> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/1480439746-42695-3-git-send-email-dsahern@gmail.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
120 lines
2.3 KiB
C
120 lines
2.3 KiB
C
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <sys/time.h>
|
|
#include <linux/time64.h>
|
|
#include <time.h>
|
|
#include <errno.h>
|
|
#include <inttypes.h>
|
|
|
|
#include "perf.h"
|
|
#include "debug.h"
|
|
#include "time-utils.h"
|
|
|
|
int parse_nsec_time(const char *str, u64 *ptime)
|
|
{
|
|
u64 time_sec, time_nsec;
|
|
char *end;
|
|
|
|
time_sec = strtoul(str, &end, 10);
|
|
if (*end != '.' && *end != '\0')
|
|
return -1;
|
|
|
|
if (*end == '.') {
|
|
int i;
|
|
char nsec_buf[10];
|
|
|
|
if (strlen(++end) > 9)
|
|
return -1;
|
|
|
|
strncpy(nsec_buf, end, 9);
|
|
nsec_buf[9] = '\0';
|
|
|
|
/* make it nsec precision */
|
|
for (i = strlen(nsec_buf); i < 9; i++)
|
|
nsec_buf[i] = '0';
|
|
|
|
time_nsec = strtoul(nsec_buf, &end, 10);
|
|
if (*end != '\0')
|
|
return -1;
|
|
} else
|
|
time_nsec = 0;
|
|
|
|
*ptime = time_sec * NSEC_PER_SEC + time_nsec;
|
|
return 0;
|
|
}
|
|
|
|
static int parse_timestr_sec_nsec(struct perf_time_interval *ptime,
|
|
char *start_str, char *end_str)
|
|
{
|
|
if (start_str && (*start_str != '\0') &&
|
|
(parse_nsec_time(start_str, &ptime->start) != 0)) {
|
|
return -1;
|
|
}
|
|
|
|
if (end_str && (*end_str != '\0') &&
|
|
(parse_nsec_time(end_str, &ptime->end) != 0)) {
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int perf_time__parse_str(struct perf_time_interval *ptime, const char *ostr)
|
|
{
|
|
char *start_str, *end_str;
|
|
char *d, *str;
|
|
int rc = 0;
|
|
|
|
if (ostr == NULL || *ostr == '\0')
|
|
return 0;
|
|
|
|
/* copy original string because we need to modify it */
|
|
str = strdup(ostr);
|
|
if (str == NULL)
|
|
return -ENOMEM;
|
|
|
|
ptime->start = 0;
|
|
ptime->end = 0;
|
|
|
|
/* str has the format: <start>,<stop>
|
|
* variations: <start>,
|
|
* ,<stop>
|
|
* ,
|
|
*/
|
|
start_str = str;
|
|
d = strchr(start_str, ',');
|
|
if (d) {
|
|
*d = '\0';
|
|
++d;
|
|
}
|
|
end_str = d;
|
|
|
|
rc = parse_timestr_sec_nsec(ptime, start_str, end_str);
|
|
|
|
free(str);
|
|
|
|
/* make sure end time is after start time if it was given */
|
|
if (rc == 0 && ptime->end && ptime->end < ptime->start)
|
|
return -EINVAL;
|
|
|
|
pr_debug("start time %" PRIu64 ", ", ptime->start);
|
|
pr_debug("end time %" PRIu64 "\n", ptime->end);
|
|
|
|
return rc;
|
|
}
|
|
|
|
bool perf_time__skip_sample(struct perf_time_interval *ptime, u64 timestamp)
|
|
{
|
|
/* if time is not set don't drop sample */
|
|
if (timestamp == 0)
|
|
return false;
|
|
|
|
/* otherwise compare sample time to time window */
|
|
if ((ptime->start && timestamp < ptime->start) ||
|
|
(ptime->end && timestamp > ptime->end)) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|