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; }