|
...
|
...
|
@@ -138,10 +138,14 @@ size_t choices_available(choices_t *c) {
|
|
138
|
138
|
return c->available;
|
|
139
|
139
|
}
|
|
140
|
140
|
|
|
|
141
|
+struct search_job {
|
|
|
142
|
+ const char *search;
|
|
|
143
|
+};
|
|
|
144
|
+
|
|
141
|
145
|
struct worker {
|
|
142
|
146
|
pthread_t thread_id;
|
|
143
|
147
|
choices_t *choices;
|
|
144
|
|
- const char *search;
|
|
|
148
|
+ struct search_job *job;
|
|
145
|
149
|
size_t worker_num;
|
|
146
|
150
|
struct scored_result *results;
|
|
147
|
151
|
size_t available;
|
|
...
|
...
|
@@ -149,15 +153,16 @@ struct worker {
|
|
149
|
153
|
|
|
150
|
154
|
static void *choices_search_worker(void *data) {
|
|
151
|
155
|
struct worker *w = (struct worker *)data;
|
|
|
156
|
+ struct search_job *job = w->job;
|
|
152
|
157
|
const choices_t *c = w->choices;
|
|
153
|
158
|
|
|
154
|
159
|
size_t start = (w->worker_num) * c->size / c->worker_count;
|
|
155
|
160
|
size_t end = (w->worker_num + 1) * c->size / c->worker_count;
|
|
156
|
161
|
|
|
157
|
162
|
for(size_t i = start; i < end; i++) {
|
|
158
|
|
- if (has_match(w->search, c->strings[i])) {
|
|
|
163
|
+ if (has_match(job->search, c->strings[i])) {
|
|
159
|
164
|
w->results[w->available].str = c->strings[i];
|
|
160
|
|
- w->results[w->available].score = match(w->search, c->strings[i]);
|
|
|
165
|
+ w->results[w->available].score = match(job->search, c->strings[i]);
|
|
161
|
166
|
w->available++;
|
|
162
|
167
|
}
|
|
163
|
168
|
}
|
|
...
|
...
|
@@ -168,6 +173,9 @@ static void *choices_search_worker(void *data) {
|
|
168
|
173
|
void choices_search(choices_t *c, const char *search) {
|
|
169
|
174
|
choices_reset_search(c);
|
|
170
|
175
|
|
|
|
176
|
+ struct search_job *job = calloc(1, sizeof(struct search_job));
|
|
|
177
|
+ job->search = search;
|
|
|
178
|
+
|
|
171
|
179
|
/* allocate storage for our results */
|
|
172
|
180
|
c->results = malloc(c->size * sizeof(struct scored_result));
|
|
173
|
181
|
if (!c->results) {
|
|
...
|
...
|
@@ -178,7 +186,7 @@ void choices_search(choices_t *c, const char *search) {
|
|
178
|
186
|
struct worker *workers = calloc(c->worker_count, sizeof(struct worker));
|
|
179
|
187
|
for (unsigned int i = 0; i < c->worker_count; i++) {
|
|
180
|
188
|
workers[i].choices = c;
|
|
181
|
|
- workers[i].search = search;
|
|
|
189
|
+ workers[i].job = job;
|
|
182
|
190
|
workers[i].worker_num = i;
|
|
183
|
191
|
workers[i].results = malloc(c->size * sizeof(struct scored_result)); /* FIXME: This is overkill */
|
|
184
|
192
|
if (pthread_create(&workers[i].thread_id, NULL, &choices_search_worker, &workers[i])) {
|