Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w2wy8-000kyK-2q for pgsql-hackers@arkaria.postgresql.org; Wed, 18 Mar 2026 19:54:17 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w2wy7-00DzF2-2T for pgsql-hackers@arkaria.postgresql.org; Wed, 18 Mar 2026 19:54:15 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w2wy7-00DzEr-1A for pgsql-hackers@lists.postgresql.org; Wed, 18 Mar 2026 19:54:15 +0000 Received: from mail-yw1-x1132.google.com ([2607:f8b0:4864:20::1132]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w2wy4-00000000zjP-1EBi for pgsql-hackers@lists.postgresql.org; Wed, 18 Mar 2026 19:54:15 +0000 Received: by mail-yw1-x1132.google.com with SMTP id 00721157ae682-7982c3b7dfcso3973667b3.0 for ; Wed, 18 Mar 2026 12:54:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1773863651; cv=none; d=google.com; s=arc-20240605; b=iZ4Cqu7p/scq8kPE9Li2sgnw3pahBMXOyTE0sQwk+HJNnx9p4Qew2aYu65A4POXTsI /aPpEIPaqqwmUXMnPLA1QH7TUEiyubj9KXBCLaZ2MgCzqJbhvOTravW7I/aXjXKQ5rzB ZHkGonHNNveYL2k0drySGdtoYbLCoEVf2KlfueMeu4L3WL0TZgJ92KTZbewGachD08t3 oZmtnEGf6BDb5t/JxPyej+muPmag5tX1kOOUf3el9B3YcgqrxbXFflYnxhYWDcoJzOTW ktMVaAMU7MQw7XhjROO0Yh9KqapwB/G1D/jMnEJJ7sltA2YN82TXd+HFuX9Cgnfc9kXK C1SA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=8nLpoM+O5u0/esObBnEOOWwkKk5XWewhFoGHV3w0mNE=; fh=ynqNpQgw01++cmtPgZ1E28nKs/Kbq2wxdvheqDfPvbk=; b=Tb+T38RnS1bu+o05kJgE9nYaF001f5qd2cQIQxRbQCyOdE6GUWyRrw7252nrg10U2+ RVjiYG4sHxsrW7JfNqQmkURNlhWXfzdgAF6NlLN4g4ARDjbYsy+bH10bkwnNKNedwrXF 5oBpCMmKOW38rM5Zsqx6VCsQ2j0gKFaFI2Rf9vm/BWbMq1nWkiT62xl8MvJpKapBZSNF y9XlagVT5amNFpBZvP2EcWembG+yMzdL8xNSWJqxX/PTDHls6B52c5za4OJlPAjjOPsA G991Mvef+Xl3OuL23PAd24xEWKfbMnTvxNkCTUnJfulJEZLibmuK9HfX131Wfxrs3y3K ZgIw==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=percona.com; s=google; t=1773863651; x=1774468451; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=8nLpoM+O5u0/esObBnEOOWwkKk5XWewhFoGHV3w0mNE=; b=TWKyuuGf1bYJ5pDiPZNpr5ZUbLkLrknHJ8CVhOFnHUv56DHzBSUPrXxu8sRbSPcs4z +d0BEGyDXbxDySKiK9hEdFxr2dYGTSvFWtkhqVfTVZAKTGElt9Wqo/f9IxT9weILt9d+ QyQ3TZSZphkOzAyFYl7TNG2XMNzQn+pbeEpZI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773863651; x=1774468451; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=8nLpoM+O5u0/esObBnEOOWwkKk5XWewhFoGHV3w0mNE=; b=cAefF7LgIUI1IEaNobOpO30f7jC1t2bewMwrIMdLq0zijm2py19yLPQmzL3QZIwru5 yUePaWUnVaIeV53FLK37TlHx4eJOyAYpsXzdGx4fCnbROUgy/7vJ442QOobXbDzQl/ZD Alhv+P9taQ8T4k3GQOhyCZIbaZwP4tkexOjCxonBX8CzsKk6DBZq8/HdWgyceefk76lF 4qgDRyz6ZHbj7ur9cmLIbuiWcwpRsi37A8+WgRmvNtQYYuekHzRtsLloBG/P8aeOBVLd MLSxxtYermAazk3pXsh3YlxtKoPVTbXWn24CEnpuUYSLIEkPThFrUmMoxN6WkDl5ZHBV vk5g== X-Forwarded-Encrypted: i=1; AJvYcCW9IXuDCsvI3WFk5CN/do0LbeLBfk6Ui7h0jJb+8VXDMC9L1OM+s7R7DXA6HSjbXBVdqC4Tb7NUu2ODMMq9@lists.postgresql.org X-Gm-Message-State: AOJu0Yx/dduoeHKPXl+5YMsv9FCqc2MW9HljXybV1PxsGpcESYc84EdF Yc631zLYO4K/JmpxCwO/RDintDsW21oir+ZRRTuaw7M9B39dSHhCKSjavRcZbg7ydL90zbYbOpS lFFc4j82R1U9ia8ATS1jkmX9mvYILluIj72tBIIzjvUsYn2AECKyTfWFMRuqVJSoY9D6pu/wnrR 9ZZ8Yvv98qQQC4rdmxb1Fkzmsa4csSsL7jDDZY/2//aQ11nPtmvrmGYK8fpKTr0lpblZBZ4Pfn1 V0/oa8CKlYVFaPZ4aZjleD+/kuv2WjQCQnWowqbPrv3XcMktDMePABGarFO3Ih0MQw= X-Gm-Gg: ATEYQzwc+GuHnsAnC4UAO+VyvP02Eco+eg47Fx62tQCR7oZvfmcyD6oKyoHbGdTBio4 CyJS6MuTBQ1jIPdHNTFAF6fcnY68rsd3lzmlGm798l0EO4qgKEUqMyi0cwTqLjn+jMH5wGbF18i P/N9I2bjsbNISJ3cqWJzF12wUWg3couxBUKJMmXwgs5lC+MS4xslj7loqDAKmzD7wzN/Ctr9sUG OkCAIRvL36Q1KYxlGb3UFvw1PID1nDpD+P7RZBFi2Q498AdDuxG4xmzy9u3fdJYniD1P57jaaDv LCYSUDfZAcaiQwDak5SJ9lXgDqJyCBBjgsckspbdQte5BhtLyNPowfPt2GGqJFxCpru4 X-Received: by 2002:a05:690c:c50d:b0:79a:5164:bb08 with SMTP id 00721157ae682-79a7181bd39mr47000367b3.8.1773863650674; Wed, 18 Mar 2026 12:54:10 -0700 (PDT) MIME-Version: 1.0 References: <854785.1772206539@sss.pgh.pa.us> In-Reply-To: From: Zsolt Parragi Date: Wed, 18 Mar 2026 19:54:00 +0000 X-Gm-Features: AaiRm51ZIp110pA-8gWqA34I43YUI5Et7uEt0nhOxleG1G4ZyRdpwcALnyvj4Rc Message-ID: Subject: Re: A stack allocation API To: Thomas Munro Cc: Tom Lane , PostgreSQL Hackers Content-Type: text/plain; charset="UTF-8" X-CLOUD-SEC-AV-Sent: true X-CLOUD-SEC-AV-Info: percona,google_mail,monitor X-Gm-Spam: 0 X-Gm-Phishy: 0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk Hello! + !defined(PG_STACK_USE_ALLOC) && There's a typo there, that should be ALLOCA? +/* Just use palloc. */ +#ifdef PG_STACK_USE_PALLOC +#define DECLARE_PG_STACK_IMPL(size) +#define pg_stack_alloc_aligned_impl(size, align) \ + pg_stack_palloc_aligned((size), (align)) +#define pg_stack_ptr_p() false +#endif Isn't a ptr parameter missing from this branch? +#define pg_stack_strdup_with_len(data, size) \ + (pg_stack_sanity_checks(1), \ + pg_stack_let_size = (size), \ + pg_stack_strdup_with_len_impl( \ + pg_stack_alloc_aligned_impl(pg_stack_let_size + 1, \ + alignof(char)), Both seems like a not realistic edge case, but since the array macros above have a length check, shouldn't this also guard against +1 overflowing? +/* Populate and insert a new entry. */ +static inline void * +pg_stack_debug_link(pg_stack_debug_node **head, + pg_stack_debug_node *node, + void *ptr, + size_t size) +{ + node->ptr = ptr; + node->size = size; Again unrealistic edge case, but if the above macros have overflow checks for typically 64 bit size_t, shouldn't this also have some safety checks, or at least setting node->size consistently to uint32_t max if size is bigger? +#define pg_stack_strdup(cstr) \ + pg_stack_strdup_with_len((cstr), strlen(cstr)) +#define pg_stack_strndup(cstr, n) \ + pg_stack_strdup_with_len((cstr), strnlen((cstr), (n))) +#define pg_stack_text_to_cstring(text) \ + pg_stack_strdup_with_len(VARDATA_ANY(text), VARSIZE_ANY_EXHDR(text)) +#define pg_stack_text_datum_to_cstring(datum) \ + pg_stack_text_to_cstring((text *) DatumGetPointer(datum)) I would at least very clearly document that these macros evaluate their arguments twice. I can't think of any scenario that would seriously break things with them (or at least not break the stack), but it could be still easy to forget that these are macros and not functions. Or can't they work similarly to DECLARE_PG_STACK_SIZE and store the pointer in a local variable?