V2 was Re: Original cpuset.h for review
Joel Sherrill
joel.sherrill at OARcorp.com
Tue Oct 15 14:26:18 UTC 2013
Attached is version 2. All comments should be addressed
and a bug fixed.
Also.. the Linux and BSD versions are all macros. How do you all
feel about them being static inlines instead?
On 10/15/2013 1:00 AM, Thomas Doerfler wrote:
> Hi Joel,
>
> just some comments from me:
Thanks. I added Gedare's below so this thread is all together.
> 1.) In the typedef for cpu_set_t, it might be better to use the
> _NCPUWORDS macro instead of duplicating its expansion
Nice call. That's what I get for looking at the FreeBSD code. :)
> 2.) In the operations _OR, _AND etc, you used "(_set)" instead of
> "(_src2)" for the second operand
Got it. I have some test code but it hasn't gotten to those yet.
> 3.) The term "(_cpu)/_NCPUBITS" is duplicated to get the index into the
> cpuset table. This might be done through a macro (__cpu_set_idx ?) aswell.
I wondered this about half way through. Neither the BSD nor Linux
code do this. Done.
> Gedare: Pretty reasonable at first skimming. You could use the _NCPUWORDS
> macro in the definition of __bits[] array in cpu_set_t.
Thomas also spotted this. See above. Fixed.
> Gedare: Not sure where
> the NBBY value comes from, is there an implicit dependency header file
> missing?
sys/types.h - The test I started includes pthread.h.
I just added a simpler test which just compiles a
file including cpuset.h. I added sys/types.h to get
it to compile.
Should the include be inside or outside the inclusion
guard?
--joel
> wkr,
>
> Thomas.
>
>
> Am 14.10.2013 20:47, schrieb Joel Sherrill:
>> 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.
>>
>>
>>
>> _______________________________________________
>> rtems-devel mailing list
>> rtems-devel at rtems.org
>> http://www.rtems.org/mailman/listinfo/rtems-devel
>>
>
>
--
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_
#include <sys/types.h>
#define CPU_SETSIZE 32
#define _NCPUBITS (sizeof(long) * NBBY) /* bits per mask */
#define _NCPUWORDS howmany(CPU_SETSIZE, _NCPUBITS)
typedef struct _cpuset {
long __bits[_NCPUWORDS];
} cpu_set_t;
#define __cpuset_mask(_cpu) ((long)1 << ((_cpu) % _NCPUBITS))
#define __cpuset_index(_cpu) ((_cpu)/_NCPUBITS)
/* zero out _set */
#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[__cpuset_index(_cpu)] |= __cpuset_mask(_cpu)); \
} while (0)
#define CPU_CLR(_cpu, _set) \
do { \
((_set)->__bits[__cpuset_index(_cpu)] &= ~__cpuset_mask(_cpu)); \
} while (0)
/* Return 1 is _cpu is set in _set, 0 otherwise */
#define CPU_ISSET(_cpu, _set) \
(((_set)->__bits[__cpuset_index(_cpu)] & __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] & (_src2)->__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] | (_src2)->__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] ^ (_src2)->__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] & ~(_src2)->__bits[_i]; \
} while (0)
static inline int CPU_COUNT(cpu_set_t *set)
{
size_t i;
int count = 0;
for (i=0; i < _NCPUWORDS; 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 < _NCPUWORDS; 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 < _NCPUWORDS; i++)
if (set->__bits[i] != 0 )
return 0;
return 1;
}
#endif
More information about the devel
mailing list