From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.1 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id E3C721FAF1 for ; Mon, 19 Dec 2022 11:19:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1671448764; bh=Fs8V34l8fsXRg6Tq56Mh0lsQsNCx74V3nHmKZNU8w5I=; h=From:To:Subject:Date:In-Reply-To:References:From; b=3lQDqXYUt2oFu/Q4gWA+dvi6XfGhUJA29+3wMgCrmV78lbmv+2ZtxskkC8oTbPGRT 6Q37GyU1MRRDMw5j0MeQPTsRTWqg5JsylQ9YeouTt5COyBPDkvLye9NtKQq1sgmwme BS8aMd9dOIrp7mpQCtAl6ZyFbPXyfltMVhcR4UxU= From: Eric Wong To: mwrap-perl@80x24.org Subject: [PATCH 4/7] calloc: consolidate ENOMEM handling Date: Mon, 19 Dec 2022 11:19:19 +0000 Message-Id: <20221219111922.1079128-5-e@80x24.org> In-Reply-To: <20221219111922.1079128-1-e@80x24.org> References: <20221219111922.1079128-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: From: Eric Wong We can simplify the error paths in calloc and call memset() outside of the RCU critical section. --- mwrap_core.h | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/mwrap_core.h b/mwrap_core.h index b382018..14e5d79 100644 --- a/mwrap_core.h +++ b/mwrap_core.h @@ -662,8 +662,7 @@ void *malloc(size_t size) p = hdr2ptr(h); } update_stats_rcu_unlock(l); - if (caa_unlikely(!p)) errno = ENOMEM; - return p; + if (p) return p; enomem: errno = ENOMEM; return 0; @@ -674,14 +673,10 @@ void *calloc(size_t nmemb, size_t size) size_t asize; size_t generation = 0; - if (__builtin_mul_overflow(size, nmemb, &size)) { - errno = ENOMEM; - return 0; - } - if (__builtin_add_overflow(size, sizeof(struct alloc_hdr), &asize)) { - errno = ENOMEM; - return 0; - } + if (__builtin_mul_overflow(size, nmemb, &size)) + goto enomem; + if (__builtin_add_overflow(size, sizeof(struct alloc_hdr), &asize)) + goto enomem; struct alloc_hdr *h; SRC_LOC_BT(bt); struct src_loc *l = update_stats_rcu_lock(&generation, size, &bt.sl); @@ -689,11 +684,12 @@ void *calloc(size_t nmemb, size_t size) if (p) { alloc_insert_rcu(l, h, size, h, generation); p = hdr2ptr(h); - memset(p, 0, size); } update_stats_rcu_unlock(l); - if (caa_unlikely(!p)) errno = ENOMEM; - return p; + if (p) return memset(p, 0, size); +enomem: + errno = ENOMEM; + return 0; } void *realloc(void *ptr, size_t size)