void *match_thread(void *thread_args) { long i; float score; heap_t *heap = NULL; thread_args_t *args = (thread_args_t *)thread_args; if (args->limit) { // Reserve one extra slot so that we can do an insert-then-extract even // when "full" (effectively allows use of min-heap to maintain a // top-"limit" list of items). heap = heap_new(args->limit + 1, cmp_score); } for ( i = args->thread_index; i < args->path_count; i += args->thread_count ) { args->matches[i].path = RARRAY_PTR(args->haystacks)[i]; if (args->needle_bitmask == UNSET_BITMASK) { args->matches[i].bitmask = UNSET_BITMASK; } if (!NIL_P(args->last_needle) && args->matches[i].score == 0.0) { // Skip over this candidate because it didn't match last // time and it can't match this time either. continue; } args->matches[i].score = calculate_match( args->matches[i].path, args->needle, args->case_sensitive, args->always_show_dot_files, args->never_show_dot_files, args->recurse, args->needle_bitmask, &args->matches[i].bitmask ); if (args->matches[i].score == 0.0) { continue; } if (heap) { if (heap->count == args->limit) { score = ((match_t *)HEAP_PEEK(heap))->score; if (args->matches[i].score >= score) { heap_insert(heap, &args->matches[i]); (void)heap_extract(heap); } } else { heap_insert(heap, &args->matches[i]); } } } return heap; }
void *match_thread(void *thread_args) { thread_args_t *args = (thread_args_t *)thread_args; for (long i = args->thread_index; i < args->path_count; i += args->thread_count) { VALUE path = RARRAY_PTR(args->paths)[i]; calculate_match(path, args->abbrev, args->always_show_dot_files, args->never_show_dot_files, &args->matches[i]); } return NULL; }