On Nov 29, 2005, at 2:51 PM, Paul H. Hargrove wrote:

The result is the following, which I've tried in limited testing:

Holy Crimminey, Batman -- this message slipped by me in my INBOX.

This is friggen' amazing.

Many thanks, Paul!

enum {
   SCHED_SETAFFINITY_TAKES_2_ARGS,
   SCHED_SETAFFINITY_TAKES_3_ARGS_THIRD_IS_LONG,
   SCHED_SETAFFINITY_TAKES_3_ARGS_THIRD_IS_CPU_SET,
   SCHED_SETAFFINITY_UNKNOWN
};

/* We want to call by this prototype, even if it is not the real one */
extern sched_setaffinity(int pid, unsigned int len, void *mask);

int probe_setaffinity(void) {
     unsigned long mask[511];
     int rc;

     memset(mask, 0, sizeof(mask));
     mask[0] = 1;
     rc = sched_setaffinity(0, sizeof(mask), mask);

     if (rc >= 0) {
         /* Kernel truncates over-length masks -> successful call */
         return SCHED_SETAFFINITY_TAKES_3_ARGS_THIRD_IS_CPU_SET;
     } else if (errno == EINVAL) {
         /* Kernel returns EINVAL when len != sizeof(long) */
         return SCHED_SETAFFINITY_TAKES_3_ARGS_THIRD_IS_LONG;
     } else if (errno == EFAULT) {
         /* Kernel returns EFAULT having rejected len as an address */
         return SCHED_SETAFFINITY_TAKES_2_ARGS;
     }
     return SCHED_SETAFFINITY_UNKNOWN;
};

--
{+} Jeff Squyres
{+} The Open MPI Project
{+} http://www.open-mpi.org/



Reply via email to