From patchwork Thu Jul 18 05:41:11 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Fran=C3=A7ois_Dumont?= X-Patchwork-Id: 1133542 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-505249-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="WGEf5T6l"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="lSgyaDno"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45q30h3jN0z9sDQ for ; Thu, 18 Jul 2019 15:41:35 +1000 (AEST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:to :from:subject:message-id:date:mime-version:content-type; q=dns; s=default; b=fxtEp+rJ+X7V45r8lKlf77idCMaraoN6ZFEyZ/0G3wjIioTdc9 paT57cCfvAdiQTPFusOMG7NbpoA5XLtEibidTVKwaijKkFceUyBdt4/n/UYDc+Bt 9najOickvc96ATOwGe1V72tWZwGX7/V9tVxublfsaLmeouQ/QpPRgN6Jo= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:to :from:subject:message-id:date:mime-version:content-type; s= default; bh=A8/tULdarikggOCelj907MqXXZo=; b=WGEf5T6lX1PsKNaETuUS Crly2S0UlreqWdqHKUB9QlbB+1Yv/WQKIIaOO4FUusMnEhVwtGyBQaRgFCbw+WAy EioHQHco50WeCQI/rBgvxFBnzImTY8btSmeG3LE6l7zOn8SG2y8TP9y1YHyiNfW9 pd83S/Pu06ODUH/u96OMhTQ= Received: (qmail 38338 invoked by alias); 18 Jul 2019 05:41:20 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 38325 invoked by uid 89); 18 Jul 2019 05:41:19 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-23.6 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy=adopted, HX-Received:5348 X-HELO: mail-wr1-f41.google.com Received: from mail-wr1-f41.google.com (HELO mail-wr1-f41.google.com) (209.85.221.41) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 18 Jul 2019 05:41:18 +0000 Received: by mail-wr1-f41.google.com with SMTP id n9so27245934wru.0; Wed, 17 Jul 2019 22:41:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=to:from:subject:message-id:date:user-agent:mime-version :content-language; bh=oXmAHPJyD15nnvr3s99MySmN92+9Tl/lT7SLuI4enFM=; b=lSgyaDno/RVovRGN5Ot4ID1W50lyZz31Lo4/GAzHHp4eC+POBRrMWiDxnl0u9QYOXn bA2KLC+F2yT3pL6bYRRBy/2J2ClfAU+U3ByjQ6DEULbwXw2FselOlKfMwVJD40mggjNv hk42C2kthcZJsMmS8lWbchO/fZTrqlI4OOur+Ut8lFekijOm0MEH7KMjtw2G18NZNWTA X4ctyLDaQ6oWdO2ERqDc53Phg0SxFJ96TQ+/gLcaNaj1pxmlEnjW0mLjfZowENnHUqL0 0IeaeMT+6C/S88uDKxw/4rhNykCJltc6k1lAjI/90eVgEzTnx3VV7sY0dDlP+Hv9Fwep ccig== Received: from [192.168.42.160] ([92.184.105.66]) by smtp.googlemail.com with ESMTPSA id a84sm29138147wmf.29.2019.07.17.22.41.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Jul 2019 22:41:15 -0700 (PDT) To: "libstdc++@gcc.gnu.org" , gcc-patches From: =?utf-8?q?Fran=C3=A7ois_Dumont?= Subject: sized delete in _Temporary_buffer<> Message-ID: Date: Thu, 18 Jul 2019 07:41:11 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.7.2 MIME-Version: 1.0 As we adopted the sized deallocation in the new_allocator why not doing the same in _Temporary_buffer<>.     * include/bits/stl_tempbuf.h (__detail::__return_temporary_buffer): New.     (~_Temporary_buffer()): Use latter.     (_Temporary_buffer(_FIterator, size_type)): Likewise. Tested w/o activating sized deallocation. I'll try to run tests with this option activated. Ok to commit ? François diff --git a/libstdc++-v3/include/bits/stl_tempbuf.h b/libstdc++-v3/include/bits/stl_tempbuf.h index b6ad9ee6a46..bb7c2cd1334 100644 --- a/libstdc++-v3/include/bits/stl_tempbuf.h +++ b/libstdc++-v3/include/bits/stl_tempbuf.h @@ -63,6 +63,21 @@ namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION + namespace __detail + { + template + inline void + __return_temporary_buffer(_Tp* __p, + size_t __len __attribute__((__unused__))) + { +#if __cpp_sized_deallocation + ::operator delete(__p, __len); +#else + ::operator delete(__p); +#endif + } + } + /** * @brief Allocates a temporary buffer. * @param __len The number of objects of type Tp. @@ -112,7 +127,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return_temporary_buffer(_Tp* __p) { ::operator delete(__p); } - /** * This class is used in two places: stl_algo.h and ext/memory, * where it is wrapped as the temporary_buffer class. See @@ -165,7 +179,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ~_Temporary_buffer() { std::_Destroy(_M_buffer, _M_buffer + _M_len); - std::return_temporary_buffer(_M_buffer); + std::__detail::__return_temporary_buffer(_M_buffer, _M_len); } private: @@ -185,7 +199,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __ucr(_Pointer __first, _Pointer __last, _ForwardIterator __seed) { - if(__first == __last) + if (__first == __last) return; _Pointer __cur = __first; @@ -244,22 +258,23 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Temporary_buffer(_ForwardIterator __seed, size_type __original_len) : _M_original_len(__original_len), _M_len(0), _M_buffer(0) { - __try - { - std::pair __p(std::get_temporary_buffer< - value_type>(_M_original_len)); - _M_buffer = __p.first; - _M_len = __p.second; - if (_M_buffer) - std::__uninitialized_construct_buf(_M_buffer, _M_buffer + _M_len, - __seed); - } - __catch(...) + std::pair __p( + std::get_temporary_buffer(_M_original_len)); + + if (__p.first) { - std::return_temporary_buffer(_M_buffer); - _M_buffer = 0; - _M_len = 0; - __throw_exception_again; + __try + { + std::__uninitialized_construct_buf(__p.first, __p.first + __p.second, + __seed); + _M_buffer = __p.first; + _M_len = __p.second; + } + __catch(...) + { + std::__detail::__return_temporary_buffer(__p.first, __p.second); + __throw_exception_again; + } } }