From 7aa7fb0f666f084fb3e08d734b7daf0a8912bc12 Mon Sep 17 00:00:00 2001 From: Marcus Winter Date: Thu, 4 Feb 2016 15:37:16 +0100 Subject: [PATCH] tasks_cpp: creation of groups and queues is now thread-safe as documented --- tasks_cpp/include/embb/tasks/node.h | 3 +++ tasks_cpp/src/node.cc | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/tasks_cpp/include/embb/tasks/node.h b/tasks_cpp/include/embb/tasks/node.h index 094b34d..2a90ff7 100644 --- a/tasks_cpp/include/embb/tasks/node.h +++ b/tasks_cpp/include/embb/tasks/node.h @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -223,6 +224,8 @@ class Node { mtapi_action_hndl_t action_handle_; std::list queues_; std::list groups_; + embb::base::Spinlock queue_lock_; + embb::base::Spinlock group_lock_; }; } // namespace tasks diff --git a/tasks_cpp/src/node.cc b/tasks_cpp/src/node.cc index 362252c..13c928c 100644 --- a/tasks_cpp/src/node.cc +++ b/tasks_cpp/src/node.cc @@ -31,6 +31,7 @@ #include #include +#include #include #if TASKS_CPP_AUTOMATIC_INITIALIZE #include @@ -234,7 +235,11 @@ void Node::Finalize() { Group & Node::CreateGroup() { Group * group = embb::base::Allocation::New(); + while (!group_lock_.TryLock(1024)) { + embb::base::Thread::CurrentYield(); + } groups_.push_back(group); + group_lock_.Unlock(); return *group; } @@ -249,7 +254,11 @@ void Node::DestroyGroup(Group & group) { Queue & Node::CreateQueue(mtapi_uint_t priority, bool ordered) { Queue * queue = embb::base::Allocation::New(priority, ordered); + while (!queue_lock_.TryLock(1024)) { + embb::base::Thread::CurrentYield(); + } queues_.push_back(queue); + queue_lock_.Unlock(); return *queue; } -- libgit2 0.26.0