From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from omta040.useast.a.cloudfilter.net (omta040.useast.a.cloudfilter.net [44.202.169.39]) by sourceware.org (Postfix) with ESMTPS id 173E73858436 for ; Sun, 10 Dec 2023 21:41:22 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 173E73858436 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=tromey.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=tromey.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 173E73858436 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=44.202.169.39 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702244484; cv=none; b=Kn5QYnrjq6QfmoI2d0j7RCBcG4nuy+6wqgww9br//ILyr8PssP55FaXViFqgtxMlxStKbVNCU/mfTFxfJn8cBSE02SWHBJSnkmFQ0Pjj+MrzBBI0OUqJJrypft+unIjllRy4DUuTzWEsDUIIhUPSRLLGgWFN/NhvGNW0h6swozw= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702244484; c=relaxed/simple; bh=OYEhCtEJ4zN8c4+AdlPBWafup0d91jVSUyhp2kw9ixo=; h=DKIM-Signature:From:Date:Subject:MIME-Version:Message-Id:To; b=ir9j62ZfptEDeC57OPLsxaKEMFZ/TUlPkMtvLrSpDYEtmAcU/8PN6Ok/VCABbsJr9Xt7yTZQQB5cpEtivGRFNQzCyss2nmoTt19WtwVXgdnmNGJN+7E59haGciwyUjosOEF+Dyx/pz9NQ+uB3O0au7ypCsMqFAby8aUV52ZEZic= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from eig-obgw-5003a.ext.cloudfilter.net ([10.0.29.159]) by cmsmtp with ESMTPS id CJj4rVz5j6nOZCRY9rrqq9; Sun, 10 Dec 2023 21:41:21 +0000 Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with ESMTPS id CRY8rUUE8nCfvCRY9rv1id; Sun, 10 Dec 2023 21:41:21 +0000 X-Authority-Analysis: v=2.4 cv=KKpJsXJo c=1 sm=1 tr=0 ts=65763081 a=ApxJNpeYhEAb1aAlGBBbmA==:117 a=ApxJNpeYhEAb1aAlGBBbmA==:17 a=OWjo9vPv0XrRhIrVQ50Ab3nP57M=:19 a=dLZJa+xiwSxG16/P+YVxDGlgEgI=:19 a=IkcTkHD0fZMA:10 a=e2cXIFwxEfEA:10 a=Qbun_eYptAEA:10 a=mDV3o1hIAAAA:8 a=ccfE1abgpALcRL0arBIA:9 a=QEXdDO2ut3YA:10 a=_FVE-zBwftR9WsbkzFJk:22 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=To:In-Reply-To:References:Message-Id:Content-Transfer-Encoding: Content-Type:MIME-Version:Subject:Date:From:Sender:Reply-To:Cc:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=JQDJ+cTd3FFBPzMeERHSt98AwERPyBE0NTu8SEbK758=; b=J3k02ICijC65kMt8+NyVJrDd0n wBa5sfP8xr0zvNMNpxAYRSVcz8z9bZVuo//mHOaCa5CMhY8rdg6w4nCe5r+scx0ne6yytzez1r76v QMekSlbKDREGySu3wbNh/cCxX; Received: from [198.59.47.65] (port=52450 helo=[192.168.131.83]) by box5379.bluehost.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96.2) (envelope-from ) id 1rCRY8-000SHj-24 for gdb-patches@sourceware.org; Sun, 10 Dec 2023 14:41:20 -0700 From: Tom Tromey Date: Sun, 10 Dec 2023 14:41:16 -0700 Subject: [PATCH v4 08/19] Add gdb::task_group MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20231210-t-bg-dwarf-reading-v4-8-b978c32fd12f@tromey.com> References: <20231210-t-bg-dwarf-reading-v4-0-b978c32fd12f@tromey.com> In-Reply-To: <20231210-t-bg-dwarf-reading-v4-0-b978c32fd12f@tromey.com> To: gdb-patches@sourceware.org X-Mailer: b4 0.12.4 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - box5379.bluehost.com X-AntiAbuse: Original Domain - sourceware.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - tromey.com X-BWhitelist: no X-Source-IP: 198.59.47.65 X-Source-L: No X-Exim-ID: 1rCRY8-000SHj-24 X-Source: X-Source-Args: X-Source-Dir: X-Source-Sender: ([192.168.131.83]) [198.59.47.65]:52450 X-Source-Auth: tom+tromey.com X-Email-Count: 10 X-Org: HG=bhshared;ORG=bluehost; X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTM3OS5ibHVlaG9zdC5jb20= X-Local-Domain: yes X-CMAE-Envelope: MS4xfNjCoy7WKdJKvM0HSlJZwnaWL6RisrYt3d33c5tRnAOuAaZGFamS/xxfJ2UOW9g5ytFbMejBa7xS0nSIKPpWJ46L/qokZI/aILRuO3kTgaj9gMA3AigB Iv/rex2OCF3bHIdnYSiRxpaPUFeAg5fwLzMs7SP4k52G014A2zuKdjFsU8ikINUii1HQaGUU+Y4sUwmCCk90rtbAXP01CRT4DDg= X-Spam-Status: No, score=-3024.3 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,GIT_PATCH_0,JMQ_SPF_NEUTRAL,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: This adds gdb::task_group, a convenient way to group background tasks and then call a function when all the tasks have completed. --- gdbsupport/Makefile.am | 1 + gdbsupport/Makefile.in | 6 ++- gdbsupport/task-group.cc | 97 ++++++++++++++++++++++++++++++++++++++++++++++++ gdbsupport/task-group.h | 64 ++++++++++++++++++++++++++++++++ 4 files changed, 166 insertions(+), 2 deletions(-) diff --git a/gdbsupport/Makefile.am b/gdbsupport/Makefile.am index f1a641308fe..fdca034ce5e 100644 --- a/gdbsupport/Makefile.am +++ b/gdbsupport/Makefile.am @@ -79,6 +79,7 @@ libgdbsupport_a_SOURCES = \ search.cc \ signals.cc \ signals-state-save-restore.cc \ + task-group.cc \ tdesc.cc \ thread-pool.cc \ xml-utils.cc \ diff --git a/gdbsupport/Makefile.in b/gdbsupport/Makefile.in index 9fdc23c39a9..070e36a6aff 100644 --- a/gdbsupport/Makefile.in +++ b/gdbsupport/Makefile.in @@ -166,8 +166,8 @@ am_libgdbsupport_a_OBJECTS = agent.$(OBJEXT) btrace-common.$(OBJEXT) \ ptid.$(OBJEXT) rsp-low.$(OBJEXT) run-time-clock.$(OBJEXT) \ safe-strerror.$(OBJEXT) scoped_mmap.$(OBJEXT) search.$(OBJEXT) \ signals.$(OBJEXT) signals-state-save-restore.$(OBJEXT) \ - tdesc.$(OBJEXT) thread-pool.$(OBJEXT) xml-utils.$(OBJEXT) \ - $(am__objects_1) $(am__objects_2) + task-group.$(OBJEXT) tdesc.$(OBJEXT) thread-pool.$(OBJEXT) \ + xml-utils.$(OBJEXT) $(am__objects_1) $(am__objects_2) libgdbsupport_a_OBJECTS = $(am_libgdbsupport_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) @@ -436,6 +436,7 @@ libgdbsupport_a_SOURCES = \ search.cc \ signals.cc \ signals-state-save-restore.cc \ + task-group.cc \ tdesc.cc \ thread-pool.cc \ xml-utils.cc \ @@ -546,6 +547,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/selftest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signals-state-save-restore.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signals.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task-group.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tdesc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thread-pool.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml-utils.Po@am__quote@ diff --git a/gdbsupport/task-group.cc b/gdbsupport/task-group.cc new file mode 100644 index 00000000000..e6c8a6f2e31 --- /dev/null +++ b/gdbsupport/task-group.cc @@ -0,0 +1,97 @@ +/* Task group + + Copyright (C) 2023 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 "common-defs.h" +#include "task-group.h" +#include "thread-pool.h" + +namespace gdb +{ + +class task_group::impl : public std::enable_shared_from_this +{ +public: + + explicit impl (std::function &&done) + : m_completed (0), + m_done (std::move (done)) + { } + DISABLE_COPY_AND_ASSIGN (impl); + + ~impl () + { + if (m_started) + m_done (); + } + + /* Add a task to the task group. */ + void add_task (std::function &&task) + { + m_tasks.push_back (std::move (task)); + }; + + /* Start this task group. */ + void start (); + + /* True if started. */ + bool m_started = false; + /* The tasks. */ + std::vector> m_tasks; + /* The number of tasks that have completed. */ + std::atomic m_completed; + /* The 'done' function. */ + std::function m_done; +}; + +void +task_group::impl::start () +{ + std::shared_ptr shared_this = shared_from_this (); + m_started = true; + for (size_t i = 0; i < m_tasks.size (); ++i) + { + gdb::thread_pool::g_thread_pool->post_task ([=] () + { + /* Be sure to capture a shared reference here. */ + shared_this->m_tasks[i] (); + }); + } +} + +task_group::task_group (std::function &&done) + : m_task (new impl (std::move (done))) +{ +} + +void +task_group::add_task (std::function &&task) +{ + gdb_assert (m_task != nullptr); + m_task->add_task (std::move (task)); +} + +void +task_group::start () +{ + gdb_assert (m_task != nullptr); + m_task->start (); + m_task.reset (); +} + +} /* namespace gdb */ diff --git a/gdbsupport/task-group.h b/gdbsupport/task-group.h new file mode 100644 index 00000000000..c11b5ccf158 --- /dev/null +++ b/gdbsupport/task-group.h @@ -0,0 +1,64 @@ +/* Task group + + Copyright (C) 2023 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 GDBSUPPORT_TASK_GROUP_H +#define GDBSUPPORT_TASK_GROUP_H + +#include + +namespace gdb +{ + +/* A task group is a collection of tasks. Each task in the group is + submitted to the thread pool. When all the tasks in the group have + finished, a final action is run. */ + +class task_group +{ +public: + + explicit task_group (std::function &&done); + DISABLE_COPY_AND_ASSIGN (task_group); + + /* Add a task to the task group. All tasks must be added before the + group is started. Note that a task may not throw an + exception. */ + void add_task (std::function &&task); + + /* Start this task group. A task group may only be started once. + This will submit all the tasks to the global thread pool. */ + void start (); + +private: + + class impl; + + /* A task group is just a facade around an impl. This is done + because the impl object must live as long as its longest-lived + task, so it is heap-allocated and destroyed when the last task + completes. Before 'start' is called, the impl is owned by this + task_group, but after 'start' it is owned jointly by the running + tasks, and m_task is cleared. */ + // FIXME + std::shared_ptr m_task; +}; + +} /* namespace gdb */ + +#endif /* GDBSUPPORT_TASK_GROUP_H */ -- 2.43.0