diff options
author | Rickard Green <[email protected]> | 2011-12-16 13:02:09 +0100 |
---|---|---|
committer | Rickard Green <[email protected]> | 2012-04-16 16:32:28 +0200 |
commit | 414f4fb8dc9a188f8148a1f92e5f9125108e170d (patch) | |
tree | 319b52ff0171a0f3bec1deb63407caaefe095ab5 /erts/emulator/beam/erl_node_container_utils.h | |
parent | 3e454414a40bba082e5dc0be310f71843200dcf4 (diff) | |
download | otp-414f4fb8dc9a188f8148a1f92e5f9125108e170d.tar.gz otp-414f4fb8dc9a188f8148a1f92e5f9125108e170d.tar.bz2 otp-414f4fb8dc9a188f8148a1f92e5f9125108e170d.zip |
Optimize process table access
Diffstat (limited to 'erts/emulator/beam/erl_node_container_utils.h')
-rw-r--r-- | erts/emulator/beam/erl_node_container_utils.h | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/erts/emulator/beam/erl_node_container_utils.h b/erts/emulator/beam/erl_node_container_utils.h index 329a2204cc..7b4cb7b042 100644 --- a/erts/emulator/beam/erl_node_container_utils.h +++ b/erts/emulator/beam/erl_node_container_utils.h @@ -128,8 +128,47 @@ extern int erts_use_r9_pids_ports; * Pids * \* */ -#define internal_pid_index(x) (internal_pid_data((x)) \ - & erts_process_tab_index_mask) +#define erts_max_processes erts_proc.max + +typedef struct { + erts_smp_atomic_t *tab; + int max; + int tab_cache_lines; + int pix_per_cache_line; + int pix_cl_mask; + int pix_cl_shift; + int pix_cli_mask; + int pix_cli_shift; +} ErtsProcTab; + +extern ErtsProcTab erts_proc; + +ERTS_GLB_INLINE int erts_pid_data2ix(Eterm pid_data); + +#if ERTS_GLB_INLINE_INCL_FUNC_DEF + +ERTS_GLB_INLINE int erts_pid_data2ix(Eterm pid_data) +{ + int n, pix; + + n = (int) pid_data; + if (erts_proc.pix_cl_mask) { + pix = ((n & erts_proc.pix_cl_mask) << erts_proc.pix_cl_shift); + pix += ((n >> erts_proc.pix_cli_shift) & erts_proc.pix_cli_mask); + } + else { + n %= erts_proc.max; + pix = n % erts_proc.tab_cache_lines; + pix *= erts_proc.pix_per_cache_line; + pix += n / erts_proc.tab_cache_lines; + } + ASSERT(0 <= pix && pix < erts_proc.max); + return pix; +} + +#endif + +#define internal_pid_index(x) erts_pid_data2ix(internal_pid_data((x))) #define internal_pid_node_name(x) (internal_pid_node((x))->sysname) #define external_pid_node_name(x) (external_pid_node((x))->sysname) |