diff options
author | Sverker Eriksson <[email protected]> | 2018-03-12 11:50:42 +0100 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2018-05-08 14:38:41 +0200 |
commit | 3ab4ac0371b8646246c8b029dd89f39c3a6981b4 (patch) | |
tree | 2a1f87590829ec2a82d16f6afe2d604f0e8fa300 /erts/emulator/beam/erl_db_tree.c | |
parent | c26bfdd48c8deabe9cc0f67badb0d8a95a641845 (diff) | |
download | otp-3ab4ac0371b8646246c8b029dd89f39c3a6981b4.tar.gz otp-3ab4ac0371b8646246c8b029dd89f39c3a6981b4.tar.bz2 otp-3ab4ac0371b8646246c8b029dd89f39c3a6981b4.zip |
erts: Make atomic ets:delete_all_objects yield
by using a cooperative strategy that will make
any process accessing the table execute delelete_all_objects_continue
until the table is empty.
This is not an optimal solution as concurrent threads will still
block on the table lock, but at least thread progress is made.
Diffstat (limited to 'erts/emulator/beam/erl_db_tree.c')
-rw-r--r-- | erts/emulator/beam/erl_db_tree.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/erts/emulator/beam/erl_db_tree.c b/erts/emulator/beam/erl_db_tree.c index 5a276b9d88..5ef5451289 100644 --- a/erts/emulator/beam/erl_db_tree.c +++ b/erts/emulator/beam/erl_db_tree.c @@ -436,7 +436,7 @@ static void db_foreach_offheap_tree(DbTable *, void (*)(ErlOffHeap *, void *), void *); -static int db_delete_all_objects_tree(Process* p, DbTable* tbl); +static SWord db_delete_all_objects_tree(Process* p, DbTable* tbl, SWord reds); #ifdef HARDDEBUG static void db_check_table_tree(DbTable *tbl); @@ -2023,12 +2023,14 @@ static SWord db_free_table_continue_tree(DbTable *tbl, SWord reds) return reds; } -static int db_delete_all_objects_tree(Process* p, DbTable* tbl) +static SWord db_delete_all_objects_tree(Process* p, DbTable* tbl, SWord reds) { - db_free_table_tree(tbl); + reds = db_free_table_continue_tree(tbl, reds); + if (reds < 0) + return reds; db_create_tree(p, tbl); erts_atomic_set_nob(&tbl->tree.common.nitems, 0); - return 0; + return reds; } static void do_db_tree_foreach_offheap(TreeDbTerm *, |