diff --git a/main.c b/main.c index db17328..ded53cc 100644 --- a/main.c +++ b/main.c @@ -7,7 +7,7 @@ #include "mmpriv.h" #include "ketopt.h" -#define MM_VERSION "2.21-dev-r1084-dirty" +#define MM_VERSION "2.21-dev-r1087-dirty" #ifdef __linux__ #include @@ -73,6 +73,7 @@ static ko_longopt_t long_options[] = { { "mask-len", ko_required_argument, 346 }, { "rmq", ko_optional_argument, 347 }, { "qstrand", ko_no_argument, 348 }, + { "cap-kalloc", ko_required_argument, 349 }, { "help", ko_no_argument, 'h' }, { "max-intron-len", ko_required_argument, 'G' }, { "version", ko_no_argument, 'V' }, @@ -227,6 +228,7 @@ int main(int argc, char *argv[]) else if (c == 345) opt.alt_drop = atof(o.arg); // --alt-drop else if (c == 346) opt.mask_len = mm_parse_num(o.arg); // --mask-len else if (c == 348) opt.flag |= MM_F_QSTRAND | MM_F_NO_INV; // --qstrand + else if (c == 349) opt.cap_kalloc = mm_parse_num(o.arg); // --cap-kalloc else if (c == 330) { fprintf(stderr, "[WARNING] \033[1;31m --lj-min-ratio has been deprecated.\033[0m\n"); } else if (c == 314) { // --frag diff --git a/map.c b/map.c index c34475a..1999c10 100644 --- a/map.c +++ b/map.c @@ -362,7 +362,9 @@ void mm_map_frag(const mm_idx_t *mi, int n_segs, const int *qlens, const char ** if (mm_dbg_flag & MM_DBG_PRINT_QNAME) fprintf(stderr, "QM\t%s\t%d\tcap=%ld,nCore=%ld,largest=%ld\n", qname, qlen_sum, kmst.capacity, kmst.n_cores, kmst.largest); assert(kmst.n_blocks == kmst.n_cores); // otherwise, there is a memory leak - if (kmst.largest > 1U<<28) { + if (kmst.largest > 1U<<28 || (opt->cap_kalloc > 0 && kmst.capacity > opt->cap_kalloc)) { + if (mm_dbg_flag & MM_DBG_PRINT_QNAME) + fprintf(stderr, "[W::%s] reset thread-local memory after read %s\n", __func__, qname); km_destroy(b->km); b->km = km_init(); } diff --git a/minimap.h b/minimap.h index 0b200ad..a7a886b 100644 --- a/minimap.h +++ b/minimap.h @@ -168,6 +168,7 @@ typedef struct { int32_t max_occ, max_max_occ, occ_dist; int64_t mini_batch_size; // size of a batch of query bases to process in parallel int64_t max_sw_mat; + int64_t cap_kalloc; const char *split_prefix; } mm_mapopt_t;