Skip to content

Commit c3b7c13

Browse files
committed
Use takeset to make table collection loading zero copy
1 parent 2b73715 commit c3b7c13

File tree

2 files changed

+171
-84
lines changed

2 files changed

+171
-84
lines changed

c/subprojects/kastore/kastore.c

+39-30
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ kas_strerror(int err)
3434
ret = "Bad open mode; must be \"r\", \"w\", or \"a\"";
3535
break;
3636
case KAS_ERR_BAD_FLAGS:
37-
ret = "Unknown flags specified. Only (KAS_GET_TAKES_OWNERSHIP, "
38-
"KAS_READ_ALL or ) or 0 can be specified "
37+
ret = "Unknown flags specified. Only (KAS_GET_TAKES_OWNERSHIP and/or"
38+
"KAS_READ_ALL) or 0 can be specified "
3939
"for open, and KAS_BORROWS_ARRAY or 0 for put";
4040
break;
4141
case KAS_ERR_NO_MEMORY:
@@ -683,14 +683,39 @@ kastore_close(kastore_t *self)
683683
return ret;
684684
}
685685

686+
static int
687+
kastore_find_item(kastore_t *self, const char *key, size_t key_len, kaitem_t **item)
688+
{
689+
int ret = KAS_ERR_KEY_NOT_FOUND;
690+
kaitem_t search;
691+
search.key = (char *) malloc(key_len);
692+
search.key_len = key_len;
693+
694+
if (self->mode != KAS_READ) {
695+
ret = KAS_ERR_ILLEGAL_OPERATION;
696+
goto out;
697+
}
698+
if (search.key == NULL) {
699+
ret = KAS_ERR_NO_MEMORY;
700+
goto out;
701+
}
702+
memcpy(search.key, key, key_len);
703+
*item = bsearch(
704+
&search, self->items, self->num_items, sizeof(kaitem_t), compare_items);
705+
if (*item == NULL) {
706+
goto out;
707+
}
708+
ret = 0;
709+
out:
710+
kas_safe_free(search.key);
711+
return ret;
712+
}
713+
686714
int KAS_WARN_UNUSED
687715
kastore_contains(kastore_t *self, const char *key, size_t key_len)
688716
{
689-
void *array;
690-
size_t array_len;
691-
int type;
692-
int ret = kastore_get(self, key, key_len, &array, &array_len, &type);
693-
717+
kaitem_t *item;
718+
int ret = kastore_find_item(self, key, key_len, &item);
694719
if (ret == 0) {
695720
ret = 1;
696721
} else if (ret == KAS_ERR_KEY_NOT_FOUND) {
@@ -709,24 +734,9 @@ int KAS_WARN_UNUSED
709734
kastore_get(kastore_t *self, const char *key, size_t key_len, void **array,
710735
size_t *array_len, int *type)
711736
{
712-
int ret = KAS_ERR_KEY_NOT_FOUND;
713-
kaitem_t search;
714737
kaitem_t *item;
715-
search.key = (char *) malloc(key_len);
716-
search.key_len = key_len;
717-
718-
if (self->mode != KAS_READ) {
719-
ret = KAS_ERR_ILLEGAL_OPERATION;
720-
goto out;
721-
}
722-
if (search.key == NULL) {
723-
ret = KAS_ERR_NO_MEMORY;
724-
goto out;
725-
}
726-
memcpy(search.key, key, key_len);
727-
item = bsearch(
728-
&search, self->items, self->num_items, sizeof(kaitem_t), compare_items);
729-
if (item == NULL) {
738+
int ret = kastore_find_item(self, key, key_len, &item);
739+
if (ret != 0) {
730740
goto out;
731741
}
732742
if (item->array == NULL) {
@@ -743,7 +753,6 @@ kastore_get(kastore_t *self, const char *key, size_t key_len, void **array,
743753
}
744754
ret = 0;
745755
out:
746-
kas_safe_free(search.key);
747756
return ret;
748757
}
749758

@@ -908,13 +917,13 @@ kastore_bput(kastore_t *self, const char *key, size_t key_len, const void *array
908917
if (ret != 0) {
909918
goto out;
910919
}
911-
/* TEMP FIX UNTIL NEXT KASTORE RELEASE WITH
912-
* https://github.com/tskit-dev/kastore/pull/185 */
913920
if (array == NULL) {
921+
/* Both can't be null, so assign a dummy array */
914922
item->array = malloc(1);
915923
} else {
916924
item->borrowed_array = array;
917925
}
926+
item->borrowed_array = array;
918927
item->array_len = array_len;
919928
out:
920929
return ret;
@@ -1154,10 +1163,10 @@ kastore_print_state(kastore_t *self, FILE *out)
11541163
item = self->items + j;
11551164
fprintf(out,
11561165
"%.*s: type=%d, key_start=%zu, key_len=%zu, key=%p, "
1157-
"array_start=%zu, array_len=%zu, array=%p, borrowed_array=%p\n",
1166+
"array_start=%zu, array_len=%zu, array=%p\n",
11581167
(int) item->key_len, item->key, item->type, item->key_start, item->key_len,
1159-
(void *) item->key, item->array_start, item->array_len, (void *) item->array,
1160-
(void *) item->borrowed_array);
1168+
(void *) item->key, item->array_start, item->array_len,
1169+
(void *) item->array);
11611170
}
11621171
fprintf(out, "============================\n");
11631172
}

0 commit comments

Comments
 (0)