summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2014-05-26 12:11:22 +0200
committerJustus Winter <4winter@informatik.uni-hamburg.de>2014-05-26 12:11:22 +0200
commit48e52060c2c04bd6e58858110a3bdd429a24c8ea (patch)
treee3fc705f67b06628a3cdd717ef6ebf590ce4d11d
parent70ea4105755463ed82d72961a202f4139b54df93 (diff)
update procfs
-rw-r--r--procfs/rootdir.c69
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 */