提交 88b77adc 编写于 作者: O olefirenque

feat: rework stats implementation

Signed-off-by: Nolefirenque <olefirenko.egor@huawei-partners.com>
上级 dddb371a
......@@ -18,33 +18,23 @@ void *memalign(size_t, size_t);
size_t malloc_usable_size(void *);
struct mallinfo {
int arena;
int ordblks;
int smblks;
int hblks;
int hblkhd;
int usmblks;
int fsmblks;
int uordblks;
int fordblks;
int keepcost;
};
#define __MALLINFO_BODY \
size_t arena; \
size_t ordblks; \
size_t smblks; \
size_t hblks; \
size_t hblkhd; \
size_t usmblks; \
size_t fsmblks; \
size_t uordblks; \
size_t fordblks; \
size_t keepcost;
struct mallinfo { __MALLINFO_BODY };
struct mallinfo mallinfo(void);
struct mallinfo2 {
size_t arena;
size_t ordblks;
size_t smblks;
size_t hblks;
size_t hblkhd;
size_t usmblks;
size_t fsmblks;
size_t uordblks;
size_t fordblks;
size_t keepcost;
};
struct mallinfo2 { __MALLINFO_BODY };
struct mallinfo2 mallinfo2(void);
......
......@@ -18,31 +18,21 @@ void *memalign(size_t, size_t);
size_t malloc_usable_size(void *);
struct mallinfo {
int arena;
int ordblks;
int smblks;
int hblks;
int hblkhd;
int usmblks;
int fsmblks;
int uordblks;
int fordblks;
int keepcost;
};
struct mallinfo2 {
size_t arena;
size_t ordblks;
size_t smblks;
size_t hblks;
size_t hblkhd;
size_t usmblks;
size_t fsmblks;
size_t uordblks;
size_t fordblks;
#define __MALLINFO_BODY \
size_t arena; \
size_t ordblks; \
size_t smblks; \
size_t hblks; \
size_t hblkhd; \
size_t usmblks; \
size_t fsmblks; \
size_t uordblks; \
size_t fordblks; \
size_t keepcost;
};
struct mallinfo { __MALLINFO_BODY };
struct mallinfo2 { __MALLINFO_BODY };
#ifdef __cplusplus
}
......
......@@ -22,33 +22,23 @@ void *memalign(size_t, size_t);
size_t malloc_usable_size(void *);
struct mallinfo {
int arena;
int ordblks;
int smblks;
int hblks;
int hblkhd;
int usmblks;
int fsmblks;
int uordblks;
int fordblks;
int keepcost;
};
#define __MALLINFO_BODY \
size_t arena; \
size_t ordblks; \
size_t smblks; \
size_t hblks; \
size_t hblkhd; \
size_t usmblks; \
size_t fsmblks; \
size_t uordblks; \
size_t fordblks; \
size_t keepcost;
struct mallinfo { __MALLINFO_BODY };
struct mallinfo mallinfo(void);
struct mallinfo2 {
size_t arena;
size_t ordblks;
size_t smblks;
size_t hblks;
size_t hblkhd;
size_t usmblks;
size_t fsmblks;
size_t uordblks;
size_t fordblks;
size_t keepcost;
};
struct mallinfo2 { __MALLINFO_BODY };
struct mallinfo2 mallinfo2(void);
......
......@@ -15,7 +15,7 @@ typedef struct occupied_bin_s {
struct chunk *head, *tail;
volatile int lock[2];
} occupied_bin_t;
struct chunk {
size_t psize, csize;
#ifdef MALLOC_RED_ZONE
......@@ -23,7 +23,7 @@ struct chunk {
size_t state;
#endif
#ifdef MUSL_ITERATE_AND_STATS_API
pthread_t thread_id;
size_t thread_id;
struct chunk *next_occupied, *prev_occupied;
#endif
struct chunk *next, *prev;
......@@ -57,7 +57,7 @@ hidden size_t __get_total_heap_space(void);
#ifdef MUSL_ITERATE_AND_STATS_API
#define OCCUPIED_BIN_COUNT 64
#define OCCUPIED_LIST_OVERHEAD (2*sizeof(void*))
#define ITERATE_AND_STATS_OVERHEAD (sizeof(void*) + OCCUPIED_LIST_OVERHEAD)
#define ITERATE_AND_STATS_OVERHEAD (sizeof(size_t) + OCCUPIED_LIST_OVERHEAD)
#else
#define ITERATE_AND_STATS_OVERHEAD (0)
#endif
......
......@@ -43,8 +43,6 @@ int __malloc_replaced;
#ifdef MUSL_ITERATE_AND_STATS_API
occupied_bin_t detached_occupied_bin;
/* Usable memory only, excluding overhead for chunks */
size_t total_heap_space = 0;
volatile int total_heap_space_inc_lock[2];
......@@ -65,7 +63,7 @@ occupied_bin_t *__get_occupied_bin_by_idx(size_t bin_index)
return &mal.occupied_bins[bin_index];
}
static inline size_t get_occupied_bin_index(pthread_t thread_id)
static inline size_t get_occupied_bin_index(int thread_id)
{
return (size_t) ((size_t)thread_id % OCCUPIED_BIN_COUNT);
}
......@@ -73,12 +71,12 @@ static inline size_t get_occupied_bin_index(pthread_t thread_id)
occupied_bin_t *__get_occupied_bin(struct chunk *c)
{
size_t bin_index = get_occupied_bin_index(c->thread_id);
return &mal.occupied_bins[bin_index];
return __get_occupied_bin_by_idx(bin_index);
}
occupied_bin_t *__get_current_occupied_bin()
{
size_t bin_index = get_occupied_bin_index(__pthread_self());
size_t bin_index = get_occupied_bin_index(__pthread_self()->tid);
return &mal.occupied_bins[bin_index];
}
#endif
......@@ -125,7 +123,7 @@ void __push_chunk(struct chunk *c)
occupied_bin->tail = c;
}
occupied_bin->head = c;
c->thread_id = __pthread_self();
c->thread_id = __pthread_self()->tid;
unlock(occupied_bin->lock);
}
......@@ -164,8 +162,6 @@ void malloc_disable(void)
for (size_t i = 0; i < BINS_COUNT; ++i) {
lock(mal.bins[i].lock);
}
// FIXME???
// __tl_lock();
for (size_t i = 0; i < OCCUPIED_BIN_COUNT; ++i) {
lock(mal.occupied_bins[i].lock);
}
......@@ -175,11 +171,12 @@ void malloc_disable(void)
void malloc_enable(void)
{
#ifdef MUSL_ITERATE_AND_STATS_API
// FIXME???
// __tl_unlock();
for (size_t i = 0; i < OCCUPIED_BIN_COUNT; ++i) {
unlock(mal.occupied_bins[i].lock);
}
for (size_t i = 0; i < BINS_COUNT; ++i) {
unlock(mal.bins[i].lock);
}
unlock(total_heap_space_inc_lock);
unlock(mal.free_lock);
#endif
......
......@@ -44,7 +44,11 @@ static void stat_printf(write_cb_fun *write_cb, void *write_cb_arg, const char *
va_start(args, fmt);
char buf[STAT_PRINTF_MAX_LEN + 1];
if (vsnprintf(buf, STAT_PRINTF_MAX_LEN, fmt, args)) {
write_cb(write_cb_arg, buf);
if (write_cb != NULL) {
write_cb(write_cb_arg, buf);
} else {
printf(buf);
}
} else {
fprintf(stderr, "Error writing to buffer");
}
......@@ -109,20 +113,51 @@ static malloc_stats_t add_up_chunks(occupied_bin_t *occupied_bin)
return stats;
}
static malloc_stats_t add_up_chunks_by_threads(occupied_bin_t *occupied_bin, int tid)
{
malloc_stats_t stats = {0, 0, 0, 0};
for (struct chunk *c = occupied_bin->head; c != NULL; c = c->next_occupied) {
if (c->thread_id == tid) {
size_t chunk_memory = CHUNK_SIZE(c) - OVERHEAD;
stats.total_allocated_memory += chunk_memory;
if (IS_MMAPPED(c)) {
stats.mmapped_regions++;
stats.total_mmapped_memory += chunk_memory;
} else {
stats.total_allocated_heap_space += chunk_memory;
}
}
}
return stats;
}
static size_t print_threads(write_cb_fun *write_cb, void *write_cb_arg, print_mode mode)
{
size_t total_allocated_heap_space = 0;
for (size_t i = 0; i < OCCUPIED_BIN_COUNT; ++i) {
occupied_bin_t *occupied_bin = __get_occupied_bin_by_idx(i);
malloc_stats_t stats = add_up_chunks(occupied_bin);
total_allocated_heap_space += stats.total_allocated_heap_space;
//FIXME: Egor, this is incorrect
if (mode == TABLE) {
print_thread_stats_table(write_cb, write_cb_arg, 0, &stats);
} else {
print_thread_stats_xml(write_cb, write_cb_arg, 0, &stats);
}
int min_id = 0;
int found;
do {
found = 0;
for (struct chunk *c = occupied_bin->head; c != NULL; c = c->next_occupied) {
if (c->thread_id > min_id) {
min_id = c->thread_id;
found = 1;
}
}
if (found) {
malloc_stats_t stats = add_up_chunks_by_threads(occupied_bin, min_id);
total_allocated_heap_space += stats.total_allocated_heap_space;
if (mode == TABLE) {
print_thread_stats_table(write_cb, write_cb_arg, min_id, &stats);
} else {
print_thread_stats_xml(write_cb, write_cb_arg, min_id, &stats);
}
}
} while (found);
}
return total_allocated_heap_space;
......@@ -220,14 +255,10 @@ struct mallinfo2 mallinfo2(void)
#ifdef MUSL_ITERATE_AND_STATS_API
malloc_disable();
malloc_stats_t shared_stats = {0, 0, 0, 0};
struct __pthread *self, *it;
self = it = __pthread_self();
//FIXME:
// do {
// malloc_stats_t stats = add_up_chunks(__get_occupied_bin(it));
// add_stats(&shared_stats, &stats);
// it = it->next;
// } while (it != self);
for (size_t i = 0; i < OCCUPIED_BIN_COUNT; ++i) {
malloc_stats_t stats = add_up_chunks(__get_occupied_bin_by_idx(i));
add_stats(&shared_stats, &stats);
}
struct mallinfo2 res = {
.hblks = shared_stats.mmapped_regions,
......@@ -245,9 +276,9 @@ struct mallinfo mallinfo(void)
{
struct mallinfo2 mallinfo2_res = mallinfo2();
return (struct mallinfo) {
.hblks = (int) mallinfo2_res.hblks,
.hblkhd = (int) mallinfo2_res.hblkhd,
.uordblks = (int) mallinfo2_res.uordblks,
.fordblks = (int) mallinfo2_res.fordblks,
.hblks = mallinfo2_res.hblks,
.hblkhd = mallinfo2_res.hblkhd,
.uordblks = mallinfo2_res.uordblks,
.fordblks = mallinfo2_res.fordblks,
};
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册