Original cpuset.h for review

Joel Sherrill joel.sherrill at OARcorp.com
Mon Oct 14 18:47:45 UTC 2013


Hi

This has had limited review but should close if you ignore
that I need to add some comments.

This will go into the RTEMS specific subdirectory of
newlib and be accompanied by prototypes of various
pthread methods that use this. This is just the
first step.

Comments.

-- 
Joel Sherrill, Ph.D.             Director of Research & Development
joel.sherrill at OARcorp.com        On-Line Applications Research
Ask me about RTEMS: a free RTOS  Huntsville AL 35805
Support Available                (256) 722-9985
-------------- next part --------------
/*
 * Copyright (c) 2013 On-Line Applications Research Corporation.
 * All rights reserved.
 *
 *  On-Line Applications Research Corporation
 *  7047 Old Madison Pike Suite 320
 *  Huntsville Alabama 35806
 *  <info at oarcorp.com>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

/*
 *  This file implements an API compatible with static portion of
 *  the GNU/Linux cpu_set_t macros but is independently implemented.
 *  The GNU/Linux manual page and the FreeBSD cpuset_t implementation
 *  were used as reference material.
 *
 *  Not implemented:
 *    + Linux CPU_XXX_S
 *    + FreeBSD CPU_SUBSET
 *    + FreeBSD CPU_OVERLAP
 */

#ifndef _SYS_CPUSET_H_
#define _SYS_CPUSET_H_

#define CPU_SETSIZE 32

#define _NCPUBITS  (sizeof(long) * NBBY) /* bits per mask */
#define _NCPUWORDS howmany(CPU_SETSIZE, _NCPUBITS)

typedef struct _cpuset {
  long  __bits[howmany(CPU_SETSIZE, _NCPUBITS)];
} cpu_set_t;

#define __cpuset_mask(_cpu) ((long)1 << ((_cpu) % _NCPUBITS))

#define CPU_ZERO(_set) \
  do { \
    size_t _i; \
    for (_i = 0; _i < _NCPUWORDS; _i++) \
     (_set)->__bits[_i] = 0; \
  } while (0)

#define CPU_FILL(_set) \
  do { \
    size_t _i; \
    for (_i = 0; _i < _NCPUWORDS; _i++) \
     (_set)->__bits[_i] = -1; \
  } while (0)

#define CPU_SET(_cpu, _set) \
  do { \
    ((_set)->__bits[(_cpu)/_NCPUBITS] |= __cpuset_mask(_cpu)); \
  } while (0)

#define CPU_CLR(_cpu, _set) \
  do { \
    ((_set)->__bits[(_cpu)/_NCPUBITS] &= ~__cpuset_mask(_cpu)); \
  } while (0)

#define	CPU_ISSET(_cpu, _set) \
  (((_set)->__bits[(_cpu)/_NCPUBITS] & __cpuset_mask(_cpu)) != 0)

#define	CPU_COPY(_dest, _src) \
  (*(t) = *(f))

#define CPU_AND(_dest, _src1, _src2) \
  do { \
    size_t _i; \
    for (_i = 0; _i < _NCPUWORDS; _i++) \
     (_dest)->__bits[_i] = (_src1)->__bits[_i] & (_set)->__bits[_i]; \
  } while (0)

#define CPU_OR(_dest, _src1, _src2) \
  do { \
    size_t _i; \
    for (_i = 0; _i < _NCPUWORDS; _i++) \
     (_dest)->__bits[_i] = (_src1)->__bits[_i] | (_set)->__bits[_i]; \
  } while (0)

#define CPU_XOR(_dest, _src1, _src2) \
  do { \
    size_t _i; \
    for (_i = 0; _i < _NCPUWORDS; _i++) \
     (_dest)->__bits[_i] = (_src1)->__bits[_i] ^ (_set)->__bits[_i]; \
  } while (0)

#define CPU_NAND(_dest, _src1, _src2) \
  do { \
    size_t _i; \
    for (_i = 0; _i < _NCPUWORDS; _i++) \
     (_dest)->__bits[_i] = (_src1)->__bits[_i] & ~(_set)->__bits[_i]; \
  } while (0)

static inline int CPU_COUNT(cpu_set_t *set)
{
  size_t i;
  int    count = 0;

  for (i=0; i < CPU_SETSIZE; i++)
    if (CPU_ISSET(i, set) != 0)
      count++;
  return count;
}

static inline int CPU_EQUAL(cpu_set_t *set1, cpu_set_t *set2)
{
  size_t i;

  for (i=0; i < CPU_SETSIZE; i++)
    if (set1->__bits[i] != set2->__bits[i] )
      return 0;
  return 1;
}

#define CPU_CMP(_set1, _set2) \
  CPU_EQUAL(_set1, _set2)
  
static inline int CPU_EMPTY(cpu_set_t *set)
{
  size_t i;

  for (i=0; i < CPU_SETSIZE; i++)
    if (set->__bits[i] != 0 )
      return 0;
  return 1;
}

#endif


More information about the devel mailing list