@@ -256,19 +256,25 @@ void mm_select_sub(void *km, float pri_ratio, int min_diff, int best_n, int chec
256256{
257257 if (pri_ratio > 0.0f && * n_ > 0 ) {
258258 int i , k , n = * n_ , n_2nd = 0 ;
259- for (i = k = 0 ; i < n ; ++ i ) {
259+ uint8_t * keep = (uint8_t * )kmalloc (km , n );
260+ for (i = 0 ; i < n ; ++ i ) {
260261 int p = r [i ].parent ;
262+ keep [i ] = 0 ;
261263 if (p == i || r [i ].inv ) { // primary or inversion
262- r [ k ++ ] = r [ i ] ;
264+ keep [ i ] = 1 ;
263265 } else if ((r [i ].score >= r [p ].score * pri_ratio || r [i ].score + min_diff >= r [p ].score ) && n_2nd < best_n ) {
264266 if (!(r [i ].qs == r [p ].qs && r [i ].qe == r [p ].qe && r [i ].rid == r [p ].rid && r [i ].rs == r [p ].rs && r [i ].re == r [p ].re )) // not identical hits
265- r [k ++ ] = r [i ], ++ n_2nd ;
266- else if (r [i ].p ) free (r [i ].p );
267+ keep [i ] = 1 , ++ n_2nd ;
267268 } else if (check_strand && n_2nd < best_n && r [i ].score > min_strand_sc && r [i ].rev != r [p ].rev ) {
268269 r [i ].strand_retained = 1 ;
269- r [k ++ ] = r [i ], ++ n_2nd ;
270- } else if (r [i ].p ) free (r [i ].p );
270+ keep [i ] = 1 , ++ n_2nd ;
271+ }
272+ }
273+ for (i = k = 0 ; i < n ; ++ i ) {
274+ if (keep [i ]) r [k ++ ] = r [i ];
275+ else if (r [i ].p ) free (r [i ].p );
271276 }
277+ kfree (km , keep );
272278 if (k != n ) mm_sync_regs (km , k , r ); // removing hits requires sync()
273279 * n_ = k ;
274280 }
@@ -277,13 +283,18 @@ void mm_select_sub(void *km, float pri_ratio, int min_diff, int best_n, int chec
277283int mm_filter_strand_retained (int n_regs , mm_reg1_t * r )
278284{
279285 int i , k ;
280- for (i = k = 0 ; i < n_regs ; ++ i ) {
286+ uint8_t * keep = (uint8_t * )malloc (n_regs );
287+ for (i = 0 ; i < n_regs ; ++ i ) {
281288 int p = r [i ].parent ;
282- if (!r [i ].strand_retained || r [i ].div < r [p ].div * 5.0f || r [i ].div < 0.01f ) {
289+ keep [i ] = (!r [i ].strand_retained || r [i ].div < r [p ].div * 5.0f || r [i ].div < 0.01f );
290+ }
291+ for (i = k = 0 ; i < n_regs ; ++ i ) {
292+ if (keep [i ]) {
283293 if (k < i ) r [k ++ ] = r [i ];
284294 else ++ k ;
285295 }
286296 }
297+ free (keep );
287298 return k ;
288299}
289300
0 commit comments