summaryrefslogtreecommitdiff
path: root/erts/emulator/beam/erl_ptab.h
diff options
context:
space:
mode:
Diffstat (limited to 'erts/emulator/beam/erl_ptab.h')
-rw-r--r--erts/emulator/beam/erl_ptab.h75
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);