You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2022/06/26 13:10:54 UTC

[celix] branch feature/update_default_promise_executor created (now d33a6a0f)

This is an automated email from the ASF dual-hosted git repository.

pnoltes pushed a change to branch feature/update_default_promise_executor
in repository https://gitbox.apache.org/repos/asf/celix.git


      at d33a6a0f Refactors the DefaultExecutor of celix::Promises so that std::function goes out of scope after executing

This branch includes the following new commits:

     new d33a6a0f Refactors the DefaultExecutor of celix::Promises so that std::function goes out of scope after executing

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[celix] 01/01: Refactors the DefaultExecutor of celix::Promises so that std::function goes out of scope after executing

Posted by pn...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

pnoltes pushed a commit to branch feature/update_default_promise_executor
in repository https://gitbox.apache.org/repos/asf/celix.git

commit d33a6a0f334346466db64bf857dc2694ac8a9409
Author: Pepijn Noltes <pe...@gmail.com>
AuthorDate: Sun Jun 26 15:10:49 2022 +0200

    Refactors the DefaultExecutor of celix::Promises so that std::function goes out of scope after executing
---
 libs/promises/api/celix/DefaultExecutor.h | 5 ++++-
 libs/promises/api/celix/IExecutor.h       | 3 +++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/libs/promises/api/celix/DefaultExecutor.h b/libs/promises/api/celix/DefaultExecutor.h
index d49307cc..294f89fb 100644
--- a/libs/promises/api/celix/DefaultExecutor.h
+++ b/libs/promises/api/celix/DefaultExecutor.h
@@ -36,7 +36,10 @@ namespace celix {
 
         void execute(int /*priority*/, std::function<void()> task) override {
             std::lock_guard lck{mutex};
-            futures.emplace_back(std::async(policy, std::move(task)));
+            futures.emplace_back(std::async(policy, [task = std::move(task)]() mutable {
+                task();
+                task = nullptr; //to ensure captures of task go out of scope
+            }));
             removeCompletedFutures();
         }
 
diff --git a/libs/promises/api/celix/IExecutor.h b/libs/promises/api/celix/IExecutor.h
index 7c9e5c0b..5cae91f7 100644
--- a/libs/promises/api/celix/IExecutor.h
+++ b/libs/promises/api/celix/IExecutor.h
@@ -39,6 +39,9 @@ namespace celix {
          * @brief Executes the given command at some time in the future. The command may execute in a new thread,
          * in a pooled thread, or in the calling thread, at the discretion of the Executor implementation.
          *
+         * @note After a task has been executed, the `std::function<void()>` task object must go out of scope to
+         * ensure that the potential capture objects also go out of scope.
+         *
          * @param priority the priority of the task. It depends on the executor implementation whether this is supported.
          * @param command the "runnable" task
          * @throws celix::RejectedExecutionException if this task cannot be accepted for execution.