Browse code

Create search_job struct

John Hawthorn authored on 08/01/2017 08:55:11
Showing 1 changed files

... ...
@@ -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])) {