static ssize_t chm_imp_configure_r(mphf_t *mphf, uintmax_t capacity){ // {{{ uintmax_t nvertex; chm_imp_t *data = (chm_imp_t *)&mphf->data; if(capacity == 0) capacity = 1; // at least one element // nvertex = (2.09 * capacity) if(safe_mul(&nvertex, capacity, CHM_CONST) < 0){ safe_div(&nvertex, capacity, 100); if(safe_mul(&nvertex, nvertex, CHM_CONST) < 0) return error("too many elements"); } safe_div(&nvertex, nvertex, 100); data->nvertex = nvertex; data->params.capacity = capacity; data->bt_vertex = BITS_TO_BYTES( log_any(nvertex, 2) ); return 0; } // }}}
static int error(lua_State *L) { return log_any(L, NSCAPI::log_level::error); }
static int info(lua_State *L) { return log_any(L, NSCAPI::log_level::info); }
/* size-tree {{ */ static int tree_reinit(tree_t *tree){ // {{{ unsigned int i; size_t ls; unsigned int nlevels; size_t table_size; size_t *table; size_t *lss; off_t *tof; buffer_t req_buffer; buffer_init_from_bare(&req_buffer, &tree->blocks_count, sizeof(tree->blocks_count)); hash_t req_count[] = { { HK(action), DATA_UINT32T(ACTION_COUNT) }, { HK(buffer), DATA_BUFFERT(&req_buffer) }, hash_end }; if(chain_next_query(tree->chain, req_count) <= 0){ buffer_destroy(&req_buffer); return -1; } buffer_destroy(&req_buffer); tree->blocks_count /= sizeof(block_info); nlevels = log_any(tree->blocks_count, tree->elements_per_level) + 1; if(nlevels == tree->nlevels) return 0; // TODO lock /* remove old data */ if(tree->lss != NULL) free(tree->lss); if(tree->tof != NULL) free(tree->tof); if(tree->table != NULL) free(tree->table); if( (lss = malloc(sizeof(size_t) * nlevels)) == NULL) goto free; if( (tof = malloc(sizeof(off_t) * nlevels)) == NULL) goto free1; table_size = 0; ls = 1; tof[0] = 0; for(i=1; i <= nlevels; i++){ if(i != nlevels) tof[i] = tof[i - 1] + ls; table_size += ls; ls *= tree->elements_per_level; lss[nlevels - i] = ls; } table_size *= sizeof(size_t); //printf("tree_reinit: nelements: %x, nlevels: %x, table_size %d\n", (unsigned int)tree->blocks_count, nlevels, (unsigned int)table_size); if( (table = malloc(table_size)) == NULL ) goto free2; tree->table = table; tree->nlevels = nlevels; tree->lss = lss; // LevelSizeSizes tree->tof = tof; // TableOFfsets // TODO unlock return 0; free2: free(tof); free1: free(lss); free: // TODO unlock return -1; } // }}}