Implement sched_[gs]etaffinity()

Mark Geisert mark@maxrnd.com
Thu Apr 11 04:21:00 GMT 2019


I've recently sent a patch to cygwin-patches that implements these 
Linux-specific functions.  I used the following test program to debug and test 
the implementation.  When the program is run, you can watch it migrate from CPU 
to CPU with Windows Task Manager.

I've only tested on 64-bit Windows 7 so far.  If the code (in the patch) is 
adequate I will supply another patch for doc updates, etc.

..mark

P.S. Here's the test program:

~ cat afftest.c
#define _GNU_SOURCE
#include <errno.h>
#include <math.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "/oss/src/newlib/libc/include/sched.h" //XXX for demo only

size_t cpusetsize;
volatile int nprocs;
volatile int proc;

void handler (int unused)
{
   char buf[2] = "\000";
   cpu_set_t mask;

   ++proc;
   if (proc >= nprocs)
     proc = 0;
   buf[0] = '0' + proc;
   write (2, buf, 1);

   mask = 1 << proc;
   int res = sched_setaffinity (0, cpusetsize, &mask);
   if (res < 0)
     {
       perror ("handler");
       exit (2);
     }
   alarm (8);
}

int
main (int argc, char **argv)
{
   char *ptr = getenv ("NUMBER_OF_PROCESSORS");

   if (!ptr)
     return 1;
   nprocs = atoi (ptr);
   proc = nprocs;
   cpusetsize = (nprocs + 7) / 8;

   signal (SIGALRM, handler);
   alarm (1);

   double x = 92837492873.2398749827394723984723;
   while (x++)
     x = sqrt (x), x *= x;
}



More information about the Cygwin-developers mailing list