Eric Wong <e...@80x24.org> 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 }