[PATCH v2 02/15] score: Add processor mask to/from cpu_set_t

Gedare Bloom gedare at rtems.org
Sun Jul 9 11:49:53 UTC 2017


On Fri, Jul 7, 2017 at 9:54 AM, Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
> Update #3059.
> ---
>  cpukit/score/Makefile.am                         |  1 +
>  cpukit/score/include/rtems/score/processormask.h | 52 +++++++++++++++-
>  cpukit/score/src/processormaskcopy.c             | 75 ++++++++++++++++++++++++
>  3 files changed, 126 insertions(+), 2 deletions(-)
>  create mode 100644 cpukit/score/src/processormaskcopy.c
>
> diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am
> index 46b441737f..1ac7c1545c 100644
> --- a/cpukit/score/Makefile.am
> +++ b/cpukit/score/Makefile.am
> @@ -354,6 +354,7 @@ libscore_a_SOURCES += src/semaphore.c
>  libscore_a_SOURCES += src/smpbarrierwait.c
>  libscore_a_SOURCES += src/kern_tc.c
>  libscore_a_SOURCES += src/libatomic.c
> +libscore_a_SOURCES += src/processormaskcopy.c
>
>  EXTRA_DIST = src/Unlimited.txt
>
> diff --git a/cpukit/score/include/rtems/score/processormask.h b/cpukit/score/include/rtems/score/processormask.h
> index ebf19ca035..27c35d38f1 100644
> --- a/cpukit/score/include/rtems/score/processormask.h
> +++ b/cpukit/score/include/rtems/score/processormask.h
> @@ -25,8 +25,7 @@
>
>  #include <rtems/score/cpu.h>
>
> -#include <sys/_bitset.h>
> -#include <sys/bitset.h>
> +#include <sys/cpuset.h>
>
>  #ifdef __cplusplus
>  extern "C" {
> @@ -105,6 +104,55 @@ RTEMS_INLINE_ROUTINE uint32_t _Processor_mask_To_uint32_t(
>    return (uint32_t) (bits >> (32 * (index % _BITSET_BITS) / 32));
>  }
>
> +typedef enum {
> +  PROCESSOR_MASK_COPY_LOSSLESS,
> +  PROCESSOR_MASK_COPY_PARTIAL_LOSS,
> +  PROCESSOR_MASK_COPY_COMPLETE_LOSS,
> +  PROCESSOR_MASK_COPY_INVALID_SIZE
> +} Processor_mask_Copy_status;
> +
> +RTEMS_INLINE_ROUTINE bool _Processor_mask_Is_at_most_partial_loss(
> +  Processor_mask_Copy_status status
> +)
> +{
> +  return (unsigned int) status <= PROCESSOR_MASK_COPY_PARTIAL_LOSS;
> +}
> +
> +Processor_mask_Copy_status _Processor_mask_Copy(
> +  long       *dst,
> +  size_t      dst_size,
> +  const long *src,
> +  size_t      src_size
> +);
> +
> +RTEMS_INLINE_ROUTINE Processor_mask_Copy_status _Processor_mask_To_cpu_set_t(
> +  const Processor_mask *src,
> +  size_t                dst_size,
> +  cpu_set_t            *dst
> +)
> +{
> +  return _Processor_mask_Copy(
> +    &dst->__bits[ 0 ],
> +    dst_size,
> +    &src->__bits[ 0 ],
> +    sizeof( *src )
> +  );
> +}
> +
> +RTEMS_INLINE_ROUTINE Processor_mask_Copy_status _Processor_mask_From_cpu_set_t(
> +  Processor_mask  *dst,
> +  size_t           src_size,
> +  const cpu_set_t *src
> +)
> +{
> +  return _Processor_mask_Copy(
> +    &dst->__bits[ 0 ],
> +    sizeof( *dst ),
> +    &src->__bits[ 0 ],
> +    src_size
> +  );
> +}
> +
>  /** @} */
>
>  #ifdef __cplusplus
> diff --git a/cpukit/score/src/processormaskcopy.c b/cpukit/score/src/processormaskcopy.c
> new file mode 100644
> index 0000000000..bf8082d3c4
> --- /dev/null
> +++ b/cpukit/score/src/processormaskcopy.c
> @@ -0,0 +1,75 @@
> +/**
> + * @file
> + *
> + * @brief Processor Mask Implementation
> + *
> + * @ingroup ScoreProcessorMask
> + */
> +
> +/*
> + * Copyright (c) 2017 embedded brains GmbH.  All rights reserved.
> + *
> + *  embedded brains GmbH
> + *  Dornierstr. 4
> + *  82178 Puchheim
> + *  Germany
> + *  <rtems at embedded-brains.de>
> + *
> + * The license and distribution terms for this file may be
> + * found in the file LICENSE in this distribution or at
> + * http://www.rtems.org/license/LICENSE.
> + */
> +
> +#if HAVE_CONFIG_H
> +#include "config.h"
> +#endif
> +
> +#include <rtems/score/processormask.h>
> +
> +Processor_mask_Copy_status _Processor_mask_Copy(
> +  long       *dst,
> +  size_t      dst_size,
> +  const long *src,
> +  size_t      src_size
> +)
> +{
> +  long inclusive = 0;
> +  long exclusive = 0;
> +
> +  if ( ( dst_size | src_size ) % sizeof( long ) != 0 ) {
> +    return PROCESSOR_MASK_COPY_INVALID_SIZE;
> +  }

Why is this specified in terms of long when the bit maps are defined
in terms of uint32_t?

> +
> +  while ( dst_size > 0 && src_size > 0 ) {
> +    long bits = *src;
> +
> +    inclusive |= bits;
> +    *dst = bits;
> +    ++dst;
> +    ++src;
> +    dst_size -= sizeof( long );
> +    src_size -= sizeof( long );
> +  }
> +
> +  while ( dst_size > 0 ) {
> +    *dst = 0;
> +    ++dst;
> +    dst_size -= sizeof( long );
> +  }
> +
> +  while ( src_size > 0 ) {
> +    exclusive |= *src;
> +    ++src;
> +    src_size -= sizeof( long );
> +  }
> +
> +  if ( exclusive != 0 ) {
> +    if ( inclusive != 0 ) {
> +      return PROCESSOR_MASK_COPY_PARTIAL_LOSS;
> +    } else {
> +      return PROCESSOR_MASK_COPY_COMPLETE_LOSS;
> +    }
> +  }
> +
> +  return PROCESSOR_MASK_COPY_LOSSLESS;
> +}
> --
> 2.12.3
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel


More information about the devel mailing list