aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/erl_db_util.h
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2017-02-21 16:07:50 +0100
committerSverker Eriksson <[email protected]>2017-03-22 15:27:17 +0100
commitb174a38c5f09859d3714fe5a81773aa5f2d19417 (patch)
treed2ca3cd2943d5b2e62cf69b919c617e3b2f1d053 /erts/emulator/beam/erl_db_util.h
parent832091f4dbf27c8bdc572383cbdeba5307d8e41c (diff)
downloadotp-b174a38c5f09859d3714fe5a81773aa5f2d19417.tar.gz
otp-b174a38c5f09859d3714fe5a81773aa5f2d19417.tar.bz2
otp-b174a38c5f09859d3714fe5a81773aa5f2d19417.zip
erts: Replace meta_pid_to{_fixed}_tab with linked lists
from process psd through all owned/fixed tables. As meta_pid_to{_fixed}_tab maps to slot in meta_main_tab which is planned for destruction. In this commit we no longer seize table lock while freeing the table (free_table_cont) as it's not needed and makes the code a bit simpler. Any concurrent operation on the table will only access lock, owner and status and then bail out.
Diffstat (limited to 'erts/emulator/beam/erl_db_util.h')
-rw-r--r--erts/emulator/beam/erl_db_util.h20
1 files changed, 16 insertions, 4 deletions
diff --git a/erts/emulator/beam/erl_db_util.h b/erts/emulator/beam/erl_db_util.h
index 3c13035ec5..673ec80604 100644
--- a/erts/emulator/beam/erl_db_util.h
+++ b/erts/emulator/beam/erl_db_util.h
@@ -195,9 +195,20 @@ typedef struct db_table_method
} DbTableMethod;
typedef struct db_fixation {
- Eterm pid;
+ /* Node in fixed_tabs list */
+ struct {
+ struct db_fixation *next, *prev;
+ Binary* btid;
+ } tabs;
+
+ /* Node in fixing_procs tree */
+ struct {
+ struct db_fixation *left, *right, *parent;
+ int is_red;
+ Process* p;
+ } procs;
+
Uint counter;
- struct db_fixation *next;
} DbFixation;
typedef struct {
@@ -217,9 +228,10 @@ typedef struct db_table_common {
erts_smp_refc_t refc; /* reference count of table struct */
erts_smp_refc_t fix_count;/* fixation counter */
DbTableList all;
+ DbTableList owned;
#ifdef ERTS_SMP
erts_smp_rwmtx_t rwlock; /* rw lock on table */
- erts_smp_mtx_t fixlock; /* Protects fixations,megasec,sec,microsec */
+ erts_smp_mtx_t fixlock; /* Protects fixing_procs and time */
int is_thread_safe; /* No fine locking inside table needed */
Uint32 type; /* table type, *read only* after creation */
#endif
@@ -237,7 +249,7 @@ typedef struct db_table_common {
ErtsMonotonicTime monotonic;
ErtsMonotonicTime offset;
} time;
- DbFixation* fixations; /* List of processes who have done safe_fixtable,
+ DbFixation* fixing_procs; /* Tree of processes who have done safe_fixtable,
"local" fixations not included. */
/* All 32-bit fields */
Uint32 status; /* bit masks defined below */