We've been debugging some problems on Redhat 8 with Paul Hargrove and
here's one problems that remains.
../../src/topology-linux.c:71: conflicting types for `sched_setaffinity'
/usr/include/sched.h:69: previous declaration of `sched_setaffinity'
../../src/topology-linux.c:104: conflicting types for `sched_getaffinity'
/usr/include/sched.h:73: previous declaration of `sched_getaffinity'
make: *** [topology-linux.lo] Error 1
His sched.h defines the very old prototype of sched_setaffinity (pid,
len, ulong*). Our current code seems to assume that this prototype won't
ever appear in sched.h:
* if cpu_set and cpu_set_s do not exist in sched.h, the system uses this
ulong* based prototype, that's OK
* then, if syscall3 exist we do define the function using syscall3, but
it conflicts with the one in sched.h because we use const void* instead
of ulong*. That's not OK because we shouldn't do syscall3 if the
prototype is in the header.
If we want to solve the conflict, we would have to know if the type of
the mask in the 3rd argument of the very old sched_setaffinity prototype
changed over time ? We have const void*, redhat 8 has ulong*
Instead, I am thinking of doing:
* change configure to also define a HWLOC_HAVE_SCHED_SETAFFINITY when
there's a sched_setaffinity in sched.h (recent, old or very old)
* change src/topology-linux.c to check HWLOC_HAVE_SCHED_SETAFFINITY
before using syscall3
* document that HWLOC_HAVE_OLD_SCHED_SETAFFINITY is for old, not for
"very old" :)
This is tricky so inputs are welcome.