> 
> The current location used for __rte_aligned(a) for alignment of types
> and variables is not compatible with MSVC. There is only a single
> location accepted by both toolchains.
> 
> For variables standard C11 offers alignas(a) supported by conformant
> compilers i.e. both MSVC and GCC.
> 
> For types the standard offers no alignment facility that compatibly
> interoperates with C and C++ but may be achieved by relocating the
> placement of __rte_aligned(a) to the aforementioned location accepted
> by all currently supported toolchains.
> 
> To allow alignment for both compilers do the following:
> 
> * Move __rte_aligned from the end of {struct,union} definitions to
>   be between {struct,union} and tag.
> 
>   The placement between {struct,union} and the tag allows the desired
>   alignment to be imparted on the type regardless of the toolchain being
>   used for all of GCC, LLVM, MSVC compilers building both C and C++.
> 
> * Replace use of __rte_aligned(a) on variables/fields with alignas(a).
> 
> Signed-off-by: Tyler Retzlaff <roret...@linux.microsoft.com>
> Acked-by: Morten Brørup <m...@smartsharesystems.com>
> ---
>  lib/ring/rte_ring_core.h    | 16 +++++++++-------
>  lib/ring/rte_ring_peek_zc.h |  4 ++--
>  2 files changed, 11 insertions(+), 9 deletions(-)
> 
> diff --git a/lib/ring/rte_ring_core.h b/lib/ring/rte_ring_core.h
> index b770873..497d535 100644
> --- a/lib/ring/rte_ring_core.h
> +++ b/lib/ring/rte_ring_core.h
> @@ -19,6 +19,8 @@
>   * instead.
>   */
> 
> +#include <stdalign.h>
> +
>  #ifdef __cplusplus
>  extern "C" {
>  #endif
> @@ -78,7 +80,7 @@ struct rte_ring_headtail {
> 
>  union __rte_ring_rts_poscnt {
>       /** raw 8B value to read/write *cnt* and *pos* as one atomic op */
> -     RTE_ATOMIC(uint64_t) raw __rte_aligned(8);
> +     alignas(8) RTE_ATOMIC(uint64_t) raw;

One small question - here and below, would it possible to do 
'alignas(sizeof(uint64_t))' instead of 'alignas(8)?
Or MSVC has some restrictions here?


>       struct {
>               uint32_t cnt; /**< head/tail reference counter */
>               uint32_t pos; /**< head/tail position */
> @@ -94,7 +96,7 @@ struct rte_ring_rts_headtail {
> 

Reply via email to