perf: Use PERF_SAMPLE_IDENTIFIER
[akaros.git] / tools / profile / perf / xlib.c
index 419d483..897b68e 100644 (file)
 #include <errno.h>
 #include "xlib.h"
 
-void xmem_arena_init(struct mem_arena *ma, size_t block_size)
-{
-       memset(ma, 0, sizeof(*ma));
-       ma->block_size = (block_size != 0) ? block_size : (128 * 1024);
-}
-
-void xmem_arena_destroy(struct mem_arena *ma)
-{
-       struct mem_arena_block *tmp;
-
-       while ((tmp = ma->blocks) != NULL) {
-               ma->blocks = tmp->next;
-               free(tmp);
-       }
-}
-
-void *xmem_arena_alloc(struct mem_arena *ma, size_t size)
-{
-       size_t aspace = ma->top - ma->ptr;
-       void *data;
-
-       size = ROUNDUP(size, sizeof(void *));
-       if (aspace < size) {
-               size_t bsize;
-               struct mem_arena_block *blk;
-
-               /* If there is enough space left, and the requested size is big enough,
-                * hand over full block and keep the leftover space as is.
-                */
-               if (aspace >= (ma->block_size / 8)) {
-                       blk = xmalloc(size + sizeof(struct mem_arena_block));
-                       blk->next = ma->blocks;
-                       ma->blocks = blk;
-
-                       return (char *) blk + sizeof(struct mem_arena_block);
-               }
-
-               bsize = max(ma->block_size, size) + sizeof(struct mem_arena_block);
-               blk = xmalloc(bsize);
-
-               blk->next = ma->blocks;
-               ma->blocks = blk;
-               ma->ptr = (char *) blk + sizeof(struct mem_arena_block);
-               ma->top = ma->ptr + bsize;
-       }
-       data = ma->ptr;
-       ma->ptr += size;
-
-       return data;
-}
-
-void *xmem_arena_zalloc(struct mem_arena *ma, size_t size)
-{
-       void *data = xmem_arena_alloc(ma, size);
-
-       memset(data, 0, size);
-
-       return data;
-}
-
-char *xmem_arena_strdup(struct mem_arena *ma, const char *str)
-{
-       size_t size = strlen(str);
-       char *dstr = xmem_arena_alloc(ma, size + 1);
-
-       memcpy(dstr, str, size + 1);
-
-       return dstr;
-}
-
 int xopen(const char *path, int flags, mode_t mode)
 {
        int fd = open(path, flags, mode);
@@ -149,15 +79,33 @@ FILE *xfopen(const char *path, const char *mode)
        return file;
 }
 
-off_t xfsize(FILE *file)
+FILE *xfdopen(int fd, const char *mode)
 {
-       off_t pos = ftello(file), size;
+       FILE *file = fdopen(fd, mode);
+
+       if (!file) {
+               fprintf(stderr, "Unable to reopen fd '%d' for mode '%s;: %s\n", fd,
+                       mode, strerror(errno));
+               exit(1);
+       }
 
-       xfseek(file, 0, SEEK_END);
-       size = ftello(file);
-       xfseek(file, pos, SEEK_SET);
+       return file;
+}
+
+off_t xfsize(FILE *file)
+{
+       struct stat stat_buf;
+       int fd = fileno(file);
 
-       return size;
+       if (fd < 0) {
+               perror("xfsize fileno");
+               exit(1);
+       }
+       if (fstat(fd, &stat_buf)) {
+               perror("xfsize fstat");
+               exit(1);
+       }
+       return stat_buf.st_size;
 }
 
 void xfwrite(const void *data, size_t size, FILE *file)
@@ -246,3 +194,48 @@ int vb_fdecode_uint64(FILE *file, uint64_t *pval)
 
        return i / 7;
 }
+
+uint8_t nibble_to_num(char c)
+{
+       switch (c) {
+       case '0':
+               return 0;
+       case '1':
+               return 1;
+       case '2':
+               return 2;
+       case '3':
+               return 3;
+       case '4':
+               return 4;
+       case '5':
+               return 5;
+       case '6':
+               return 6;
+       case '7':
+               return 7;
+       case '8':
+               return 8;
+       case '9':
+               return 9;
+       case 'a':
+       case 'A':
+               return 0xa;
+       case 'b':
+       case 'B':
+               return 0xb;
+       case 'c':
+       case 'C':
+               return 0xc;
+       case 'd':
+       case 'D':
+               return 0xd;
+       case 'e':
+       case 'E':
+               return 0xe;
+       case 'f':
+       case 'F':
+               return 0xf;
+       };
+       return -1;
+}