-void nsmstats(int hookhum, void *arg) {
- int i;
- char buf[1024], header[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);
-
- snprintf(header, sizeof(header), "NSMalloc: pool %2d (%s): ", i, poolnames[i]?poolnames[i]:"??");
-
- if(level > 10) {
- snprintf(buf, sizeof(buf), "%s %s", header, formatmbuf(pool->count, pool->size, realsize));
- triggerhook(HOOK_CORE_STATSREPLY, buf);
- }
-
- totalsize+=pool->size;
- totalrealsize+=realsize;
- totalcount+=pool->count;
-
- 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(buf, sizeof(buf), "%s allocation sumsq: %llu mean: %.2f variance: %.2f stddev: %.2f", header, sumsq, mean, variance, sqrtf(variance));
- triggerhook(HOOK_CORE_STATSREPLY, buf);
- }
- }
-
- snprintf(buf, sizeof(buf), "NSMalloc: pool totals: %s", formatmbuf(totalcount, totalsize, totalrealsize));
- triggerhook(HOOK_CORE_STATSREPLY, buf);
-}