Hello Everyone,
        The attached patch will fix the issue pointed out in PR 58996. The main 
issue was that the runtime was not checking for the availability of pthread 
affinity before calling its functions. This patch should fix that. 

Here is the ChangeLog entry:
2014-01-20  Balaji V. Iyer  <balaji.v.i...@intel.com>

        PR other/58996
        * configure.ac: Added a check for pthread affinity support.
        * runtime/os-unix.c: Likewise.
        * configure: Regenerate.


Thanks,

Balaji V. Iyer.
diff --git a/libcilkrts/configure b/libcilkrts/configure
index 91da0a8..63181d7 100644
--- a/libcilkrts/configure
+++ b/libcilkrts/configure
@@ -14420,6 +14420,38 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
+# Check for pthread_{,attr_}[sg]etaffinity_np.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _GNU_SOURCE
+   #include <pthread.h>
+int
+main ()
+{
+cpu_set_t cpuset;
+   pthread_attr_t attr;
+   pthread_getaffinity_np (pthread_self (), sizeof (cpu_set_t), &cpuset);
+   if (CPU_ISSET (0, &cpuset))
+     CPU_SET (1, &cpuset);
+   else
+     CPU_ZERO (&cpuset);
+   pthread_setaffinity_np (pthread_self (), sizeof (cpu_set_t), &cpuset);
+   pthread_attr_init (&attr);
+   pthread_attr_getaffinity_np (&attr, sizeof (cpu_set_t), &cpuset);
+   pthread_attr_setaffinity_np (&attr, sizeof (cpu_set_t), &cpuset);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+$as_echo "#define HAVE_PTHREAD_AFFINITY_NP 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+
 # Must be last
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
diff --git a/libcilkrts/configure.ac b/libcilkrts/configure.ac
index 30fac99..61b45b0 100644
--- a/libcilkrts/configure.ac
+++ b/libcilkrts/configure.ac
@@ -164,5 +164,25 @@ AC_SUBST(toolexeclibdir)
 
 AC_SUBST(lt_cv_dlopen_libs)
 
+# Check for pthread_{,attr_}[sg]etaffinity_np.
+AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+  [#define _GNU_SOURCE
+   #include <pthread.h>],
+  [cpu_set_t cpuset;
+   pthread_attr_t attr;
+   pthread_getaffinity_np (pthread_self (), sizeof (cpu_set_t), &cpuset);
+   if (CPU_ISSET (0, &cpuset))
+     CPU_SET (1, &cpuset);
+   else
+     CPU_ZERO (&cpuset);
+   pthread_setaffinity_np (pthread_self (), sizeof (cpu_set_t), &cpuset);
+   pthread_attr_init (&attr);
+   pthread_attr_getaffinity_np (&attr, sizeof (cpu_set_t), &cpuset);
+   pthread_attr_setaffinity_np (&attr, sizeof (cpu_set_t), &cpuset);])],
+  AC_DEFINE(HAVE_PTHREAD_AFFINITY_NP, 1,
+[       Define if pthread_{,attr_}{g,s}etaffinity_np is supported.]))
+
+
 # Must be last
 AC_OUTPUT
diff --git a/libcilkrts/runtime/os-unix.c b/libcilkrts/runtime/os-unix.c
index dbca21f..fafb91d 100644
--- a/libcilkrts/runtime/os-unix.c
+++ b/libcilkrts/runtime/os-unix.c
@@ -311,6 +311,10 @@ static pid_t linux_gettid(void)
  */
 static int linux_get_affinity_count (int tid) 
 {
+#if !defined HAVE_PTHREAD_AFFINITY_NP
+  return 0;
+#else
+
     cpu_set_t process_mask;
 
     // Extract the thread affinity mask
@@ -337,6 +341,7 @@ static int linux_get_affinity_count (int tid)
     }
 
     return available_procs;
+#endif
 }
 #endif
 

Reply via email to