diff options
author | Sverker Eriksson <[email protected]> | 2018-10-11 23:34:49 +0200 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2018-10-23 12:36:28 +0200 |
commit | 129e61564807c0ad43faf9d0c36260c793501920 (patch) | |
tree | 26822017b645e14403c5e7989d9a4d536217e063 /erts/emulator/beam/erl_db_catree.c | |
parent | 375a1f5c29fd2d3b537e117149e78b0ac61e263f (diff) | |
download | otp-129e61564807c0ad43faf9d0c36260c793501920.tar.gz otp-129e61564807c0ad43faf9d0c36260c793501920.tar.bz2 otp-129e61564807c0ad43faf9d0c36260c793501920.zip |
erts: Add erts_debug feature 'ets_force_split'
to easier generate a routing tree for test
without having to spend cpu to provoke actual repeated lock conflicts.
Diffstat (limited to 'erts/emulator/beam/erl_db_catree.c')
-rw-r--r-- | erts/emulator/beam/erl_db_catree.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/erts/emulator/beam/erl_db_catree.c b/erts/emulator/beam/erl_db_catree.c index f467230ced..975e19a878 100644 --- a/erts/emulator/beam/erl_db_catree.c +++ b/erts/emulator/beam/erl_db_catree.c @@ -885,7 +885,8 @@ static DbTableCATreeNode *create_base_node(DbTableCATree *tb, "erl_db_catree_base_node", lc_key, ERTS_LOCK_FLAGS_CATEGORY_DB); - p->u.base.lock_statistics = 0; + p->u.base.lock_statistics = ((tb->common.status & DB_CATREE_FORCE_SPLIT) + ? INT_MAX : 0); p->u.base.is_valid = 1; return p; } @@ -1205,7 +1206,8 @@ static void split_catree(DbTableCATree *tb, DbTableCATreeNode* ERTS_RESTRICT new_route; if (less_than_two_elements(base->u.base.root)) { - base->u.base.lock_statistics = 0; + if (!(tb->common.status & DB_CATREE_FORCE_SPLIT)) + base->u.base.lock_statistics = 0; wunlock_base_node(&base->u.base); return; } else { @@ -2118,6 +2120,25 @@ void erts_lcnt_enable_db_catree_lock_count(DbTableCATree *tb, int enable) } #endif /* ERTS_ENABLE_LOCK_COUNT */ +void db_catree_force_split(DbTableCATree* tb, int on) +{ + CATreeRootIterator iter; + TreeDbTerm** root; + + init_root_iterator(tb, &iter, 1); + root = catree_find_first_root(&iter); + do { + iter.locked_bnode->lock_statistics = (on ? INT_MAX : 0); + root = catree_find_next_root(&iter); + } while (root); + ASSERT(!iter.locked_bnode); + + if (on) + tb->common.status |= DB_CATREE_FORCE_SPLIT; + else + tb->common.status &= ~DB_CATREE_FORCE_SPLIT; +} + void db_calc_stats_catree(DbTableCATree* tb, DbCATreeStats* stats) { DbTableCATreeNode* stack[ERL_DB_CATREE_MAX_ROUTE_NODE_LAYER_HEIGHT]; |