diff options
author | Laurent Bercot <ska-skaware@skarnet.org> | 2023-02-11 08:13:14 +0000 |
---|---|---|
committer | Laurent Bercot <ska@appnovation.com> | 2023-02-11 08:13:14 +0000 |
commit | 2f8984613e17f9e5971ec338240b0bb6d2dd1cc6 (patch) | |
tree | 4061a64dc5ee8c415ca249ec1852cfc666e1468b /src/minutils/s6ps_wchan.c | |
parent | 3caba3fd8f3825544c065ec62e4298c6edc76b28 (diff) | |
download | s6-linux-utils-2f8984613e17f9e5971ec338240b0bb6d2dd1cc6.tar.xz |
Code refactor; only s6-ps has remaining globals now
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src/minutils/s6ps_wchan.c')
-rw-r--r-- | src/minutils/s6ps_wchan.c | 94 |
1 files changed, 0 insertions, 94 deletions
diff --git a/src/minutils/s6ps_wchan.c b/src/minutils/s6ps_wchan.c deleted file mode 100644 index 209e1ef..0000000 --- a/src/minutils/s6ps_wchan.c +++ /dev/null @@ -1,94 +0,0 @@ -/* ISC license. */ - -#include <string.h> -#include <sys/utsname.h> -#include <skalibs/uint64.h> -#include <skalibs/stralloc.h> -#include <skalibs/genalloc.h> -#include <skalibs/djbunix.h> -#include "s6-ps.h" - -static stralloc sysmap = STRALLOC_ZERO ; -static genalloc ind = GENALLOC_ZERO ; - -int s6ps_wchan_init (char const *file) -{ - if (file) - { - if (!openslurpclose(&sysmap, file)) return 0 ; - } - else - { - char *files[3] = { "/proc/kallsyms", 0, "/boot/System.map" } ; - struct utsname uts ; - size_t n ; - if (uname(&uts) < 0) return 0 ; - n = strlen(uts.release) ; - { - char buf[18 + n] ; - unsigned int i = 0 ; - memcpy(buf, "/boot/System.map", 16) ; - buf[16] = '-' ; - memcpy(buf + 17, uts.release, n + 1) ; - files[1] = buf ; - for (; i < 3 ; i++) - if (openslurpclose(&sysmap, files[i])) break ; - if (i >= 3) return 0 ; - } - } - { - size_t i = 0 ; - if (!genalloc_append(size_t, &ind, &i)) goto err2 ; - for (i = 1 ; i <= sysmap.len ; i++) - if (sysmap.s[i-1] == '\n') - if (!genalloc_append(size_t, &ind, &i)) goto err ; - } - return 1 ; - err: - genalloc_free(size_t, &ind) ; - err2: - stralloc_free(&sysmap) ; - return 0 ; -} - -void s6ps_wchan_finish (void) -{ - genalloc_free(size_t, &ind) ; - stralloc_free(&sysmap) ; -} - -static inline size_t lookup (uint64_t addr, size_t *i) -{ - size_t low = 0, mid, high = genalloc_len(size_t, &ind), len ; - for (;;) - { - uint64_t cur ; - mid = (low + high) >> 1 ; - len = uint64_xscan(sysmap.s + genalloc_s(size_t, &ind)[mid], &cur) ; - if (!len) return 0 ; - if (cur == addr) break ; - if (mid == low) return 0 ; - if (addr < cur) high = mid ; else low = mid ; - } - *i = mid ; - return len ; -} - -int s6ps_wchan_lookup (stralloc *sa, uint64_t addr) -{ - if (addr == (sizeof(void *) == 8 ? 0xffffffffffffffffULL : 0xffffffffUL)) - return stralloc_catb(sa, "*", 1) ; - if (!addr) return stralloc_catb(sa, "-", 1) ; - if (sysmap.len) - { - size_t i, pos, len = lookup(addr, &i) ; - if (!len) return stralloc_catb(sa, "?", 1) ; - pos = genalloc_s(size_t, &ind)[i] + len + 3 ; - return stralloc_catb(sa, sysmap.s + pos, genalloc_s(size_t, &ind)[i+1] - 1 - pos) ; - } - if (!stralloc_readyplus(sa, UINT64_FMT + 3)) return 0 ; - stralloc_catb(sa, "(0x", 3) ; - sa->len += uint64_fmt(sa->s + sa->len, addr) ; - stralloc_catb(sa, ")", 1) ; - return 1 ; -} |