-void nsmstats(int hookhum, void *arg) {
- int i;
- char buf[1024], extra[1024];
- unsigned long totalcount = 0;
- size_t totalsize = 0, totalrealsize = 0;
- long level = (long)arg;
-
- for (i=0;i<MAXPOOL;i++) {
- struct nsmpool *pool=&pools[i];
- size_t realsize;
-
- if (!pool->count)
- continue;
-
- realsize=pool->size + pool->count * sizeof(struct nsminfo) + sizeof(struct nsmpool);
-
- totalsize+=pool->size;
- totalrealsize+=realsize;
- totalcount+=pool->count;
-
- if(level > 10) {
- extra[0] = '\0';
- if(level > 100) {
- struct nsminfo *np = pool->first.next;
- double mean = (double)pool->size / pool->count, variance;
- unsigned long long int sumsq = 0;
-
- for (np=pool->first.next;np;np=np->next)
- sumsq+=np->size * np->size;
-
- variance=(double)sumsq / pool->count - mean * mean;
-
- snprintf(extra, sizeof(extra), ", mean: %.2fKb stddev: %.2fKb", mean / 1024, sqrtf(variance) / 1024);
- }
-
- snprintf(buf, sizeof(buf), "NSMalloc: pool %2d (%10s): %s%s", i, poolnames[i]?poolnames[i]:"??", formatmbuf(pool->count, pool->size, realsize), extra);
- triggerhook(HOOK_CORE_STATSREPLY, buf);
- }
- }
-
- snprintf(buf, sizeof(buf), "NSMalloc: pool totals: %s", formatmbuf(totalcount, totalsize, totalrealsize));
- triggerhook(HOOK_CORE_STATSREPLY, buf);
-}