diff options
Diffstat (limited to 'erts/emulator/beam/erl_ptab.h')
-rw-r--r-- | erts/emulator/beam/erl_ptab.h | 75 |
1 files changed, 20 insertions, 55 deletions
diff --git a/erts/emulator/beam/erl_ptab.h b/erts/emulator/beam/erl_ptab.h index c30a684002..a95b81162a 100644 --- a/erts/emulator/beam/erl_ptab.h +++ b/erts/emulator/beam/erl_ptab.h @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 2012-2018. All Rights Reserved. + * Copyright Ericsson AB 2012-2023. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -101,16 +101,16 @@ typedef struct { typedef struct { erts_atomic_t *tab; - erts_atomic32_t *free_id_data; + erts_atomic_t *free_id_data; Uint32 max; - Uint32 pix_mask; - Uint32 pix_cl_mask; + Uint pix_mask; + Uint pix_cl_mask; + Uint pix_cli_mask; Uint32 pix_cl_shift; - Uint32 pix_cli_mask; Uint32 pix_cli_shift; - Uint32 dix_cl_mask; + Uint dix_cl_mask; + Uint dix_cli_mask; Uint32 dix_cl_shift; - Uint32 dix_cli_mask; Uint32 dix_cli_shift; ErtsPTabElementCommon *invalid_element; Eterm invalid_data; @@ -146,10 +146,10 @@ typedef struct { } r; } ErtsPTab; -#define ERTS_PTAB_ID_DATA_SIZE 28 +#define ERTS_PTAB_ID_DATA_SIZE (ERTS_SIZEOF_TERM*8 - _TAG_IMMED1_SIZE) #define ERTS_PTAB_ID_DATA_SHIFT (_TAG_IMMED1_SIZE) /* ERTS_PTAB_MAX_SIZE must be a power of 2 */ -#define ERTS_PTAB_MAX_SIZE (SWORD_CONSTANT(1) << 27) +#define ERTS_PTAB_MAX_SIZE (UWORD_CONSTANT(1) << 27) #if (ERTS_PTAB_MAX_SIZE-1) > MAX_SMALL # error "The maximum number of processes/ports must fit in a SMALL." #endif @@ -173,7 +173,8 @@ typedef struct { #define ERTS_PTAB_INVALID_ID(TAG) \ ((Eterm) \ - ((((1U << ERTS_PTAB_ID_DATA_SIZE) - 1) << ERTS_PTAB_ID_DATA_SHIFT) \ + ((((UWORD_CONSTANT(1) << ERTS_PTAB_ID_DATA_SIZE) - 1) \ + << ERTS_PTAB_ID_DATA_SHIFT) \ | (TAG))) #define erts_ptab_is_valid_id(ID) \ @@ -202,8 +203,8 @@ ERTS_GLB_INLINE erts_interval_t *erts_ptab_interval(ErtsPTab *ptab); ERTS_GLB_INLINE int erts_ptab_max(ErtsPTab *ptab); ERTS_GLB_INLINE int erts_ptab_count(ErtsPTab *ptab); ERTS_GLB_INLINE Uint erts_ptab_pixdata2data(ErtsPTab *ptab, Eterm pixdata); -ERTS_GLB_INLINE Uint32 erts_ptab_pixdata2pix(ErtsPTab *ptab, Eterm pixdata); -ERTS_GLB_INLINE Uint32 erts_ptab_data2pix(ErtsPTab *ptab, Eterm data); +ERTS_GLB_INLINE Uint erts_ptab_pixdata2pix(ErtsPTab *ptab, Eterm pixdata); +ERTS_GLB_INLINE Uint erts_ptab_data2pix(ErtsPTab *ptab, Eterm data); ERTS_GLB_INLINE Uint erts_ptab_data2pixdata(ErtsPTab *ptab, Eterm data); ERTS_GLB_INLINE Eterm erts_ptab_make_id(ErtsPTab *ptab, Eterm data, Eterm tag); ERTS_GLB_INLINE int erts_ptab_id2pix(ErtsPTab *ptab, Eterm id); @@ -264,21 +265,21 @@ erts_ptab_count(ErtsPTab *ptab) ERTS_GLB_INLINE Uint erts_ptab_pixdata2data(ErtsPTab *ptab, Eterm pixdata) { - Uint32 data = ((Uint32) pixdata) & ~ptab->r.o.pix_mask; + Uint data = ((Uint) pixdata) & ~ptab->r.o.pix_mask; data |= (pixdata >> ptab->r.o.pix_cl_shift) & ptab->r.o.pix_cl_mask; data |= (pixdata & ptab->r.o.pix_cli_mask) << ptab->r.o.pix_cli_shift; return data; } -ERTS_GLB_INLINE Uint32 erts_ptab_pixdata2pix(ErtsPTab *ptab, Eterm pixdata) +ERTS_GLB_INLINE Uint erts_ptab_pixdata2pix(ErtsPTab *ptab, Eterm pixdata) { - return ((Uint32) pixdata) & ptab->r.o.pix_mask; + return ((Uint) pixdata) & ptab->r.o.pix_mask; } -ERTS_GLB_INLINE Uint32 erts_ptab_data2pix(ErtsPTab *ptab, Eterm data) +ERTS_GLB_INLINE Uint erts_ptab_data2pix(ErtsPTab *ptab, Eterm data) { - Uint32 n, pix; - n = (Uint32) data; + Uint n, pix; + n = (Uint) data; pix = ((n & ptab->r.o.pix_cl_mask) << ptab->r.o.pix_cl_shift); pix += ((n >> ptab->r.o.pix_cli_shift) & ptab->r.o.pix_cli_mask); ASSERT(0 <= pix && pix < ptab->r.o.max); @@ -293,43 +294,11 @@ ERTS_GLB_INLINE Uint erts_ptab_data2pixdata(ErtsPTab *ptab, Eterm data) return pixdata; } -#if ERTS_SIZEOF_TERM == 8 - -ERTS_GLB_INLINE Eterm -erts_ptab_make_id(ErtsPTab *ptab, Eterm data, Eterm tag) -{ - HUint huint; - Uint32 low_data = (Uint32) data; - low_data &= (1 << ERTS_PTAB_ID_DATA_SIZE) - 1; - low_data <<= ERTS_PTAB_ID_DATA_SHIFT; - huint.hval[ERTS_HUINT_HVAL_HIGH] = erts_ptab_data2pix(ptab, data); - huint.hval[ERTS_HUINT_HVAL_LOW] = low_data | ((Uint32) tag); - return (Eterm) huint.val; -} - -ERTS_GLB_INLINE int -erts_ptab_id2pix(ErtsPTab *ptab, Eterm id) -{ - HUint huint; - huint.val = id; - return (int) huint.hval[ERTS_HUINT_HVAL_HIGH]; -} - -ERTS_GLB_INLINE Uint -erts_ptab_id2data(ErtsPTab *ptab, Eterm id) -{ - HUint huint; - huint.val = id; - return (Uint) (huint.hval[ERTS_HUINT_HVAL_LOW] >> ERTS_PTAB_ID_DATA_SHIFT); -} - -#elif ERTS_SIZEOF_TERM == 4 - ERTS_GLB_INLINE Eterm erts_ptab_make_id(ErtsPTab *ptab, Eterm data, Eterm tag) { Eterm id; - data &= ((1 << ERTS_PTAB_ID_DATA_SIZE) - 1); + data &= ((UWORD_CONSTANT(1) << ERTS_PTAB_ID_DATA_SIZE) - 1); id = (Eterm) erts_ptab_data2pixdata(ptab, data); return (id << ERTS_PTAB_ID_DATA_SHIFT) | tag; } @@ -350,10 +319,6 @@ erts_ptab_id2data(ErtsPTab *ptab, Eterm id) return erts_ptab_pixdata2data(ptab, pixdata); } -#else -#error "Unsupported size of term" -#endif - ERTS_GLB_INLINE erts_aint_t erts_ptab_pix2intptr_nob(ErtsPTab *ptab, int ix) { ASSERT(0 <= ix && ix < ptab->r.o.max); |