On 2013-10-15 16:26, Joel Sherrill wrote:
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?
I prefer inline functions for all function-like macros provided they have no
use case for static initialization.
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?
It should be inside.
--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@rtems.org
>>http://www.rtems.org/mailman/listinfo/rtems-devel
>>
>
>
-- Joel Sherrill, Ph.D. Director of Research & Development
joel.sherr...@oarcorp.com On-Line Applications Research Ask me about RTEMS: a
free RTOS Huntsville AL 35805 Support Available (256) 722-9985
cpuset.h
/*
* 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
*<i...@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
I would use
#ifndef CPU_SETSIZE
#define CPU_SETSIZE 32
#endif
so that a user can change the default size.
I would use uint32_t instead of long. We may need the ability to statically
initialize such sets. One use case could be the RTEMS configuration table for
SMP. Currently we can only say, that we want to run on N processors 0 up to N
- 1. This should be more flexible, e.g. we want to run on processors B, C and
E, but not A and D.
#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)
I would use memset() in the the above functions to make it a bit easier for the
compiler to optimize this.
#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)
We should use the const qualifier if possible.
{
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;
}
I would use memcmp() here.
#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
_______________________________________________
rtems-devel mailing list
rtems-devel@rtems.org
http://www.rtems.org/mailman/listinfo/rtems-devel
--
Sebastian Huber, embedded brains GmbH
Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone : +49 89 189 47 41-16
Fax : +49 89 189 47 41-09
E-Mail : sebastian.hu...@embedded-brains.de
PGP : Public key available on request.
Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
_______________________________________________
rtems-devel mailing list
rtems-devel@rtems.org
http://www.rtems.org/mailman/listinfo/rtems-devel