title: Alternative to shed_getaffinity, cpu_set_t etc?
body: <p>So I'm a noob when it comes to this sort of stuff. </p>
  
  <p>I'm struggling to compile a climate model on macOS and I've boiled it down to what is going on here:</p>
  
  <pre><code>#define _GNU_SOURCE
  
  #include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;string.h&gt;
  #include &lt;unistd.h&gt;
  #include &lt;sched.h&gt;
  #include &lt;errno.h&gt;
  #include &lt;sys/resource.h&gt;
  #include &lt;sys/syscall.h&gt;
  
  static pid_t gettid(void)
  {
    return syscall(__NR_gettid);
  }
  
  /*                                                                                                                                                                                                                                 
   * Returns this thread's CPU affinity, if bound to a single core,                                                                                                                                                                  
   * or else -1.           
  
  
  
  
  */
  int get_cpu_affinity(void)
  {
    cpu_set_t coremask;           /* core affinity mask */
  
    CPU_ZERO(&amp;coremask);
    if (sched_getaffinity(gettid(),sizeof(cpu_set_t),&amp;coremask) != 0) {
      fprintf(stderr,"Unable to get thread %d affinity. 
  
  %s\n",gettid(),strerror(errno));
    }
  
    int cpu;
    int first_cpu = -1;   /* first CPU in range */
    int last_cpu = -1;    /* last CPU in range */
    for (cpu=0;cpu &lt; CPU_SETSIZE;cpu++) {
      if (CPU_ISSET(cpu,&amp;coremask)) {
        if (first_cpu == -1) {
           first_cpu = cpu;
        } else {
          last_cpu = cpu;
        }
      }
    }
  
    return (last_cpu == -1) ? first_cpu : -1;
  
  }
  
  int get_cpu_affinity_(void) { return get_cpu_affinity(); }      /* Fortran interface */
  
  
  /*                                                                                                                                                                                                                                 
   * Set CPU affinity to one core.                                                                                                                                                                                                   
   */
  
  void set_cpu_affinity( int cpu )
  {
    cpu_set_t coremask;           /* core affinity mask */
  
    CPU_ZERO(&amp;coremask);
    CPU_SET(cpu,&amp;coremask);
    if (sched_setaffinity(gettid(),sizeof(cpu_set_t),&amp;coremask) != 0) {
      fprintf(stderr,"Unable to set thread %d affinity. %s\n",gettid(),strerror(errno));
  
    }
  }
  
  void set_cpu_affinity_(int *cpu) { set_cpu_affinity(*cpu); }    /* Fortran interface */
  </code></pre>
  
  <p>When compiling I get a couple of errors:</p>
  
  <p>First - identifier "cpu_set_t" is undefined, Second - identifier "CPU_SETSIZE" is undefined</p>
  
  <p>I've done my googling and it seems to me that sched_getaffinitiy(), cpu_set_t and perhaps some other things are not present in macOS. </p>
  
  <p>With all kinds of C programming I'm really out of my depth. I was wondering if anyone here knows of an alternative way of doing this for macOS and how I could go about doing that. </p>
  
  <p>I've attached the full error report below. </p>
  
  <p>Kind Regards, </p>
  
  <p>Neil :)</p>
  
  <p>Complete error report:</p>
  
  <pre><code>(python2) salvare:MASTERS Neil$ python run.py
  Working directory for exp 'playground' already exists
  RRTM compilation disabled.  Namelist set to gray radiation.
  Writing path_names to '/Users/Neil/MASTERS/ISCA_TEMP/playground/path_names'
  Running compiler
  /Users/Neil/MASTERS/ISCA_TEMP/playground/compile.sh: line 21: module: command not found
  loadmodules
  /Users/Neil/MASTERS/Isca/src/extra/loadmodule: line 3: module: command not found
  /Users/Neil/MASTERS/Isca/src/extra/loadmodule: line 4: module: command not found
  /Users/Neil/MASTERS/Isca/src/extra/loadmodule: line 5: module: command not found
  /Users/Neil/MASTERS/Isca/src/extra/loadmodule: line 6: module: command not found
  /Users/Neil/MASTERS/ISCA_TEMP/playground/compile.sh: line 23: module: command not found
  /Users/Neil/MASTERS/ISCA_TEMP/playground/compile.sh: line 24: ulimit: stack size: cannot modify limit: Operation not permitted
  ./compile_mppn.sh: line 13: module: command not found
  ./compile_mppn.sh: line 14: module: command not found
  ./compile_mppn.sh: line 15: module: command not found
   - mppnccombine.c:162:24: warning: format string is not a string literal (potentially insecure) [-Wformat-security]
  sprintf(outfilename,argv[outputarg]); outlen=strlen(outfilename);
  ^~~~~~~~~~~~~~~
  /usr/include/secure/_stdio.h:47:56: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
  ^~~~~~~~~~~
  mppnccombine.c:162:24: note: treat the string as an argument to avoid this
  sprintf(outfilename,argv[outputarg]); outlen=strlen(outfilename);
   ^
  "%s",
  /usr/include/secure/_stdio.h:47:56: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
  ^
  1 warning generated.
  ln: /Users/Neil/MASTERS/ISCA_TEMP/playground/exec/mppnccombine.x: File exists
   Makefile is ready.
  mpicc -Duse_libMPI -Duse_netCDF -Duse_LARGEFILE -DINTERNAL_FILE_NML -DOVERLOAD_C8 -DRRTM_NO_COMPILE -I/usr/local/include -D__IFC  -c    /Users/Neil/MASTERS/Isca/src/shared/mpp/affinity.c
   ......................................................................................................................../Users/Neil/MASTERS/Isca/src/shared/mpp/affinity.c(35): error: identifier "__NR_gettid" is undefined
  eturn syscall(__NR_gettid);
   ^
  /Users/Neil/MASTERS/Isca/src/shared/mpp/affinity.c(44): error: identifier "cpu_set_t" is undefined
  cpu_set_t coremask;     /* core affinity mask */
  ^
   /Users/Neil/MASTERS/Isca/src/shared/mpp/affinity.c(47): error: identifier "cpu_set_t" is undefined
  if (sched_getaffinity(gettid(),sizeof(cpu_set_t),&amp;coremask) != 0) {
  ^
  /Users/Neil/MASTERS/Isca/src/shared/mpp/affinity.c(54): error: identifier "CPU_SETSIZE" is undefined
  for (cpu=0;cpu &lt; CPU_SETSIZE;cpu++) {
  ^
  /Users/Neil/MASTERS/Isca/src/shared/mpp/affinity.c(75): error: identifier "cpu_set_t" is undefined
  cpu_set_t coremask;     /* core affinity mask */
  ^
  /Users/Neil/MASTERS/Isca/src/shared/mpp/affinity.c(79): error: identifier "cpu_set_t" is undefined
  if (sched_setaffinity(gettid(),sizeof(cpu_set_t),&amp;coremask) != 0) {
   ^
  compilation aborted for /Users/Neil/MASTERS/Isca/src/shared/mpp/affinity.c (code 2)
  make: *** [affinity.o] Error 2
  ERROR: mkmf failed for fms_moist
  CRITICAL - Compilation failed.
  Traceback (most recent call last):
    File "run.py", line 25, in &lt;module&gt;
      exp.compile()
    File "/Users/Neil/MASTERS/Isca/src/extra/python/gfdl/experiment.py", line 298, in compile
      raise e
  sh.ErrorReturnCode_1: 
  
    RAN: /bin/bash /Users/Neil/MASTERS/ISCA_TEMP/playground/compile.sh
  
    STDOUT:
  
  
    STDERR:
  </code></pre>