aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/erl_db_util.h
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2019-03-15 16:08:04 +0100
committerSverker Eriksson <[email protected]>2019-03-15 16:08:04 +0100
commit80f103c64904b29e2f3d880148dd5b032cae0c02 (patch)
tree9ceb7fe8c4c65204c8d7f59e7b0260c321ee7c3b /erts/emulator/beam/erl_db_util.h
parent702ef9b0fa0a9b7345e3b397f23d8a76a2ac4df2 (diff)
parent0d550c80d4f19cc432e7de056169695d436c02a0 (diff)
downloadotp-80f103c64904b29e2f3d880148dd5b032cae0c02.tar.gz
otp-80f103c64904b29e2f3d880148dd5b032cae0c02.tar.bz2
otp-80f103c64904b29e2f3d880148dd5b032cae0c02.zip
Merge branch 'sverker/ets-select-fixation-owner-change-bug/OTP-15672'
* sverker/ets-select-fixation-owner-change-bug/OTP-15672: erts: Fix ets:select table fixation leak at owner change erts: Refactor common things into traverse_context_t stdlib: Clarify docs for ets:info(_, safe_fixed)
Diffstat (limited to 'erts/emulator/beam/erl_db_util.h')
-rw-r--r--erts/emulator/beam/erl_db_util.h35
1 files changed, 26 insertions, 9 deletions
diff --git a/erts/emulator/beam/erl_db_util.h b/erts/emulator/beam/erl_db_util.h
index e1af9210ea..e3d3c0e804 100644
--- a/erts/emulator/beam/erl_db_util.h
+++ b/erts/emulator/beam/erl_db_util.h
@@ -101,6 +101,14 @@ typedef struct {
} u;
} DbUpdateHandle;
+/* How safe are we from double-hits or missed objects
+ * when iterating without fixation?
+ */
+enum DbIterSafety {
+ ITER_UNSAFE, /* Must fixate to be safe */
+ ITER_SAFE_LOCKED, /* Safe while table is locked, not between trap calls */
+ ITER_SAFE /* No need to fixate at all */
+};
typedef struct db_table_method
{
@@ -150,44 +158,53 @@ typedef struct db_table_method
Eterm pattern,
Sint chunk_size,
int reverse,
- Eterm* ret);
+ Eterm* ret,
+ enum DbIterSafety);
int (*db_select)(Process* p,
DbTable* tb, /* [in out] */
Eterm tid,
Eterm pattern,
int reverse,
- Eterm* ret);
+ Eterm* ret,
+ enum DbIterSafety);
int (*db_select_delete)(Process* p,
DbTable* tb, /* [in out] */
Eterm tid,
Eterm pattern,
- Eterm* ret);
+ Eterm* ret,
+ enum DbIterSafety);
int (*db_select_continue)(Process* p,
DbTable* tb, /* [in out] */
Eterm continuation,
- Eterm* ret);
+ Eterm* ret,
+ enum DbIterSafety*);
int (*db_select_delete_continue)(Process* p,
DbTable* tb, /* [in out] */
Eterm continuation,
- Eterm* ret);
+ Eterm* ret,
+ enum DbIterSafety*);
int (*db_select_count)(Process* p,
DbTable* tb, /* [in out] */
Eterm tid,
Eterm pattern,
- Eterm* ret);
+ Eterm* ret,
+ enum DbIterSafety);
int (*db_select_count_continue)(Process* p,
DbTable* tb, /* [in out] */
Eterm continuation,
- Eterm* ret);
+ Eterm* ret,
+ enum DbIterSafety*);
int (*db_select_replace)(Process* p,
DbTable* tb, /* [in out] */
Eterm tid,
Eterm pattern,
- Eterm* ret);
+ Eterm* ret,
+ enum DbIterSafety);
int (*db_select_replace_continue)(Process* p,
DbTable* tb, /* [in out] */
Eterm continuation,
- Eterm* ret);
+ Eterm* ret,
+ enum DbIterSafety*);
int (*db_take)(Process *, DbTable *, Eterm, Eterm *);
SWord (*db_delete_all_objects)(Process* p, DbTable* db, SWord reds);