void *dbfile_more_mem(mmfile_t *mm, uint32_t *size) { uint64_t chunksize; dbroot_t *root; int n, rc; void *ret = NULL; root = (dbroot_t*)mm->map[0].ptr; chunksize = root->meta.chunksize; mm_lock(mm, MLCK_WR, __offset(mm, &root->resize), sizeof(root->resize)); if (mm->size == mm_size(mm)) { log_debug("Resizing mmfile +%d bytes", chunksize); rc = mm_resize(mm, mm->size + chunksize); if (rc != 0) { log_error("Resize failed"); abort(); } n = mm->nmap-1; *size = mm->map_offset[n].size; ret = mm->map_offset[n].ptr; } else { chunksize = mm_size(mm); log_debug("Expanding mapping to 0x%x bytes", chunksize); mm_resize(mm, chunksize); } mm_lock(mm, MLCK_UN, __offset(mm, &root->resize), sizeof(root->resize)); return ret; }
/*********************************************************************** * Resize an array. Allocates the array if it is null. ***********************************************************************/ ARRAY_T* resize_array (ARRAY_T* array, const int num_items) { ARRAY_T* new_array; if (array == NULL) { new_array = allocate_array(num_items); } else { new_array = array; mm_resize(new_array->items, num_items, ATYPE); new_array->num_items = num_items; } return(new_array); }
/************************************************************************* * Keep track of any sites which have the best score seen *************************************************************************/ static void track_site(SEQ_SITES_T* seq_sites, double score, int start, char strand) { SEQ_SITE_T *site; // don't bother recording worse scores if (score < seq_sites->best) return; // better scores clear the list if (score > seq_sites->best) { seq_sites->used = 0; seq_sites->best = score; } // allocate memory on demand if (seq_sites->allocated <= seq_sites->used) { seq_sites->allocated += SCORE_BLOCK; mm_resize(seq_sites->sites, seq_sites->allocated, SEQ_SITE_T); } // store the site site = seq_sites->sites+(seq_sites->used++); site->start = start; site->strand = strand; }