linux/tools/perf/util/util.h
<<
>>
Prefs
   1#ifndef GIT_COMPAT_UTIL_H
   2#define GIT_COMPAT_UTIL_H
   3
   4#ifndef FLEX_ARRAY
   5/*
   6 * See if our compiler is known to support flexible array members.
   7 */
   8#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
   9# define FLEX_ARRAY /* empty */
  10#elif defined(__GNUC__)
  11# if (__GNUC__ >= 3)
  12#  define FLEX_ARRAY /* empty */
  13# else
  14#  define FLEX_ARRAY 0 /* older GNU extension */
  15# endif
  16#endif
  17
  18/*
  19 * Otherwise, default to safer but a bit wasteful traditional style
  20 */
  21#ifndef FLEX_ARRAY
  22# define FLEX_ARRAY 1
  23#endif
  24#endif
  25
  26#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
  27
  28#ifdef __GNUC__
  29#define TYPEOF(x) (__typeof__(x))
  30#else
  31#define TYPEOF(x)
  32#endif
  33
  34#define MSB(x, bits) ((x) & TYPEOF(x)(~0ULL << (sizeof(x) * 8 - (bits))))
  35#define HAS_MULTI_BITS(i)  ((i) & ((i) - 1))  /* checks if an integer has more than 1 bit set */
  36
  37/* Approximation of the length of the decimal representation of this type. */
  38#define decimal_length(x)       ((int)(sizeof(x) * 2.56 + 0.5) + 1)
  39
  40#define _ALL_SOURCE 1
  41#define _BSD_SOURCE 1
  42/* glibc 2.20 deprecates _BSD_SOURCE in favour of _DEFAULT_SOURCE */
  43#define _DEFAULT_SOURCE 1
  44#define HAS_BOOL
  45
  46#include <unistd.h>
  47#include <stdio.h>
  48#include <sys/stat.h>
  49#include <sys/statfs.h>
  50#include <fcntl.h>
  51#include <stdbool.h>
  52#include <stddef.h>
  53#include <stdlib.h>
  54#include <stdarg.h>
  55#include <string.h>
  56#include <term.h>
  57#include <errno.h>
  58#include <limits.h>
  59#include <sys/param.h>
  60#include <sys/types.h>
  61#include <dirent.h>
  62#include <sys/time.h>
  63#include <time.h>
  64#include <signal.h>
  65#include <fnmatch.h>
  66#include <assert.h>
  67#include <regex.h>
  68#include <utime.h>
  69#include <sys/wait.h>
  70#include <poll.h>
  71#include <sys/socket.h>
  72#include <sys/ioctl.h>
  73#include <inttypes.h>
  74#include <linux/kernel.h>
  75#include <linux/types.h>
  76#include <sys/ttydefaults.h>
  77#include <api/fs/tracing_path.h>
  78#include <termios.h>
  79#include <linux/bitops.h>
  80#include <termios.h>
  81#include "strlist.h"
  82
  83extern const char *graph_line;
  84extern const char *graph_dotted_line;
  85extern const char *spaces;
  86extern const char *dots;
  87extern char buildid_dir[];
  88
  89/* On most systems <limits.h> would have given us this, but
  90 * not on some systems (e.g. GNU/Hurd).
  91 */
  92#ifndef PATH_MAX
  93#define PATH_MAX 4096
  94#endif
  95
  96#ifndef PRIuMAX
  97#define PRIuMAX "llu"
  98#endif
  99
 100#ifndef PRIu32
 101#define PRIu32 "u"
 102#endif
 103
 104#ifndef PRIx32
 105#define PRIx32 "x"
 106#endif
 107
 108#ifndef PATH_SEP
 109#define PATH_SEP ':'
 110#endif
 111
 112#ifndef STRIP_EXTENSION
 113#define STRIP_EXTENSION ""
 114#endif
 115
 116#ifndef has_dos_drive_prefix
 117#define has_dos_drive_prefix(path) 0
 118#endif
 119
 120#ifndef is_dir_sep
 121#define is_dir_sep(c) ((c) == '/')
 122#endif
 123
 124#ifdef __GNUC__
 125#define NORETURN __attribute__((__noreturn__))
 126#else
 127#define NORETURN
 128#ifndef __attribute__
 129#define __attribute__(x)
 130#endif
 131#endif
 132
 133#define PERF_GTK_DSO  "libperf-gtk.so"
 134
 135/* General helper functions */
 136void usage(const char *err) NORETURN;
 137void die(const char *err, ...) NORETURN __attribute__((format (printf, 1, 2)));
 138int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
 139void warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
 140
 141void set_warning_routine(void (*routine)(const char *err, va_list params));
 142
 143int prefixcmp(const char *str, const char *prefix);
 144void set_buildid_dir(const char *dir);
 145
 146#ifdef __GLIBC_PREREQ
 147#if __GLIBC_PREREQ(2, 1)
 148#define HAVE_STRCHRNUL
 149#endif
 150#endif
 151
 152#ifndef HAVE_STRCHRNUL
 153#define strchrnul gitstrchrnul
 154static inline char *gitstrchrnul(const char *s, int c)
 155{
 156        while (*s && *s != c)
 157                s++;
 158        return (char *)s;
 159}
 160#endif
 161
 162static inline void *zalloc(size_t size)
 163{
 164        return calloc(1, size);
 165}
 166
 167#define zfree(ptr) ({ free(*ptr); *ptr = NULL; })
 168
 169/* Sane ctype - no locale, and works with signed chars */
 170#undef isascii
 171#undef isspace
 172#undef isdigit
 173#undef isxdigit
 174#undef isalpha
 175#undef isprint
 176#undef isalnum
 177#undef islower
 178#undef isupper
 179#undef tolower
 180#undef toupper
 181
 182#ifndef NSEC_PER_MSEC
 183#define NSEC_PER_MSEC   1000000L
 184#endif
 185
 186int parse_nsec_time(const char *str, u64 *ptime);
 187
 188extern unsigned char sane_ctype[256];
 189#define GIT_SPACE               0x01
 190#define GIT_DIGIT               0x02
 191#define GIT_ALPHA               0x04
 192#define GIT_GLOB_SPECIAL        0x08
 193#define GIT_REGEX_SPECIAL       0x10
 194#define GIT_PRINT_EXTRA         0x20
 195#define GIT_PRINT               0x3E
 196#define sane_istest(x,mask) ((sane_ctype[(unsigned char)(x)] & (mask)) != 0)
 197#define isascii(x) (((x) & ~0x7f) == 0)
 198#define isspace(x) sane_istest(x,GIT_SPACE)
 199#define isdigit(x) sane_istest(x,GIT_DIGIT)
 200#define isxdigit(x)     \
 201        (sane_istest(toupper(x), GIT_ALPHA | GIT_DIGIT) && toupper(x) < 'G')
 202#define isalpha(x) sane_istest(x,GIT_ALPHA)
 203#define isalnum(x) sane_istest(x,GIT_ALPHA | GIT_DIGIT)
 204#define isprint(x) sane_istest(x,GIT_PRINT)
 205#define islower(x) (sane_istest(x,GIT_ALPHA) && (x & 0x20))
 206#define isupper(x) (sane_istest(x,GIT_ALPHA) && !(x & 0x20))
 207#define tolower(x) sane_case((unsigned char)(x), 0x20)
 208#define toupper(x) sane_case((unsigned char)(x), 0)
 209
 210static inline int sane_case(int x, int high)
 211{
 212        if (sane_istest(x, GIT_ALPHA))
 213                x = (x & ~0x20) | high;
 214        return x;
 215}
 216
 217int mkdir_p(char *path, mode_t mode);
 218int rm_rf(char *path);
 219struct strlist *lsdir(const char *name, bool (*filter)(const char *, struct dirent *));
 220bool lsdir_no_dot_filter(const char *name, struct dirent *d);
 221int copyfile(const char *from, const char *to);
 222int copyfile_mode(const char *from, const char *to, mode_t mode);
 223int copyfile_offset(int fromfd, loff_t from_ofs, int tofd, loff_t to_ofs, u64 size);
 224
 225s64 perf_atoll(const char *str);
 226char **argv_split(const char *str, int *argcp);
 227void argv_free(char **argv);
 228bool strglobmatch(const char *str, const char *pat);
 229bool strlazymatch(const char *str, const char *pat);
 230static inline bool strisglob(const char *str)
 231{
 232        return strpbrk(str, "*?[") != NULL;
 233}
 234int strtailcmp(const char *s1, const char *s2);
 235char *strxfrchar(char *s, char from, char to);
 236unsigned long convert_unit(unsigned long value, char *unit);
 237ssize_t readn(int fd, void *buf, size_t n);
 238ssize_t writen(int fd, void *buf, size_t n);
 239
 240struct perf_event_attr;
 241
 242void event_attr_init(struct perf_event_attr *attr);
 243
 244#define _STR(x) #x
 245#define STR(x) _STR(x)
 246
 247size_t hex_width(u64 v);
 248int hex2u64(const char *ptr, u64 *val);
 249
 250char *ltrim(char *s);
 251char *rtrim(char *s);
 252
 253static inline char *trim(char *s)
 254{
 255        return ltrim(rtrim(s));
 256}
 257
 258void dump_stack(void);
 259void sighandler_dump_stack(int sig);
 260
 261extern unsigned int page_size;
 262extern int cacheline_size;
 263extern int sysctl_perf_event_max_stack;
 264extern int sysctl_perf_event_max_contexts_per_stack;
 265
 266struct parse_tag {
 267        char tag;
 268        int mult;
 269};
 270
 271unsigned long parse_tag_value(const char *str, struct parse_tag *tags);
 272
 273#define SRCLINE_UNKNOWN  ((char *) "??:0")
 274
 275static inline int path__join(char *bf, size_t size,
 276                             const char *path1, const char *path2)
 277{
 278        return scnprintf(bf, size, "%s%s%s", path1, path1[0] ? "/" : "", path2);
 279}
 280
 281static inline int path__join3(char *bf, size_t size,
 282                              const char *path1, const char *path2,
 283                              const char *path3)
 284{
 285        return scnprintf(bf, size, "%s%s%s%s%s",
 286                         path1, path1[0] ? "/" : "",
 287                         path2, path2[0] ? "/" : "", path3);
 288}
 289
 290struct dso;
 291struct symbol;
 292
 293extern bool srcline_full_filename;
 294char *get_srcline(struct dso *dso, u64 addr, struct symbol *sym,
 295                  bool show_sym);
 296char *__get_srcline(struct dso *dso, u64 addr, struct symbol *sym,
 297                  bool show_sym, bool unwind_inlines);
 298void free_srcline(char *srcline);
 299
 300int perf_event_paranoid(void);
 301
 302void mem_bswap_64(void *src, int byte_size);
 303void mem_bswap_32(void *src, int byte_size);
 304
 305const char *get_filename_for_perf_kvm(void);
 306bool find_process(const char *name);
 307
 308#ifdef HAVE_ZLIB_SUPPORT
 309int gzip_decompress_to_file(const char *input, int output_fd);
 310#endif
 311
 312#ifdef HAVE_LZMA_SUPPORT
 313int lzma_decompress_to_file(const char *input, int output_fd);
 314#endif
 315
 316char *asprintf_expr_inout_ints(const char *var, bool in, size_t nints, int *ints);
 317
 318static inline char *asprintf_expr_in_ints(const char *var, size_t nints, int *ints)
 319{
 320        return asprintf_expr_inout_ints(var, true, nints, ints);
 321}
 322
 323static inline char *asprintf_expr_not_in_ints(const char *var, size_t nints, int *ints)
 324{
 325        return asprintf_expr_inout_ints(var, false, nints, ints);
 326}
 327
 328int get_stack_size(const char *str, unsigned long *_size);
 329
 330int fetch_kernel_version(unsigned int *puint,
 331                         char *str, size_t str_sz);
 332#define KVER_VERSION(x)         (((x) >> 16) & 0xff)
 333#define KVER_PATCHLEVEL(x)      (((x) >> 8) & 0xff)
 334#define KVER_SUBLEVEL(x)        ((x) & 0xff)
 335#define KVER_FMT        "%d.%d.%d"
 336#define KVER_PARAM(x)   KVER_VERSION(x), KVER_PATCHLEVEL(x), KVER_SUBLEVEL(x)
 337
 338const char *perf_tip(const char *dirpath);
 339bool is_regular_file(const char *file);
 340int fetch_current_timestamp(char *buf, size_t sz);
 341
 342enum binary_printer_ops {
 343        BINARY_PRINT_DATA_BEGIN,
 344        BINARY_PRINT_LINE_BEGIN,
 345        BINARY_PRINT_ADDR,
 346        BINARY_PRINT_NUM_DATA,
 347        BINARY_PRINT_NUM_PAD,
 348        BINARY_PRINT_SEP,
 349        BINARY_PRINT_CHAR_DATA,
 350        BINARY_PRINT_CHAR_PAD,
 351        BINARY_PRINT_LINE_END,
 352        BINARY_PRINT_DATA_END,
 353};
 354
 355typedef void (*print_binary_t)(enum binary_printer_ops,
 356                               unsigned int val,
 357                               void *extra);
 358
 359void print_binary(unsigned char *data, size_t len,
 360                  size_t bytes_per_line, print_binary_t printer,
 361                  void *extra);
 362
 363#if !defined(__GLIBC__) && !defined(__ANDROID__)
 364extern int sched_getcpu(void);
 365#endif
 366
 367int is_printable_array(char *p, unsigned int len);
 368#endif /* GIT_COMPAT_UTIL_H */
 369