Some cleanups

This commit is contained in:
Dale Weiler 2013-06-02 08:37:22 +00:00
parent 564cac859a
commit ee42d2a570
2 changed files with 39 additions and 50 deletions

17
gmqcc.h
View file

@ -291,29 +291,12 @@ GMQCC_IND_STRING(GMQCC_VERSION_PATCH) \
/*===================================================================*/
/*=========================== stat.c ================================*/
/*===================================================================*/
typedef struct {
size_t key;
size_t value;
} stat_size_entry_t, **stat_size_table_t;
void stat_info();
char *stat_mem_strdup (const char *, size_t, const char *, bool);
void *stat_mem_reallocate(void *, size_t, size_t, const char *);
void stat_mem_deallocate(void *);
void *stat_mem_allocate (size_t, size_t, const char *);
stat_size_table_t stat_size_new();
stat_size_entry_t *stat_size_get(stat_size_table_t, size_t);
void stat_size_del(stat_size_table_t);
void stat_size_put(stat_size_table_t, size_t, size_t);
/* getters for hashtable: */
stat_size_table_t *stat_size_hashtables_get();
uint64_t *stat_type_hashtables_get();
uint64_t *stat_used_hashtables_get();
stat_size_table_t *stat_hashtables_init();
#define mem_a(SIZE) stat_mem_allocate ((SIZE), __LINE__, __FILE__)
#define mem_d(PTRN) stat_mem_deallocate((void*)(PTRN))
#define mem_r(PTRN, SIZE) stat_mem_reallocate((void*)(PTRN), (SIZE), __LINE__, __FILE__)

72
stat.c
View file

@ -17,6 +17,11 @@ typedef struct stat_mem_block_s {
struct stat_mem_block_s *prev;
} stat_mem_block_t;
typedef struct {
size_t key;
size_t value;
} stat_size_entry_t, **stat_size_table_t;
static uint64_t stat_mem_allocated = 0;
static uint64_t stat_mem_deallocated = 0;
static uint64_t stat_mem_allocated_total = 0;
@ -32,6 +37,40 @@ static stat_size_table_t stat_size_vectors = NULL;
static stat_size_table_t stat_size_hashtables = NULL;
static stat_mem_block_t *stat_mem_block_root = NULL;
/*
* A tiny size_t key-value hashtbale for tracking vector and hashtable
* sizes. We can use it for other things too, if we need to. This is
* very TIGHT, and efficent in terms of space though.
*/
static stat_size_table_t stat_size_new() {
return (stat_size_table_t)memset(
mem_a(sizeof(stat_size_entry_t*) * ST_SIZE),
0, ST_SIZE * sizeof(stat_size_entry_t*)
);
}
static void stat_size_del(stat_size_table_t table) {
size_t i = 0;
for (; i < ST_SIZE; i++) if(table[i]) mem_d(table[i]);
mem_d(table);
}
static stat_size_entry_t *stat_size_get(stat_size_table_t table, size_t key) {
size_t hash = (key % ST_SIZE);
while (table[hash] && table[hash]->key != key)
hash = (hash + 1) % ST_SIZE;
return table[hash];
}
static void stat_size_put(stat_size_table_t table, size_t key, size_t value) {
size_t hash = (key % ST_SIZE);
while (table[hash] && table[hash]->key != key)
hash = (hash + 1) % ST_SIZE;
table[hash] = (stat_size_entry_t*)mem_a(sizeof(stat_size_entry_t));
table[hash]->key = key;
table[hash]->value = value;
}
/*
* A basic header of information wrapper allocator. Simply stores
* information as a header, returns the memory + 1 past it, can be
@ -431,39 +470,6 @@ void util_htdel(hash_table_t *ht) {
util_htrem(ht, NULL);
}
/*
* A tiny size_t key-value hashtbale for tracking vector and hashtable
* sizes. We can use it for other things too, if we need to. This is
* very TIGHT, and efficent in terms of space though.
*/
stat_size_table_t stat_size_new() {
return (stat_size_table_t)memset(
mem_a(sizeof(stat_size_entry_t*) * ST_SIZE),
0, ST_SIZE * sizeof(stat_size_entry_t*)
);
}
void stat_size_del(stat_size_table_t table) {
size_t i = 0;
for (; i < ST_SIZE; i++) if(table[i]) mem_d(table[i]);
mem_d(table);
}
stat_size_entry_t *stat_size_get(stat_size_table_t table, size_t key) {
size_t hash = (key % ST_SIZE);
while (table[hash] && table[hash]->key != key)
hash = (hash + 1) % ST_SIZE;
return table[hash];
}
void stat_size_put(stat_size_table_t table, size_t key, size_t value) {
size_t hash = (key % ST_SIZE);
while (table[hash] && table[hash]->key != key)
hash = (hash + 1) % ST_SIZE;
table[hash] = (stat_size_entry_t*)mem_a(sizeof(stat_size_entry_t));
table[hash]->key = key;
table[hash]->value = value;
}
/*
* The following functions below implement printing / dumping of statistical
* information.