r226: more careful about ma_hit_t_alloc memory

This commit is contained in:
Heng Li
2020-04-11 22:05:07 -04:00
parent e6b5b666a2
commit c4397a9400
6 changed files with 33 additions and 41 deletions

View File

@@ -250,7 +250,12 @@ inline void push_cigar(Compressed_Cigar_record* records, long long ID, Cigar_rec
void push_overlaps(ma_hit_t_alloc* paf, overlap_region_alloc* overlap_list, int flag, All_reads* R_INF, int if_reverse)
{
long long i = 0, xLen, yLen;
int32_t size = 0;
ma_hit_t tmp;
for (i = 0; i < (long long)overlap_list->length; ++i)
if (overlap_list->list[i].is_match == flag)
++size;
resize_ma_hit_t_alloc(paf, size);
clear_ma_hit_t_alloc(paf);
for (i = 0; i < (long long)overlap_list->length; i++)
{
@@ -278,7 +283,6 @@ void push_overlaps(ma_hit_t_alloc* paf, overlap_region_alloc* overlap_list, int
tmp.te = overlap_list->list[i].y_pos_e;
}
///for overlap_list, the x_strand of all overlaps are 0, so the tmp.rev is the same as the y_strand
tmp.rev = overlap_list->list[i].y_pos_strand;
@@ -322,7 +326,7 @@ long long push_final_overlaps(ma_hit_t_alloc* paf, ma_hit_t_alloc* reverse_paf_l
long long i = 0;
long long available_overlaps = 0;
ma_hit_t tmp;
clear_ma_hit_t_alloc(paf);
clear_ma_hit_t_alloc(paf); // paf has been preallocated, so we don't need preallocation
for (i = 0; i < (long long)overlap_list->length; i++)
{
if (overlap_list->list[i].is_match == flag)
@@ -374,7 +378,7 @@ long long push_final_overlaps(ma_hit_t_alloc* paf, ma_hit_t_alloc* reverse_paf_l
}
typedef struct {
int is_final;
int is_final, save_ov;
// chaining and overlapping related buffers
UC_Read self_read, ovlp_read;
Candidates_list clist;
@@ -390,11 +394,11 @@ typedef struct {
Round2_alignment round2;
} ha_ovec_buf_t;
ha_ovec_buf_t *ha_ovec_init(int is_final)
ha_ovec_buf_t *ha_ovec_init(int is_final, int save_ov)
{
ha_ovec_buf_t *b;
CALLOC(b, 1);
b->is_final = !!is_final;
b->is_final = !!is_final, b->save_ov = !!save_ov;
init_UC_Read(&b->self_read);
init_UC_Read(&b->ovlp_read);
init_Candidates_list(&b->clist);
@@ -493,8 +497,10 @@ static void worker_ovec(void *data, long i, int tid)
}
R_INF.paf[i].is_abnormal = abnormal;
push_overlaps(&(R_INF.paf[i]), &b->olist, 1, &R_INF, asm_opt.roundID%2);
push_overlaps(&(R_INF.reverse_paf[i]), &b->olist, 2, &R_INF, asm_opt.roundID%2);
if (b->save_ov) {
push_overlaps(&(R_INF.paf[i]), &b->olist, 1, &R_INF, 1);
push_overlaps(&(R_INF.reverse_paf[i]), &b->olist, 2, &R_INF, 1);
}
}
static void worker_ovec_related_reads(void *data, long i, int tid)
@@ -632,7 +638,7 @@ void ha_overlap_and_correct(int round)
// overlap and correct reads
CALLOC(b, asm_opt.thread_num);
for (i = 0; i < asm_opt.thread_num; ++i)
b[i] = ha_ovec_init(0);
b[i] = ha_ovec_init(0, (round == asm_opt.number_of_round - 1));
ha_idx = ha_pt_gen(&asm_opt, ha_flt_tab, round == 0? 0 : 1, &R_INF, &hom_cov); // build the index
if (round == 0 && ha_flt_tab == 0) // then asm_opt.hom_cov hasn't been updated
ha_opt_update_cov(&asm_opt, hom_cov);
@@ -1140,7 +1146,7 @@ void ha_overlap_final(void)
ha_ovec_buf_t **b;
CALLOC(b, asm_opt.thread_num);
for (i = 0; i < asm_opt.thread_num; ++i)
b[i] = ha_ovec_init(1);
b[i] = ha_ovec_init(1, 1);
ha_idx = ha_pt_gen(&asm_opt, ha_flt_tab, 1, &R_INF, &hom_cov); // build the index
kt_for(asm_opt.thread_num, worker_ov_final, b, R_INF.total_reads);
ha_pt_destroy(ha_idx);

View File

@@ -3,7 +3,7 @@
#include <pthread.h>
#define HA_VERSION "0.3.0-dirty-r224"
#define HA_VERSION "0.3.0-dirty-r226"
#define VERBOSE 0

View File

@@ -358,44 +358,31 @@ void clear_ma_hit_t_alloc(ma_hit_t_alloc* x)
x->length = 0;
}
void resize_ma_hit_t_alloc(ma_hit_t_alloc* x, uint64_t size)
void resize_ma_hit_t_alloc(ma_hit_t_alloc* x, uint32_t size)
{
if(size > x->size)
{
x->size = size;
x->buffer = (ma_hit_t*)realloc(x->buffer, x->size*sizeof(ma_hit_t));
}
if (size > x->size) {
x->size = size;
kroundup32(x->size);
REALLOC(x->buffer, x->size);
}
}
void destory_ma_hit_t_alloc(ma_hit_t_alloc* x)
{
free(x->buffer);
}
void destory_all_ma_hit_t_alloc(ma_hit_t_alloc* x, uint64_t n_read)
{
uint64_t i = 0;
for (i = 0; i < n_read; i++)
{
free(x[i].buffer);
}
free(x);
free(x->buffer);
}
void add_ma_hit_t_alloc(ma_hit_t_alloc* x, ma_hit_t* element)
{
if(x->length + 1 > x->size)
{
x->size = (x->length + 1) * 2;
x->buffer = (ma_hit_t*)realloc(x->buffer, x->size*sizeof(ma_hit_t));
}
x->buffer[x->length] = (*element);
x->length++;
if (x->length + 1 > x->size) {
x->size = x->length + 1;
kroundup32(x->size);
REALLOC(x->buffer, x->size);
}
x->buffer[x->length++] = *element;
}
long long get_specific_overlap(ma_hit_t_alloc* x, uint32_t qn, uint32_t tn)
{
long long i;

View File

@@ -68,8 +68,7 @@ typedef struct {
void init_ma_hit_t_alloc(ma_hit_t_alloc* x);
void clear_ma_hit_t_alloc(ma_hit_t_alloc* x);
void resize_ma_hit_t_alloc(ma_hit_t_alloc* x, uint64_t size);
void destory_all_ma_hit_t_alloc(ma_hit_t_alloc* x, uint64_t n_read);
void resize_ma_hit_t_alloc(ma_hit_t_alloc* x, uint32_t size);
void destory_ma_hit_t_alloc(ma_hit_t_alloc* x);
void add_ma_hit_t_alloc(ma_hit_t_alloc* x, ma_hit_t* element);
void ma_hit_sort_tn(ma_hit_t *a, long long n);

View File

@@ -44,8 +44,8 @@ void destory_All_reads(All_reads* r)
for (i = 0; i < r->total_reads; i++) {
if (r->N_site[i]) free(r->N_site[i]);
if (r->read_sperate[i]) free(r->read_sperate[i]);
if (r->paf&&r->paf[i].buffer) free(r->paf[i].buffer);
if (r->reverse_paf&&r->reverse_paf[i].buffer) free(r->reverse_paf[i].buffer);
if (r->paf && r->paf[i].buffer) free(r->paf[i].buffer);
if (r->reverse_paf && r->reverse_paf[i].buffer) free(r->reverse_paf[i].buffer);
}
free(r->paf);
free(r->reverse_paf);

View File

@@ -1098,7 +1098,7 @@ void print_asg_arc_t_offset(asg_arc_t_offset* x, long long n, const char* info)
x_off = (long long)(x[i].Off>>32);
y_off = (long long)((uint32_t)x[i].Off);
fprintf(stderr, "i: %lld, x_off: %lld, y_off: %lld, weight: %lu, rev: %u, ol: %u\n",
i, x_off, y_off, x[i].weight, x[i].x.el, x[i].x.ol);
i, x_off, y_off, (unsigned long)x[i].weight, x[i].x.el, x[i].x.ol);
}
}