diff options
| author | chenzizhan <[email protected]> | 2024-07-02 15:53:22 +0800 |
|---|---|---|
| committer | chenzizhan <[email protected]> | 2024-07-02 15:53:22 +0800 |
| commit | b6435b478b6162b0a0d394c08d1c31704266fb47 (patch) | |
| tree | a1326c53e1ee262304987b2168c8cc3b7233c1c1 | |
| parent | d59c49638d324597b78793edc2169c151bb943a4 (diff) | |
new list api
| -rw-r--r-- | src/fieldstat.c | 8 | ||||
| -rw-r--r-- | src/tags/heavy_keeper.c | 30 | ||||
| -rw-r--r-- | src/tags/heavy_keeper.h | 4 | ||||
| -rw-r--r-- | src/tags/tag_map.c | 18 | ||||
| -rw-r--r-- | src/tags/tag_map.h | 2 |
5 files changed, 35 insertions, 27 deletions
diff --git a/src/fieldstat.c b/src/fieldstat.c index e5cf868..0b84501 100644 --- a/src/fieldstat.c +++ b/src/fieldstat.c @@ -1397,10 +1397,14 @@ void fieldstat_get_cells_used_by_cube(const struct fieldstat *instance, int cube size_t n_cell_tmp = 0; switch (cube->sampling_mode) { case SAMPLING_MODE_COMPREHENSIVE: - tag_map_list(cube->cells.comprehensive, (void ***)&cell_datas, &n_cell_tmp); + n_cell_tmp = tag_map_get_count(cube->cells.comprehensive); + cell_datas = (struct cell **)malloc(sizeof(struct cell *) * n_cell_tmp); + tag_map_list(cube->cells.comprehensive, (void **)cell_datas, n_cell_tmp); break; case SAMPLING_MODE_TOPK: - heavy_keeper_list(cube->cells.topk, (void ***)&cell_datas, &n_cell_tmp); + n_cell_tmp = heavy_keeper_get_count(cube->cells.topk); + cell_datas = (struct cell **)malloc(sizeof(struct cell *) * n_cell_tmp); + heavy_keeper_list(cube->cells.topk, (void **)cell_datas, n_cell_tmp); break; default: assert(0); diff --git a/src/tags/heavy_keeper.c b/src/tags/heavy_keeper.c index 1fd09b8..03cf7f5 100644 --- a/src/tags/heavy_keeper.c +++ b/src/tags/heavy_keeper.c @@ -346,8 +346,7 @@ int sorted_set_insert(struct sorted_set *ss, const char *key, size_t key_len, un if (tmp_mincnt != INVALID_COUNT && cnt <= tmp_mincnt) { // even if all cells in sorted set are dying, the sorted set can still be a full one, in which case, the min count is invalid. return 0; } - int ret = sorted_set_pop(ss); - assert(ret != -1); + sorted_set_pop(ss); } sorted_set_insert_to_available_heap(ss, key, key_len, cnt, ss->new_fn(args)); return 1; @@ -679,22 +678,27 @@ int heavy_keeper_get_count(const struct heavy_keeper *hk) { return sorted_set_cardinality(hk->top_K_heap); } -void heavy_keeper_list(const struct heavy_keeper *hk, void ***exdatas, size_t *n_exdatas) { - *n_exdatas = sorted_set_cardinality(hk->top_K_heap); - if (*n_exdatas == 0) { - *exdatas = NULL; - return; +size_t heavy_keeper_list(const struct heavy_keeper *hk, void **exdatas, size_t n_exdatas) { + size_t actual_len = sorted_set_cardinality(hk->top_K_heap); + if (actual_len == 0) { + return 0; } - void **exdatas_ret = (void **)malloc(sizeof(void *) * (*n_exdatas)); - *exdatas = exdatas_ret; - - char **keys_dummy = (char **)malloc(sizeof(char *) * (*n_exdatas)); - size_t *key_lens_dummy = (size_t *)malloc(sizeof(size_t) * (*n_exdatas)); - sorted_set_dump(hk->top_K_heap, keys_dummy, key_lens_dummy, exdatas_ret); + char **keys_dummy = (char **)malloc(sizeof(char *) * actual_len); + size_t *key_lens_dummy = (size_t *)malloc(sizeof(size_t) * actual_len); + if (n_exdatas < actual_len) { + void **exdatas_ret = (void **)malloc(sizeof(void *) * actual_len); + sorted_set_dump(hk->top_K_heap, keys_dummy, key_lens_dummy, exdatas_ret); + memcpy(exdatas, exdatas_ret, sizeof(void *) * n_exdatas); + free(exdatas_ret); + } else { + sorted_set_dump(hk->top_K_heap, keys_dummy, key_lens_dummy, exdatas); + } free(keys_dummy); free(key_lens_dummy); + + return actual_len < n_exdatas ? actual_len : n_exdatas; } static void heavy_keeper_merge_sketch(struct heavy_keeper *dest, const struct heavy_keeper *src) { diff --git a/src/tags/heavy_keeper.h b/src/tags/heavy_keeper.h index 6660c97..0ed2709 100644 --- a/src/tags/heavy_keeper.h +++ b/src/tags/heavy_keeper.h @@ -33,8 +33,8 @@ void *heavy_keeper_get0_exdata(const struct heavy_keeper *hk, const char *key, s // get the number of cells in the heavy keeper int heavy_keeper_get_count(const struct heavy_keeper *hk); -// size_t heavy_keeper_list(const struct heavy_keeper *hk, void **exdatas, size_t n_exdatas); //use list: void **exdatas, heavy_keeper_list(&exdatas); void *exdata = exdatas[i]; // TODO: 用户申请exdata 数组 -void heavy_keeper_list(const struct heavy_keeper *hk, void ***exdatas, size_t *n_exdatas); +size_t heavy_keeper_list(const struct heavy_keeper *hk, void **exdatas, size_t n_exdatas); +// void heavy_keeper_list(const struct heavy_keeper *hk, void ***exdatas, size_t *n_exdatas); void heavy_keeper_merge(struct heavy_keeper *dest, const struct heavy_keeper *src); diff --git a/src/tags/tag_map.c b/src/tags/tag_map.c index 55a70a4..0c655fa 100644 --- a/src/tags/tag_map.c +++ b/src/tags/tag_map.c @@ -148,25 +148,25 @@ int tag_map_get_count(const struct tag_map *pthis) { return pthis->current_cell_num; } -void tag_map_list(const struct tag_map *pthis, void ***exdatas, size_t *n_exdatas) { - *n_exdatas = pthis->current_cell_num; - if (*n_exdatas == 0) { - *exdatas = NULL; - return; +size_t tag_map_list(const struct tag_map *pthis, void **exdatas, size_t n_exdatas) { + size_t actual_len = pthis->current_cell_num; + if (actual_len == 0) { + return 0; } - void **exdatas_ret = calloc(*n_exdatas, sizeof(void *)); - *exdatas = exdatas_ret; - struct tag_exdata_item *item, *tmp; size_t i = 0; HASH_ITER(hh, pthis->tag_id_map, item, tmp) { if (item->dying) { continue; } - exdatas_ret[i] = item->exdata; + if (i >= n_exdatas) { + break; + } + exdatas[i] = item->exdata; i++; } + return actual_len < n_exdatas ? actual_len : n_exdatas; } int tag_map_merge(struct tag_map *dest, struct tag_map *src) { diff --git a/src/tags/tag_map.h b/src/tags/tag_map.h index 2d8f44c..21c2716 100644 --- a/src/tags/tag_map.h +++ b/src/tags/tag_map.h @@ -24,7 +24,7 @@ int tag_map_add(struct tag_map *pthis, const char *key, size_t key_len, void *ar // void *tag_map_get0_exdata(struct tag_map *pthis, const char *key, size_t key_len); void *tag_map_get0_exdata(struct tag_map *pthis, const char *key, size_t key_len); int tag_map_get_count(const struct tag_map *pthis); -void tag_map_list(const struct tag_map *pthis, void ***exdatas, size_t *n_exdatas); +size_t tag_map_list(const struct tag_map *pthis, void **exdatas, size_t n_exdatas); #ifdef __cplusplus } |
