From: Ezekiel Newren <ezekielnewren@xxxxxxxxx> xdfile_t currently uses a chastore which functions as a memory pool and a vector which maps to the alocations created by the chastore. It seems like xrecord_t used to be a linked list until the recs and nrec fields were added. I think that xrecord_t.next was meant to be removed, but was overlooked. This dual data structure setup make the code somewhat confusing. Additionally the C type chastore_t isn't FFI friendly. While it could be implemented in Rust, since the data structure is confusing anyway, replace it with an ivec whose purpose is to be interoperable. This makes the fields nrec and recs in xdfile_t redundant, which will be removed in the next 2 commits. Signed-off-by: Ezekiel Newren <ezekielnewren@xxxxxxxxx> --- xdiff/xprepare.c | 34 +++++++++++++++++----------------- xdiff/xtypes.h | 6 ++++-- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/xdiff/xprepare.c b/xdiff/xprepare.c index 55e1cc308756..3b33186c15a3 100644 --- a/xdiff/xprepare.c +++ b/xdiff/xprepare.c @@ -130,11 +130,11 @@ static int xdl_classify_record(unsigned int pass, xdlclassifier_t *cf, xrecord_t static void xdl_free_ctx(xdfile_t *xdf) { + ivec_free(&xdf->record); xdl_free(xdf->rindex); xdl_free(xdf->rchg - 1); xdl_free(xdf->ha); xdl_free(xdf->recs); - xdl_cha_free(&xdf->rcha); } @@ -143,35 +143,35 @@ static int xdl_prepare_ctx(unsigned int pass, mmfile_t *mf, long narec, xpparam_ long bsize; unsigned long hav; char const *blk, *cur, *top, *prev; - xrecord_t *crec; xdf->ha = NULL; xdf->rindex = NULL; xdf->rchg = NULL; xdf->recs = NULL; xdf->nrec = 0; - - if (xdl_cha_init(&xdf->rcha, sizeof(xrecord_t), narec / 4 + 1) < 0) - goto abort; - if (!XDL_ALLOC_ARRAY(xdf->recs, narec)) - goto abort; + IVEC_INIT(xdf->record); if ((cur = blk = xdl_mmfile_first(mf, &bsize))) { for (top = blk + bsize; cur < top; ) { + xrecord_t crec; prev = cur; hav = xdl_hash_record(&cur, top, xpp->flags); - if (XDL_ALLOC_GROW(xdf->recs, xdf->nrec + 1, narec)) - goto abort; - if (!(crec = xdl_cha_alloc(&xdf->rcha))) - goto abort; - crec->ptr = (u8 const*) prev; - crec->size = (long) (cur - prev); - crec->ha = hav; - xdf->recs[xdf->nrec++] = crec; - if (xdl_classify_record(pass, cf, crec) < 0) - goto abort; + crec.ptr = (u8 const*) prev; + crec.size = cur - prev; + crec.ha = hav; + ivec_push(&xdf->record, &crec); } } + ivec_shrink_to_fit(&xdf->record); + + xdf->nrec = (long) xdf->record.length; + if (!XDL_ALLOC_ARRAY(xdf->recs, xdf->record.length)) + goto abort; + for (usize i = 0; i < xdf->record.length; i++) { + if (xdl_classify_record(pass, cf, &xdf->record.ptr[i]) < 0) + goto abort; + xdf->recs[i] = &xdf->record.ptr[i]; + } if (!XDL_CALLOC_ARRAY(xdf->rchg, xdf->nrec + 2)) goto abort; diff --git a/xdiff/xtypes.h b/xdiff/xtypes.h index 6e5f67ebf380..5028a70b2675 100644 --- a/xdiff/xtypes.h +++ b/xdiff/xtypes.h @@ -23,7 +23,7 @@ #if !defined(XTYPES_H) #define XTYPES_H - +#include "../interop/ivec.h" typedef struct s_chanode { struct s_chanode *next; @@ -44,8 +44,10 @@ typedef struct s_xrecord { u64 ha; } xrecord_t; +DEFINE_IVEC_TYPE(xrecord_t, xrecord); + typedef struct s_xdfile { - chastore_t rcha; + struct ivec_xrecord record; long nrec; long dstart, dend; xrecord_t **recs; -- gitgitgadget