This is the mail archive of the cygwin-developers mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Implement sched_[gs]etaffinity()


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;
}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]