#include "buffer_manage.h" #include "buffer_entry.h" #include #include #include struct __buffer_manage_t { cmph_uint32 memory_avail; // memory available buffer_entry_t ** buffer_entries; // buffer entries to be managed cmph_uint32 nentries; // number of entries to be managed cmph_uint32 *memory_avail_list; // memory available list int pos_avail_list; // current position in memory available list }; buffer_manage_t * buffer_manage_new(cmph_uint32 memory_avail, cmph_uint32 nentries) { cmph_uint32 memory_avail_entry, i; buffer_manage_t *buff_manage = (buffer_manage_t *)malloc(sizeof(buffer_manage_t)); assert(buff_manage); buff_manage->memory_avail = memory_avail; buff_manage->buffer_entries = (buffer_entry_t **)calloc((size_t)nentries, sizeof(buffer_entry_t *)); buff_manage->memory_avail_list = (cmph_uint32 *)calloc((size_t)nentries, sizeof(cmph_uint32)); buff_manage->pos_avail_list = -1; buff_manage->nentries = nentries; memory_avail_entry = buff_manage->memory_avail/buff_manage->nentries + 1; for(i = 0; i < buff_manage->nentries; i++) { buff_manage->buffer_entries[i] = buffer_entry_new(memory_avail_entry); } return buff_manage; } void buffer_manage_open(buffer_manage_t * buffer_manage, cmph_uint32 index, char * filename) { buffer_entry_open(buffer_manage->buffer_entries[index], filename); } cmph_uint8 * buffer_manage_read_key(buffer_manage_t * buffer_manage, cmph_uint32 index) { cmph_uint8 * key = NULL; if (buffer_manage->pos_avail_list >= 0 ) // recovering memory { cmph_uint32 new_capacity = buffer_entry_get_capacity(buffer_manage->buffer_entries[index]) + buffer_manage->memory_avail_list[(buffer_manage->pos_avail_list)--]; buffer_entry_set_capacity(buffer_manage->buffer_entries[index], new_capacity); //fprintf(stderr, "recovering memory\n"); } key = buffer_entry_read_key(buffer_manage->buffer_entries[index]); if (key == NULL) // storing memory to be recovered { buffer_manage->memory_avail_list[++(buffer_manage->pos_avail_list)] = buffer_entry_get_capacity(buffer_manage->buffer_entries[index]); //fprintf(stderr, "storing memory to be recovered\n"); } return key; } void buffer_manage_destroy(buffer_manage_t * buffer_manage) { cmph_uint32 i; for(i = 0; i < buffer_manage->nentries; i++) { buffer_entry_destroy(buffer_manage->buffer_entries[i]); } free(buffer_manage->memory_avail_list); free(buffer_manage->buffer_entries); free(buffer_manage); }