This is the mail archive of the
cygwin-developers
mailing list for the Cygwin project.
Implement sched_[gs]etaffinity()
- From: Mark Geisert <mark at maxrnd dot com>
- To: cygwin-developers at cygwin dot com
- Date: Wed, 10 Apr 2019 21:21:18 -0700
- Subject: 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;
}