#define _POSIX_C_SOURCE 200809L #include #include #include #include #include #define MAX_NTH 160 #define LOOPS 100000 #define SH_COUNT 300 #define PV_COUNT 300 #define MAX_SZ 500//00 #define DEF_SZ 40//00 #define TEST test4 struct { pthread_mutex_t lock; void *mem; } foo[SH_COUNT]; static unsigned rng(unsigned *r) { return *r = *r * 1103515245 + 12345; } static void *test1(void *unused) { void *p[PV_COUNT] = { 0 }; unsigned sz[PV_COUNT] = { 0 }; unsigned r = (unsigned)pthread_self(); int i, j; size_t k; for (i=0; i1) testid = atoi(argv[1]); if (argc>2) nth = atoi(argv[2]); #if 0 for (i=0; i<1024; i++) p[i] = malloc(32768); for (i=0; i<1024; i++) free(p[i]); #endif clock_gettime(CLOCK_REALTIME, &tv_init); for (i=0; i>= 10; clock_gettime(CLOCK_REALTIME, &tv); tv.tv_sec -= tv_init.tv_sec; if ((tv.tv_nsec -= tv_init.tv_nsec) < 0) { tv.tv_nsec += 1000000000; tv.tv_sec--; } f = fopen("/proc/self/smaps", "rb"); if (f) while (fgets(buf, sizeof buf, f)) { if (sscanf(buf, "%*lx-%*lx %*s %*lx %x:%x %*lu %*s", &maj, &min)==2) in_heap = (!maj && !min && !strstr(buf, "---p") && (strstr(buf, "[heap]") || !strchr(buf, '['))); if (in_heap) { if (sscanf(buf, "Size: %lu", &l)==1) vm_size += l; else if (sscanf(buf, "Rss: %lu", &l)==1) vm_rss += l; else if (sscanf(buf, "Private_Clean: %lu", &l)==1) vm_priv_clean += l; else if (sscanf(buf, "Private_Dirty: %lu", &l)==1) vm_priv_dirty += l; } } if (f) fclose(f); printf("%ld.%.9ld seconds elapsed\n", tv.tv_sec, tv.tv_nsec); printf("logical: %zu, vss: %zu, rss: %zu, clean: %zu, dirty: %zu\n", l_size, vm_size, vm_rss, vm_priv_clean, vm_priv_dirty); //dump_heap(); return 0; }