- for (s=0; s<nsections; s++) {
- r= pthread_join(threads[s].thread, 0);
- if (r) diee("pthread_join");
- combine(vertices, s, threads[s].secdata, gendata);
+ inparallel_barrier(); /* announce more work to do */
+
+ separately(vertices, NSECTIONS-1, &secdatas[NSECTIONS-1], gendata);
+
+ inparallel_barrier(); /* synchronise for completion */
+
+ for (s=0; s<nsections; s++)
+ combine(vertices, s, &secdatas[s].secdata, gendata);
+}
+
+void inparallel_barrier(void) {
+ if (NSECTIONS>1) {
+ int r;
+ r= pthread_barrier_wait(&threads_barrier);
+ if (r && r!=PTHREAD_BARRIER_SERIAL_THREAD)
+ { errno=r; diee("pthread_barrier_wait"); }