Changeset: df1858231ff4 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=df1858231ff4 Modified Files: sql/backends/monet5/bam/bam_lib.c Branch: bamloader Log Message:
Always clean up on exceptions diffs (127 lines): diff --git a/sql/backends/monet5/bam/bam_lib.c b/sql/backends/monet5/bam/bam_lib.c --- a/sql/backends/monet5/bam/bam_lib.c +++ b/sql/backends/monet5/bam/bam_lib.c @@ -264,6 +264,7 @@ bam_flag_bat(bat * ret, bat * bid, str * /* allocate result BAT */ output = BATnew(TYPE_void, TYPE_bit, BATcount(input), TRANSIENT); if (output == NULL) { + BBPreleaseref(input->batCacheid); throw(MAL, "bam_flag_bat", MAL_MALLOC_FAIL); } @@ -345,6 +346,7 @@ reverse_seq_bat(bat * ret, bat * bid) /* allocate result BAT */ result = BATnew(TYPE_void, TYPE_str, BATcount(seqs), TRANSIENT); if (result == NULL) { + BBPreleaseref(seqs->batCacheid); throw(MAL, "reverse_seq_bat", MAL_MALLOC_FAIL); } BATseqbase(result, seqs->hseqbase); @@ -356,6 +358,7 @@ reverse_seq_bat(bat * ret, bat * bid) str r, msg; if ((msg = reverse_seq(&r, &t)) != MAL_SUCCEED) { + BBPreleaseref(seqs->batCacheid); BBPreleaseref(result->batCacheid); return msg; } @@ -386,6 +389,7 @@ reverse_qual_bat(bat * ret, bat * bid) /* allocate result BAT */ result = BATnew(TYPE_void, TYPE_str, BATcount(quals), TRANSIENT); if (result == NULL) { + BBPreleaseref(quals->batCacheid); throw(MAL, "reverse_qual_bat", MAL_MALLOC_FAIL); } BATseqbase(result, quals->hseqbase); @@ -397,6 +401,7 @@ reverse_qual_bat(bat * ret, bat * bid) str r, msg; if ((msg = reverse_qual(&r, &t)) != MAL_SUCCEED) { + BBPreleaseref(quals->batCacheid); BBPreleaseref(result->batCacheid); return msg; } @@ -471,6 +476,7 @@ seq_length_bat(bat * ret, bat * bid) /* allocate result BAT */ result = BATnew(TYPE_void, TYPE_int, BATcount(cigars), TRANSIENT); if (result == NULL) { + BBPreleaseref(cigars->batCacheid); throw(MAL, "seq_length_bat", MAL_MALLOC_FAIL); } BATseqbase(result, cigars->hseqbase); @@ -483,6 +489,7 @@ seq_length_bat(bat * ret, bat * bid) int r; if ((msg = seq_length(&r, &t)) != MAL_SUCCEED) { + BBPreleaseref(cigars->batCacheid); BBPreleaseref(result->batCacheid); return msg; } @@ -500,27 +507,33 @@ seq_length_bat(bat * ret, bat * bid) str seq_char_bat(bat * ret, int * ref_pos, bat * alg_seq, bat * alg_pos, bat * alg_cigar) { - BAT *seqs, *poss, *cigars, *result; + BAT *seqs = NULL, *poss = NULL, *cigars = NULL, *result = NULL; BUN seq = 0, pos = 0, cigar = 0, seq_end = 0; BATiter seq_it, pos_it, cigar_it; + str msg = MAL_SUCCEED; + assert(ret != NULL && ref_pos != NULL && alg_seq != NULL && alg_pos != NULL && alg_cigar != NULL); if ((seqs = BATdescriptor(*alg_seq)) == NULL || (poss = BATdescriptor(*alg_pos)) == NULL || - (cigars = BATdescriptor(*alg_cigar)) == NULL) - throw(MAL, "seq_char_bat", RUNTIME_OBJECT_MISSING); + (cigars = BATdescriptor(*alg_cigar)) == NULL) { + msg = createException(MAL, "seq_char_bat", RUNTIME_OBJECT_MISSING); + goto cleanup; + } if(BATcount(seqs) != BATcount(poss) || BATcount(seqs) != BATcount(cigars)) { - throw(MAL, "seq_char_bat", + msg = createException(MAL, "seq_char_bat", "Misalignment in input BATs: "BUNFMT"/"BUNFMT"/"BUNFMT, BATcount(poss), BATcount(seqs), BATcount(cigars)); + goto cleanup; } /* allocate result BAT */ result = BATnew(TYPE_void, TYPE_str, BATcount(cigars), TRANSIENT); if (result == NULL) { - throw(MAL, "seq_char_bat", MAL_MALLOC_FAIL); + msg = createException(MAL, "seq_char_bat", MAL_MALLOC_FAIL); + goto cleanup; } BATseqbase(result, seqs->hseqbase); @@ -541,8 +554,7 @@ seq_char_bat(bat * ret, int * ref_pos, b str msg; if ((msg = seq_char(&r, ref_pos, &seq_val, pos_val, &cigar_val)) != MAL_SUCCEED) { - BBPreleaseref(result->batCacheid); - return msg; + goto cleanup; } BUNappend(result, (ptr) r, FALSE); ++seq; @@ -550,12 +562,13 @@ seq_char_bat(bat * ret, int * ref_pos, b ++cigar; } +cleanup: /* release input BAT-descriptors */ - BBPreleaseref(seqs->batCacheid); - BBPreleaseref(poss->batCacheid); - BBPreleaseref(cigars->batCacheid); + if(seqs) BBPreleaseref(seqs->batCacheid); + if(poss) BBPreleaseref(poss->batCacheid); + if(cigars) BBPreleaseref(cigars->batCacheid); - BBPkeepref((*ret = result->batCacheid)); + if(result) BBPkeepref((*ret = result->batCacheid)); - return MAL_SUCCEED; + return msg; } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list