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 <[email protected]>
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.

Reply via email to