diff options
author | Justus Winter <4winter@informatik.uni-hamburg.de> | 2014-05-26 12:11:22 +0200 |
---|---|---|
committer | Justus Winter <4winter@informatik.uni-hamburg.de> | 2014-05-26 12:11:22 +0200 |
commit | 48e52060c2c04bd6e58858110a3bdd429a24c8ea (patch) | |
tree | e3fc705f67b06628a3cdd717ef6ebf590ce4d11d | |
parent | 70ea4105755463ed82d72961a202f4139b54df93 (diff) |
update procfs
-rw-r--r-- | procfs/rootdir.c | 69 |
1 files changed, 23 insertions, 46 deletions
diff --git a/procfs/rootdir.c b/procfs/rootdir.c index bba98116..076885c9 100644 --- a/procfs/rootdir.c +++ b/procfs/rootdir.c @@ -478,17 +478,16 @@ static error_t rootdir_gc_slabinfo (void *hook, char **contents, ssize_t *contents_len) { error_t err; + FILE *m; const char header[] = "cache obj slab bufs objs bufs" " total reclaimable\n" "name flags size size /slab usage count" " memory memory\n"; - char **infos, *p; - ssize_t length, written; cache_info_array_t cache_info; size_t mem_usage, mem_reclaimable, mem_total, mem_total_reclaimable; mach_msg_type_number_t cache_info_count; - int i, j; + int i; cache_info = NULL; cache_info_count = 0; @@ -497,11 +496,15 @@ rootdir_gc_slabinfo (void *hook, char **contents, ssize_t *contents_len) if (err) return err; - infos = malloc ((cache_info_count + 1) * sizeof *infos); - if (infos == NULL) - return ENOMEM; + m = open_memstream (contents, contents_len); + if (m == NULL) + { + err = ENOMEM; + goto out; + } + + fprintf (m, "%s", header); - length = sizeof header; /* Includes the terminating 0. */ mem_total = 0; mem_total_reclaimable = 0; @@ -514,50 +517,24 @@ rootdir_gc_slabinfo (void *hook, char **contents, ssize_t *contents_len) ? 0 : (cache_info[i].nr_free_slabs * cache_info[i].slab_size) >> 10; mem_total_reclaimable += mem_reclaimable; - length += written = - asprintf (&infos[i], - "%-21s %04x %7zu %3zuk %4lu %6lu %6lu %7zuk %10zuk\n", - cache_info[i].name, cache_info[i].flags, - cache_info[i].obj_size, cache_info[i].slab_size >> 10, - cache_info[i].bufs_per_slab, cache_info[i].nr_objs, - cache_info[i].nr_bufs, mem_usage, mem_reclaimable); - if (written == -1) - goto out; + fprintf (m, + "%-21s %04x %7zu %3zuk %4lu %6lu %6lu %7zuk %10zuk\n", + cache_info[i].name, cache_info[i].flags, + cache_info[i].obj_size, cache_info[i].slab_size >> 10, + cache_info[i].bufs_per_slab, cache_info[i].nr_objs, + cache_info[i].nr_bufs, mem_usage, mem_reclaimable); } - length += written = - asprintf (&infos[i], "total: %zuk, reclaimable: %zuk\n", - mem_total, mem_total_reclaimable); - if (written == -1) - goto out; + fprintf (m, "total: %zuk, reclaimable: %zuk\n", + mem_total, mem_total_reclaimable); - *contents = p = malloc (length); - if (p == NULL) - goto out; - - strcpy (p, header); - p += sizeof header - 1; /* Without the 0. */ - - for (i = 0; i < cache_info_count + 1; i++) - { - size_t l = strlen (infos[i]); - memcpy (p, infos[i], l); - p += l; - free (infos[i]); - } - free (infos); - - *p = 0; - p += 1; - assert (p == *contents + length); - *contents_len = length; - return 0; + fclose (m); + *contents_len += 1; /* For the terminating 0. */ out: - for (j = 0; j < i; j++) - free (infos[j]); - free (infos); - return ENOMEM; + vm_deallocate (mach_task_self (), + cache_info, cache_info_count * sizeof *cache_info); + return err; } /* Glue logic and entries table */ |