summaryrefslogtreecommitdiff
path: root/src/choices.c
diff options
context:
space:
mode:
authorJohn Hawthorn <john.hawthorn@gmail.com>2017-01-08 00:55:11 -0800
committerJohn Hawthorn <john.hawthorn@gmail.com>2017-01-08 00:55:11 -0800
commit47dee6d7b8c66eead65e1f771bdaa2b924e305a8 (patch)
treeed955cdd32ab51a6fefe9f57a04cda9572111181 /src/choices.c
parent00123bfd597289042ea8d07e192d447344f28fc0 (diff)
Create search_job struct
Diffstat (limited to 'src/choices.c')
-rw-r--r--src/choices.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/choices.c b/src/choices.c
index ece3443..eb19bed 100644
--- a/src/choices.c
+++ b/src/choices.c
@@ -138,10 +138,14 @@ size_t choices_available(choices_t *c) {
return c->available;
}
+struct search_job {
+ const char *search;
+};
+
struct worker {
pthread_t thread_id;
choices_t *choices;
- const char *search;
+ struct search_job *job;
size_t worker_num;
struct scored_result *results;
size_t available;
@@ -149,15 +153,16 @@ struct worker {
static void *choices_search_worker(void *data) {
struct worker *w = (struct worker *)data;
+ struct search_job *job = w->job;
const choices_t *c = w->choices;
size_t start = (w->worker_num) * c->size / c->worker_count;
size_t end = (w->worker_num + 1) * c->size / c->worker_count;
for(size_t i = start; i < end; i++) {
- if (has_match(w->search, c->strings[i])) {
+ if (has_match(job->search, c->strings[i])) {
w->results[w->available].str = c->strings[i];
- w->results[w->available].score = match(w->search, c->strings[i]);
+ w->results[w->available].score = match(job->search, c->strings[i]);
w->available++;
}
}
@@ -168,6 +173,9 @@ static void *choices_search_worker(void *data) {
void choices_search(choices_t *c, const char *search) {
choices_reset_search(c);
+ struct search_job *job = calloc(1, sizeof(struct search_job));
+ job->search = search;
+
/* allocate storage for our results */
c->results = malloc(c->size * sizeof(struct scored_result));
if (!c->results) {
@@ -178,7 +186,7 @@ void choices_search(choices_t *c, const char *search) {
struct worker *workers = calloc(c->worker_count, sizeof(struct worker));
for (unsigned int i = 0; i < c->worker_count; i++) {
workers[i].choices = c;
- workers[i].search = search;
+ workers[i].job = job;
workers[i].worker_num = i;
workers[i].results = malloc(c->size * sizeof(struct scored_result)); /* FIXME: This is overkill */
if (pthread_create(&workers[i].thread_id, NULL, &choices_search_worker, &workers[i])) {