From patchwork Wed May 9 21:26:55 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 27189 Received: (qmail 81239 invoked by alias); 9 May 2018 21:27:31 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 81138 invoked by uid 89); 9 May 2018 21:27:30 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.1 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, SPF_PASS autolearn=ham version=3.3.2 spammy=noexcept X-HELO: sessmg22.ericsson.net Received: from sessmg22.ericsson.net (HELO sessmg22.ericsson.net) (193.180.251.58) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 09 May 2018 21:27:28 +0000 Received: from ESESSHC007.ericsson.se (Unknown_Domain [153.88.183.39]) by sessmg22.ericsson.net (Symantec Mail Security) with SMTP id 53.05.22120.6B763FA5; Wed, 9 May 2018 23:27:18 +0200 (CEST) Received: from ESESBMB501.ericsson.se (153.88.183.168) by ESESSHC007.ericsson.se (153.88.183.39) with Microsoft SMTP Server (TLS) id 14.3.382.0; Wed, 9 May 2018 23:27:18 +0200 Received: from ESESSMB503.ericsson.se (153.88.183.164) by ESESBMB501.ericsson.se (153.88.183.168) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1466.3; Wed, 9 May 2018 23:27:18 +0200 Received: from NAM01-BN3-obe.outbound.protection.outlook.com (153.88.183.157) by ESESSMB503.ericsson.se (153.88.183.164) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1466.3 via Frontend Transport; Wed, 9 May 2018 23:27:17 +0200 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=simon.marchi@ericsson.com; Received: from elxacz23q12.ericsson.se (129.192.64.65) by SN6PR15MB2400.namprd15.prod.outlook.com (2603:10b6:805:24::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.755.16; Wed, 9 May 2018 21:27:15 +0000 From: Simon Marchi To: CC: Simon Marchi Subject: [PATCH RFC 4/5] Introduce scoped_mmapped_file Date: Wed, 9 May 2018 17:26:55 -0400 Message-ID: <1525901216-15031-5-git-send-email-simon.marchi@ericsson.com> In-Reply-To: <1525901216-15031-1-git-send-email-simon.marchi@ericsson.com> References: <1525901216-15031-1-git-send-email-simon.marchi@ericsson.com> MIME-Version: 1.0 X-ClientProxiedBy: YQXPR0101CA0064.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:c00:14::41) To SN6PR15MB2400.namprd15.prod.outlook.com (2603:10b6:805:24::20) X-MS-PublicTrafficType: Email X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(4627221)(201703031133081)(201702281549075)(5600026)(2017052603328)(7153060)(7193020); SRVR:SN6PR15MB2400; X-Microsoft-Exchange-Diagnostics: 1; SN6PR15MB2400; 3:r5bFR1r9RdW7RY45iFRLKn0toPjy5Q3+6EJwdzsCxYAowXhdJx10HpovmikckMpN/Yu7w1vKzrtmRd/3AeszHL03mvNgQwUMWv5wS4mFM5WWu/qNzwa5yDIZ2UCF9f6nUEinNj3edm6a8DS8A+MXNBUXzDhpGCN3Ois1iNeN9o7+tyYuOLzIfIQ771vN/xnI/TzK+OorCkcxobJsuKh15+hUCOpySi1NbnHn6hR/DuOWHd8UvqeRnJK3/rMgoEVU; 25:IqDH7IPYWzKXf9YG9e5wv4tBItx9gxjlvNc8ziRRrhU9cHRddFncb6HnOCT5z45ASCX2wW+Yzp3UKlI9zArBSP/giLRQlct5/Ko4hSkFJ7AFKPv2qB3nB6zvCFddw3+O35+Sdo0oSBqkxYl3KWCAZ3/JxiJsyscB6mURhOxl7FaPtGgsAIsBxvzce8FAgF/vDkoug0NGo+2wZwTAV4RayxyYDAvaRcXDRyJtkBqszW2qc6jjuc8GzVyCLNKPiDE4AfBmoADNaIvPiJX9iZoAwz1vUw/8qIhi0sBuvW84+nJsBTvFTVEo0qZ4+ZabWXOM/s6Wfvvp118hpp/dNc+FKw==; 31:OxghOjpJZHpipe07B335OmarN8ucyb3enuByduAVDxvpH/fZ42LE5FbA3gucwzBSXVP29h+baz2p4pEDzU39/MhxbpsE4S5eCLG5Gk1CaXgznMXIcf7SpdVTMA/T1x/Rh63tF/kjxm939OZNpNt2MASr4NhRMXb/3l6Z6DhMzfS3W+4c0zo9wNC30Yws5V2wmCPUdupTeELZbdrme63BV5OU41qi4FwjLkE6sfysEpQ= X-MS-TrafficTypeDiagnostic: SN6PR15MB2400: X-Microsoft-Exchange-Diagnostics: 1; SN6PR15MB2400; 20:65mywMaCwiA++19oIO/fXLpIbBP58xTVhLLlMd4Sfp8RdNAoLf183Jtm5oDl9Z4M+eTTbivfVDiBtiGUMvfAJ8mnvZbXMu5xNgJwIGTllTHyQBciRYeUF9vb/hZu47/Ag2/9UsLP5QuLGGr+RNGTHAxX6u4uWuSP4Hf/UNkKhio/GeEZsFYEnE5ENjcdcAP692+qdoC2PUzmo1vnFBV4xl2DcONfA5Mc6ct+pM+h39jUOlm+6npeh3xUi0CyUgpBlicg87wGkKzhvhuyPEtqTl60O7jqIwfik4oPl3ZB+Iz4+T+gTJLBP6rJ7mGGwJI2/JajoYf3afr3HEtcLAaOttySvRM3fFhYJsMBAPzkoOcX9fOW4nHGJvFyOEJ2/f96tgN4pkVACL75ZDvdezh4gbdmv+/31KWzza3JtzvvJzvdvM0iwpS2X3TzOe48SxmpZp7vT4gadgZG/5D5xirSPxSQw2SrrMZbO3a9cGw2ca8MSD3DsE4sQh0l7LTJhsTL; 4:RUSFOoeo7gPsL+3UyovHIJgk2ObNHrM8YhgDcwy6mI4YbirO/CfuLWGzwdVyuYmBJ5U01dXzvJ4L1VJK6X6qQeXPNv+e7OYtRuFmHPZq10TNPJWERGqRk0aOBZPc8lXmSXdAKKxGL8J5NN8TpX2oknn48i0GDmC6/vgfkxfanOwOzqsXPlbK28fciekSu7xuou0U2fzSYyQ5UxdGjBx/Y9A+aCTIpPe1qVd6aJ7VYYfbq9S9kvrbBdE5PCQmjp4/yfVtNWEDZCT9ue2MZdpYSGe5zqK96Jwx66tAK919G9/y7Jz1kChInEH0DLWRqX+nyyPDjZ1pybeWYk3o5NfNjVTDivORu+Ty3MucHBwWpME= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(250305191791016)(22074186197030); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(3231254)(944501410)(52105095)(93006095)(93001095)(3002001)(10201501046)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123562045)(20161123564045)(20161123560045)(6072148)(201708071742011); SRVR:SN6PR15MB2400; BCL:0; PCL:0; RULEID:; SRVR:SN6PR15MB2400; X-Forefront-PRVS: 0667289FF8 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(346002)(376002)(366004)(396003)(39380400002)(39860400002)(189003)(199004)(54534003)(16586007)(2361001)(6486002)(316002)(6306002)(6512007)(16526019)(51416003)(53416004)(26005)(386003)(105586002)(106356001)(53936002)(186003)(52116002)(59450400001)(6506007)(48376002)(68736007)(76176011)(66066001)(6916009)(6666003)(478600001)(7736002)(2351001)(305945005)(36756003)(47776003)(25786009)(2906002)(50466002)(3846002)(6116002)(50226002)(4326008)(107886003)(5660300001)(81156014)(81166006)(69596002)(476003)(8676002)(44832011)(86362001)(8936002)(956004)(446003)(97736004)(486006)(11346002)(2616005)(2004002)(217873001); DIR:OUT; SFP:1101; SCL:1; SRVR:SN6PR15MB2400; H:elxacz23q12.ericsson.se; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; Received-SPF: None (protection.outlook.com: ericsson.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN6PR15MB2400; 23:uw5j4jmtFWRvPuHCwYhORs3wl+ZLZG9w3zacq8ABA?= =?us-ascii?Q?sM+exol9PXYF+jWsDVgcYKk5QnwbUQEYWCyY3B1EloJum9u1TnamOPuKuyTB?= =?us-ascii?Q?1gdfAGz1Udyn278GT+EORZKaKhWXBkPuCIZAKEzxcRw16Dk+LhNs4D51r0sH?= =?us-ascii?Q?+WJ9eD0UsWV+5plEUjsbHrToHWwVjwzBNCEpqtMK/f3cgfGJ0Sa7EKYH9IDQ?= =?us-ascii?Q?6gwoYO4qU9mEYukpm73vHpH9aAtOYL7dO6VH93AD29MDVzXIpdU4Tgcmq7Bu?= =?us-ascii?Q?P/Wf0mG7CE1KpOxVWWIa+Vb47jVJBqyjvaqICGCJK3ZTJw8tqmJCGGMDKM3K?= =?us-ascii?Q?8nVCTpSsNcoAgemgUaoRqAgCGOi1wKE8QN2a8LsHenTBSDnfx1FvDh2dDJPM?= =?us-ascii?Q?dZsR0WS7uqA6mq1sKrd/TISTZyubwtUjoYeHaV2Y4uZFhgeMv+78ADDCZM+l?= =?us-ascii?Q?po+Tkartvur6d5XGtaAzeBoY5X98UAFBjAPrwZPBNB+QXJVikcjxMwaCQ1iP?= =?us-ascii?Q?oloHX5XktTaVvoANUEsHGt/UdcLNZ+FqA31flP2XCbVaiIrXhRebCOLzQhOD?= =?us-ascii?Q?zg9M9oK6Fgy8oKXobRWC8nZG6bNxoR7lnlfY4IgeJ3S8K8PjtMaDuCiB+KPb?= =?us-ascii?Q?zbNwAxst0wZ57IsF98gWG7VZ1OJmeJoNbcgFAw9H0yAxxcu98AtbcNHh9tFz?= =?us-ascii?Q?hJMg+weHvvV6+S8aFhMymo0bQMqIwPDA1DPny+Innxs4xXjM35wmB0xTqv2D?= =?us-ascii?Q?m5TQI1fww1NQxefTFq5JLLRd0MT+noUlyViSoZBOkNvPlaknkwEMHWR3LQu+?= =?us-ascii?Q?2aVfwtdYp6WTbAIAVuFp8wO+T79pwkDMLRIYMNTiAJSUhopSWXDDUg90HPr7?= =?us-ascii?Q?CEJlp/0/Mv5FgrXXW7ejMlhqfigE/Hhc3zXQQk7EM+cYg2CK+nN7ACyckFfX?= =?us-ascii?Q?GQzjOlKK8+cctru4emMhVlUgbkFk40NITDP59FD7E3Lep8cvN3U5l8OgRtQy?= =?us-ascii?Q?U5sZyg2+5kw/redu6avcoGyTFazK56v0BIa6FWUFI5HYY6QC3jUz6Ra2Nlh3?= =?us-ascii?Q?pZ/Kp9NJdqNhkU59Ows5WVbe/MvG8aRGaTG6m73b89Fql2EUOhgyZGn1jOKw?= =?us-ascii?Q?WnZPFhmFClksZS10aTEvoj4C0mBa28yUoY79I4lBfNZ67CrJYIkp/syYmU7m?= =?us-ascii?Q?s9zLsO3Bgv5k/tjAwmO86N7p0v3wX7n7hzms4txn4bFE4/pT0KD2TQ8PlS6j?= =?us-ascii?Q?qbDQ5J8A715Iby5n+msTUGIubifjrz9qb1XgUwWQUDWYp+CoGYfIGFLeCtxb?= =?us-ascii?Q?qfAUPO7qDv6++epyb+5pDTWfLZxZel9YFICcByU3wtlCML6Z4me1faB9NtbL?= =?us-ascii?Q?vEDtUp8JLY7rl8C4yskM3GN1Y/w+/Bv0fwIXttPz5ZrXXD+?= X-Microsoft-Antispam-Message-Info: jCS8T5qEdinYo1TBau03pcxmav8nGW5GxzIzIKy/xlNajpBApVmxw1p0cqUuQiX7jRvllBsrXage5H/Q3G/uI9pUgjBKPS3n6tQzfNMxDZ57PeNSXQ8QNSka3hbeGq2hhoxFWke5aduHDd3Q748QMxioRuqyjhsveElwC6F0lciBkDCmvRwhgRdzQmTmjAIW X-Microsoft-Exchange-Diagnostics: 1; SN6PR15MB2400; 6:R9fnIe7lp6ACwuD4/RLrUJc9TOmHf79ZpiWJNDjQ8iXvhP/Ea1FaeM1FNEyiWTIfo+l4vUUoRgMQB02HJAmzJ+1PurJHcC4VPkSzp8Ge7PIsppAIIdY74b7YwhF4WjKWJE7gBIt36Us2XDEj3AmSgoFu9reXFQ3daimduSVHJWdCVaCQaLkOoNYgdInhIADwXWO9iAZIB7Q3PcGOnL9m5uUzgqiu5Tt+5OW70FhOa9jF/Of3urYIIrLGa5GHGRZqRt3J8/mcgF2zSW222HTlYHlcaMQYFPtrlS0B9/AOXld6pH6Q0Bwa/hOli9/gQUkmddAuqmmfJs9pZXPp2K53TiTMSAP+rNiICkBc9Ejpb+6LNqbWh3WOHqkWfn0EFD+EdVwh4j12yC19L+TdApoioKAMsVk+0sTJBIuycyGYtNG31cYUpcmTuAUTjJp3bT6FYAnQhmwi7LgKrid72jy17w==; 5:1oRDaFKSsKhwlz9zwBohEX5t5UbU6OMGK6mqqoLIRBQ2piUtcZuiABTGYbBvnTPJTd0dEr3iZoPzt0Dwhqcmd3T9C8aEY032jaTYpiD6azI9oLOiKNz8f8fNJNEQY26TGBg8rTOp1vdzCoerWpSk4R4vLTBfC6MzgNJWwRDmWuA=; 24:hurTYLW7zqYj76G4ouCL8QasJ6pZ9poSW7gkN4YAKxijN5tQf85Tile/ASDInPNTYg6xJ/MShUPYKrE7L7rgEeYs4oEiwe9MbFlVeYsH8KM= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; SN6PR15MB2400; 7:YbqlxiwCkKeimZAoBXqzuPnA005yLYCpAzPtvSJDcVnS0fuavrqC8YVzuU4QOnroP+RoKO0JefPp4ZvyzFSjJZMXHv8c/KYyr+9VkDHeRYjhdwdd0kXPqIFFqXcRTgqGYfQ3c5zOl5nipLzuaoz4n52DrQh9Fw1dl7hw7n3SIsm9rv2TV3XMIT+J0zP+k7MQxo+yXmFElsl2RiAN9shAkWJAhFuG+5L9USibA8FTRnyl136rd+9elmGtY2Voz8Wt X-MS-Office365-Filtering-Correlation-Id: a5160ffd-ad5f-46ff-d8ab-08d5b5f3a346 X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 May 2018 21:27:15.9427 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a5160ffd-ad5f-46ff-d8ab-08d5b5f3a346 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 92e84ceb-fbfd-47ab-be52-080c6b87953f X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN6PR15MB2400 X-OriginatorOrg: ericsson.com X-IsSubscribed: yes We already have scoped_mmap, which can is a thin RAII layer over mmap. If one simply wants to mmap an entire file for reading, it takes a bit of boilerplate. This patch introduces the scoped_mmapped_file class to make this easier. gdb/ChangeLog: * common/scoped_mmapped_file.h: New file. * common/scoped_fd.h (class scoped_fd) : New method. : New method. <~scoped_fd>: Use destroy. * unittests/scoped_mmapped_file-selftests.c: New file. * Makefile.in (SUBDIR_UNITTESTS_SRCS): Add unittests/scoped_mmapped_file-selftests.c. --- gdb/Makefile.in | 1 + gdb/common/scoped_fd.h | 17 ++++- gdb/common/scoped_mmapped_file.h | 70 ++++++++++++++++++++ gdb/unittests/scoped_mmapped_file-selftests.c | 95 +++++++++++++++++++++++++++ 4 files changed, 181 insertions(+), 2 deletions(-) create mode 100644 gdb/common/scoped_mmapped_file.h create mode 100644 gdb/unittests/scoped_mmapped_file-selftests.c diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 87d74a7..4e302c8 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -429,6 +429,7 @@ SUBDIR_UNITTESTS_SRCS = \ unittests/rsp-low-selftests.c \ unittests/scoped_fd-selftests.c \ unittests/scoped_mmap-selftests.c \ + unittests/scoped_mmapped_file-selftests.c \ unittests/scoped_restore-selftests.c \ unittests/string_view-selftests.c \ unittests/tracepoint-selftests.c \ diff --git a/gdb/common/scoped_fd.h b/gdb/common/scoped_fd.h index a6a8ab9..574c26e 100644 --- a/gdb/common/scoped_fd.h +++ b/gdb/common/scoped_fd.h @@ -34,8 +34,7 @@ public: explicit scoped_fd (int fd = -1) noexcept : m_fd (fd) {} ~scoped_fd () { - if (m_fd >= 0) - close (m_fd); + destroy (); } DISABLE_COPY_AND_ASSIGN (scoped_fd); @@ -52,7 +51,21 @@ public: return m_fd; } + void reset (int new_fd) + { + destroy (); + + m_fd = new_fd; + } + private: + + void destroy () + { + if (m_fd >= 0) + close (m_fd); + } + int m_fd; }; diff --git a/gdb/common/scoped_mmapped_file.h b/gdb/common/scoped_mmapped_file.h new file mode 100644 index 0000000..18bc26a --- /dev/null +++ b/gdb/common/scoped_mmapped_file.h @@ -0,0 +1,70 @@ +/* scoped_mmapped_file, automatically map/unmap entire files. + + Copyright (C) 2018 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef SCOPED_MMAPPED_FILE_H +#define SCOPED_MMAPPED_FILE_H + +#if defined(HAVE_SYS_MMAN_H) + +#include "scoped_mmap.h" +#include "scoped_fd.h" + +#include +#include +#include + +/* A smart-pointer-like class to automatically mmap an entire file. */ + +class scoped_mmapped_file +{ +public: + + scoped_mmapped_file () = default; + + /* Map FILENAME in memory. Throw an error if anything goes wrong. */ + scoped_mmapped_file (const char *filename) + { + m_fd.reset (open (filename, 0, O_RDONLY)); + if (m_fd.get () < 0) + perror_with_name ("open"); + + off_t size = lseek (m_fd.get (), 0, SEEK_END); + if (size < 0) + perror_with_name ("lseek"); + + /* We can't map an empty file. */ + if (size == 0) + error (_("file to mmap is empty")); + + m_mmap.reset (nullptr, size, PROT_READ, MAP_PRIVATE, m_fd.get (), 0); + if (m_mmap.get () == MAP_FAILED) + perror_with_name ("mmap"); + } + + size_t size () const noexcept { return m_mmap.size (); } + void *get () const noexcept { return m_mmap.get (); } + +private: + scoped_mmap m_mmap; + scoped_fd m_fd; +}; + +#endif /* defined(HAVE_SYS_MMAN_H) */ + +#endif /* SCOPED_MMAPPED_FILE_H */ diff --git a/gdb/unittests/scoped_mmapped_file-selftests.c b/gdb/unittests/scoped_mmapped_file-selftests.c new file mode 100644 index 0000000..8d8f517 --- /dev/null +++ b/gdb/unittests/scoped_mmapped_file-selftests.c @@ -0,0 +1,95 @@ +/* Self tests for scoped_mmapped_file for GDB, the GNU debugger. + + Copyright (C) 2018 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include "defs.h" +#include "selftest.h" +#include "common/scoped_mmapped_file.h" + +#if defined (HAVE_SYS_MMAN_H) + +namespace selftests { +namespace scoped_mmapped_file { + +static void +test_destroy () +{ + char filename[] = "scoped_mmapped_file-selftest-XXXXXX"; + int fd = mkstemp (filename); + SELF_CHECK (fd >= 0); + + write (fd, "Hello!", 7); + close (fd); + + { + ::scoped_mmapped_file f (filename); + + SELF_CHECK (f.get () != MAP_FAILED); + SELF_CHECK (f.size () == 7); + SELF_CHECK (0 == strcmp ((char *) f.get (), "Hello!")); + } + + unlink (filename); +} + +static void +test_default_constructor () +{ + ::scoped_mmapped_file f; + + SELF_CHECK (f.get () == MAP_FAILED); + SELF_CHECK (f.size () == 0); +} + +static void +test_invalid_filename () +{ + bool threw = false; + + try { + ::scoped_mmapped_file f ("/this/file/should/not/exist"); + } catch (gdb_exception &e) { + threw = true; + } + + SELF_CHECK (threw); +} + +static void +run_tests () +{ + test_destroy (); + test_default_constructor (); + test_invalid_filename (); +} + +} /* namespace scoped_mmapped_file */ +} /* namespace selftests */ + +#endif /* defined (HAVE_SYS_MMAN_H) */ + +void +_initialize_scoped_mmapped_file_selftests () +{ +#if defined (HAVE_SYS_MMAN_H) + selftests::register_test ("scoped_mmapped_file", + selftests::scoped_mmapped_file::run_tests); +#endif /* defined (HAVE_SYS_MMAN_H) */ +} + +