From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.2 required=3.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 6854C1F55F for ; Sat, 16 Sep 2023 13:10:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1694869852; bh=sbZJ/2gaQnGnDW9jhY5wM/wZX16+YrZdzy2skPctZfg=; h=Date:From:To:Subject:References:In-Reply-To:From; b=o5+sSnND9qGs2JiH1UOrOMx1n/v60xRAANM70gSMqpQE7gEpd0QB+OuHhbeBEjj4w rVyRVfmHT8toEKbf0JVxo8/yAo0TSXCe7rFbgK0sXhHJAIchSSs/v9Y2AKda12nvml 1WUOJWrw53CKaS8smqVtTyUiHXNMd43THban37TM= Date: Sat, 16 Sep 2023 13:10:52 +0000 From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] xap_helper: test cleanup + throw support in C++ Message-ID: <20230916131052.M335143@dcvr> References: <20230909120142.1041752-1-e@80x24.org> <20230909120142.1041752-7-e@80x24.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20230909120142.1041752-7-e@80x24.org> List-Id: Eric Wong wrote: > In case somebody reviewing this code gets curious. And just in case we encounter other C++ implementations: -------8<------- Subject: [PATCH] xap_helper: test cleanup + throw support in C++ We need to ensure whatever C++ compiler gets used supports this GNU extension as we expect it to. clang 13 and 14 and g++ 10 all work as we expect it to. --- side note: sadly, longjmp/siglongjmp(3) in POSIX does not trigger __cleanup__ lib/PublicInbox/xap_helper.h | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/PublicInbox/xap_helper.h b/lib/PublicInbox/xap_helper.h index 2322d062..377ff45a 100644 --- a/lib/PublicInbox/xap_helper.h +++ b/lib/PublicInbox/xap_helper.h @@ -578,12 +578,27 @@ static bool cmd_dump_roots(struct req *req) return true; } -// internal usage only +// for test usage only, we need to ensure the compiler supports +// __cleanup__ when exceptions are thrown +struct inspect { struct req *req; }; + +static void inspect_ensure(struct inspect *x) +{ + fprintf(x->req->fp[0], "pid=%d has_threadid=%d", + (int)getpid(), has_threadid(x->req->srch) ? 1 : 0); +} + static bool cmd_test_inspect(struct req *req) { - fprintf(req->fp[0], "pid=%d has_threadid=%d", - (int)getpid(), has_threadid(req->srch) ? 1 : 0); - return true; + __attribute__((__cleanup__(inspect_ensure))) struct inspect x; + x.req = req; + try { + throw Xapian::InvalidArgumentError("test"); + } catch (Xapian::InvalidArgumentError) { + return true; + } + fputs("this should not be printed", req->fp[0]); + return false; } #define CMD(n) { .fn_len = sizeof(#n) - 1, .fn_name = #n, .fn = cmd_##n }