From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-3.9 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.1 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 8C2BB208F4 for ; Mon, 16 Jul 2018 21:19:38 +0000 (UTC) From: Eric Wong To: mwrap-public@80x24.org Subject: [PATCH 11/19] alias Mwrap.clear to Mwrap.reset Date: Mon, 16 Jul 2018 21:19:25 +0000 Message-Id: <20180716211933.5835-12-e@80x24.org> In-Reply-To: <20180716211933.5835-1-e@80x24.org> References: <20180716211933.5835-1-e@80x24.org> List-Id: It is not safe to use the new Mwrap[] method with Mwrap.clear, and the rcu_head overhead in src_loc structs was not worth it. --- ext/mwrap/mwrap.c | 56 ++++++++--------------------------------------- 1 file changed, 9 insertions(+), 47 deletions(-) diff --git a/ext/mwrap/mwrap.c b/ext/mwrap/mwrap.c index 1216c44..729e3a8 100644 --- a/ext/mwrap/mwrap.c +++ b/ext/mwrap/mwrap.c @@ -185,7 +185,6 @@ static int has_ec_p(void) /* allocated via real_malloc/real_free */ struct src_loc { - struct rcu_head rcu_head; pthread_mutex_t *mtx; size_t calls; size_t total; @@ -667,49 +666,6 @@ static VALUE mwrap_dump(int argc, VALUE * argv, VALUE mod) return Qnil; } -static void -free_src_loc(struct rcu_head *head) -{ - struct src_loc *l = caa_container_of(head, struct src_loc, rcu_head); - real_free(l); -} - -static void *totals_clear(void *ign) -{ - struct cds_lfht *new, *old; - struct cds_lfht_iter iter; - struct src_loc *l; - - new = lfht_new(); - rcu_read_lock(); - old = rcu_dereference(totals); - rcu_assign_pointer(totals, new); - cds_lfht_for_each_entry(old, &iter, l, hnode) { - cds_lfht_del(old, &l->hnode); - call_rcu(&l->rcu_head, free_src_loc); - } - rcu_read_unlock(); - - synchronize_rcu(); /* ensure totals points to new */ - cds_lfht_destroy(old, NULL); - return 0; -} - -/* - * call-seq: - * - * Mwrap.clear -> nil - * - * Atomically replaces the totals table and destroys the old one. - * This resets all statistics. It is more expensive than `Mwrap.reset' - * as new allocations will need to be made to repopulate the new table. - */ -static VALUE mwrap_clear(VALUE mod) -{ - rb_thread_call_without_gvl(totals_clear, 0, 0, 0); - return Qnil; -} - static void *totals_reset(void *ign) { struct cds_lfht *t; @@ -732,8 +688,8 @@ static void *totals_reset(void *ign) * Mwrap.reset -> nil * * Resets the the total tables by zero-ing all counters. - * This resets all statistics and is less costly than `Mwrap.clear' - * but is not an atomic operation. + * This resets all statistics. This is not an atomic operation + * as other threads (outside of GVL) may increment counters. */ static VALUE mwrap_reset(VALUE mod) { @@ -741,6 +697,12 @@ static VALUE mwrap_reset(VALUE mod) return Qnil; } +/* :nodoc: */ +static VALUE mwrap_clear(VALUE mod) +{ + return mwrap_reset(mod); +} + static VALUE rcu_unlock_ensure(VALUE ignored) { rcu_read_unlock(); @@ -944,8 +906,8 @@ void Init_mwrap(void) cSrcLoc = rb_define_class_under(mod, "SourceLocation", rb_cObject); rb_define_singleton_method(mod, "dump", mwrap_dump, -1); - rb_define_singleton_method(mod, "clear", mwrap_clear, 0); rb_define_singleton_method(mod, "reset", mwrap_reset, 0); + rb_define_singleton_method(mod, "clear", mwrap_clear, 0); rb_define_singleton_method(mod, "each", mwrap_each, -1); rb_define_singleton_method(mod, "[]", mwrap_aref, 1); rb_define_method(cSrcLoc, "each", src_loc_each, 0); -- EW