MINOR: threads: Fix pthread_setaffinity_np on FreeBSD.

As with the call to cpuset_setaffinity(), FreeBSD expects the argument to
pthread_setaffinity_np() to be a cpuset_t, not an unsigned long, so the call
was silently failing.

This should probably be backported to 1.8.
diff --git a/src/haproxy.c b/src/haproxy.c
index e842673..df8d34e 100644
--- a/src/haproxy.c
+++ b/src/haproxy.c
@@ -2915,10 +2915,24 @@
 				global.cpu_map.thread[relative_pid-1][i] &= global.cpu_map.proc[relative_pid-1];
 
 			if (i < LONGBITS &&       /* only the first 32/64 threads may be pinned */
-			    global.cpu_map.thread[relative_pid-1][i]) /* only do this if the thread has a THREAD map */
+			    global.cpu_map.thread[relative_pid-1][i]) {/* only do this if the thread has a THREAD map */
+#if defined(__FreeBSD__) || defined(__NetBSD__)
+				cpuset_t cpuset;
+#else
+				cpu_set_t cpuset;
+#endif
+				int j;
+				unsigned long cpu_map = global.cpu_map.thread[relative_pid-1][i];
+
+				CPU_ZERO(&cpuset);
+
+				while ((j = ffsl(cpu_map)) > 0) {
+					CPU_SET(j - 1, &cpuset);
+					cpu_map &= ~(1 << (j - 1));
+				}
 				pthread_setaffinity_np(threads[i],
-						       sizeof(unsigned long),
-						       (void *)&global.cpu_map.thread[relative_pid-1][i]);
+						       sizeof(cpuset), &cpuset);
+			}
 		}
 #endif /* !USE_CPU_AFFINITY */