examples/performance-thread: fix build on FreeBSD
authorBruce Richardson <bruce.richardson@intel.com>
Fri, 21 Apr 2017 13:50:23 +0000 (14:50 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Fri, 21 Apr 2017 14:20:16 +0000 (16:20 +0200)
This set of sample apps did not compile on FreeBSD due to use of a number
of Linux/glibc-specific APIs, or APIs which existed in different headers
on FreeBSD. Specifically, the following APIs has problems:
  * sched_getcpu() is a glibc extension, so use rte_lcore_id() on BSD
  * pthread_yield() returns int on Linux, but void on FreeBSD, so
    we have to create two slightly different copies of the function.
  * the type for managing cpu sets is cpuset_t on FreeBSD rather than
    cpu_set_t as on Linux, so use rte_cpuset_t from rte_lcore.h.
  * APIs for managing cpu affinity are in pthread_np.h on FreeBSD, rather
    than in pthread.h, also fixed by including rte_lcore.h

Fixes: 433ba6228f9a ("examples/performance-thread: add pthread_shim app")
Fixes: d48415e1fee3 ("examples/performance-thread: add l3fwd-thread app")
Cc: stable@dpdk.org
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
examples/performance-thread/l3fwd-thread/main.c
examples/performance-thread/pthread_shim/main.c
examples/performance-thread/pthread_shim/pthread_shim.c
examples/performance-thread/pthread_shim/pthread_shim.h

index f6154ac..2d98473 100644 (file)
 #define APP_LOOKUP_METHOD             APP_LOOKUP_LPM
 #endif
 
+#ifndef __GLIBC__ /* sched_getcpu() is glibc specific */
+#define sched_getcpu() rte_lcore_id()
+#endif
+
 static int
 check_ptype(int portid)
 {
index f035721..850b009 100644 (file)
 #define DEBUG_APP 0
 #define HELLOW_WORLD_MAX_LTHREADS 10
 
+#ifndef __GLIBC__ /* sched_getcpu() is glibc-specific */
+#define sched_getcpu() rte_lcore_id()
+#endif
+
 __thread int print_count;
 __thread pthread_mutex_t print_lock;
 
@@ -175,12 +179,12 @@ static void initial_lthread(void *args __attribute__((unused)))
                 * use an attribute to pass the desired lcore
                 */
                pthread_attr_t attr;
-               cpu_set_t cpuset;
+               rte_cpuset_t cpuset;
 
                CPU_ZERO(&cpuset);
                CPU_SET(lcore, &cpuset);
                pthread_attr_init(&attr);
-               pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &cpuset);
+               pthread_attr_setaffinity_np(&attr, sizeof(rte_cpuset_t), &cpuset);
 
                /* create the thread */
                pthread_create(&tid[i], &attr, helloworld_pthread, (void *) i);
index 0d6100c..7167311 100644 (file)
@@ -159,7 +159,7 @@ int (*f_pthread_setschedparam)
 int (*f_pthread_yield)
        (void);
 int (*f_pthread_setaffinity_np)
-       (pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset);
+       (pthread_t thread, size_t cpusetsize, const rte_cpuset_t *cpuset);
 int (*f_nanosleep)
        (const struct timespec *req, struct timespec *rem);
 } _sys_pthread_funcs = {
@@ -390,11 +390,11 @@ pthread_create(pthread_t *__restrict tid,
 
                if (attr != NULL) {
                        /* determine CPU being requested */
-                       cpu_set_t cpuset;
+                       rte_cpuset_t cpuset;
 
                        CPU_ZERO(&cpuset);
                        pthread_attr_getaffinity_np(attr,
-                                               sizeof(cpu_set_t),
+                                               sizeof(rte_cpuset_t),
                                                &cpuset);
 
                        if (CPU_COUNT(&cpuset) != 1)
@@ -576,15 +576,26 @@ int pthread_rwlock_wrlock(pthread_rwlock_t *a)
        return _sys_pthread_funcs.f_pthread_rwlock_wrlock(a);
 }
 
-int pthread_yield(void)
+#ifdef RTE_EXEC_ENV_LINUXAPP
+int
+pthread_yield(void)
 {
        if (override) {
                lthread_yield();
                return 0;
        }
        return _sys_pthread_funcs.f_pthread_yield();
-
 }
+#else
+void
+pthread_yield(void)
+{
+       if (override)
+               lthread_yield();
+       else
+               _sys_pthread_funcs.f_pthread_yield();
+}
+#endif
 
 pthread_t pthread_self(void)
 {
@@ -686,7 +697,7 @@ int nanosleep(const struct timespec *req, struct timespec *rem)
 
 int
 pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,
-                      const cpu_set_t *cpuset)
+                      const rte_cpuset_t *cpuset)
 {
        if (override) {
                /* we only allow affinity with a single CPU */
index 78bbb5a..10f8789 100644 (file)
@@ -33,7 +33,8 @@
 
 #ifndef _PTHREAD_SHIM_H_
 #define _PTHREAD_SHIM_H_
-#include <pthread.h>
+
+#include <rte_lcore.h>
 
 /*
  * This pthread shim is an example that demonstrates how legacy code