From 234fe7efd80f25af3babaa9d5fcbc9269f016894 Mon Sep 17 00:00:00 2001 From: lucapegolotti Date: Mon, 25 Apr 2016 10:51:27 +0200 Subject: [PATCH] Add implementation of blocking set --- containers_cpp/include/embb/containers/blocking_set.h | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ containers_cpp/include/embb/containers/internal/blocking_set-inl.h | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ containers_cpp/test/main.cc | 4 ++++ 3 files changed, 132 insertions(+) create mode 100755 containers_cpp/include/embb/containers/blocking_set.h create mode 100755 containers_cpp/include/embb/containers/internal/blocking_set-inl.h diff --git a/containers_cpp/include/embb/containers/blocking_set.h b/containers_cpp/include/embb/containers/blocking_set.h new file mode 100755 index 0000000..495c650 --- /dev/null +++ b/containers_cpp/include/embb/containers/blocking_set.h @@ -0,0 +1,68 @@ +/* +* Copyright (c) 2014-2015, Siemens AG. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef EMBB_CONTAINERS_BLOCKING_SET_H_ +#define EMBB_CONTAINERS_BLOCKING_SET_H_ + + +#include +#include + + +namespace embb { +namespace containers { + +/* +* Wrapper for the standard library set. +* +* \tparam T Element type. +*/ +template < typename Type > +class BlockingSet { + typedef embb::base::Mutex Mutex; + typedef embb::base::LockGuard LockGuard; + private: + std::set internalSet; + + Mutex mutex; + + public: + BlockingSet(); + + bool Insert(const Type& element); + + bool Erase(const Type& element); + + bool Contains(const Type& element); + +}; + +} +} + +#include + +#endif // EMBB_CONTAINERS_BLOCKING_CONTAINER_ \ No newline at end of file diff --git a/containers_cpp/include/embb/containers/internal/blocking_set-inl.h b/containers_cpp/include/embb/containers/internal/blocking_set-inl.h new file mode 100755 index 0000000..271211f --- /dev/null +++ b/containers_cpp/include/embb/containers/internal/blocking_set-inl.h @@ -0,0 +1,60 @@ +#include "..\blocking_set.h" +/* +* Copyright (c) 2014-2015, Siemens AG. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef EMBB_CONTAINERS_BLOCKING_SET_INL_H_ +#define EMBB_CONTAINERS_BLOCKING_SET_INL_H_ + + +namespace embb { +namespace containers { + + template + BlockingSet::BlockingSet() : + internalSet() {} + + template + bool BlockingSet::Insert(const T& element){ + LockGuard lock(mutex); + return internalSet.insert(element).second; + } + + template + bool BlockingSet::Erase(const T& element){ + LockGuard lock(mutex); + return internalSet.erase(element) > 0; + } + + template + bool BlockingSet::Contains(const T& element){ + LockGuard lock(mutex); + return internalSet.find(element) != internalSet.end(); + } + +} +} + +#endif // EMBB_CONTAINERS_BLOCKING_SET_INL_H_ \ No newline at end of file diff --git a/containers_cpp/test/main.cc b/containers_cpp/test/main.cc index d21dede..bb3f4c0 100644 --- a/containers_cpp/test/main.cc +++ b/containers_cpp/test/main.cc @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -50,6 +51,7 @@ using embb::containers::LockFreeMPMCQueue; using embb::containers::LockFreeStack; using embb::containers::LockFreeTreeValuePool; using embb::containers::WaitFreeArrayValuePool; +using embb::containers::BlockingSet; using embb::containers::test::PoolTest; using embb::containers::test::HazardPointerTest; using embb::containers::test::QueueTest; @@ -58,6 +60,7 @@ using embb::containers::test::ObjectPoolTest; using embb::containers::test::HazardPointerTest2; PT_MAIN("Data Structures C++") { + unsigned int max_threads = static_cast( 2 * partest::TestSuite::GetDefaultNumThreads()); embb_thread_set_max_count(max_threads); @@ -74,4 +77,5 @@ PT_MAIN("Data Structures C++") { PT_RUN(ObjectPoolTest< WaitFreeArrayValuePool >); PT_EXPECT(embb_get_bytes_allocated() == 0); + } -- libgit2 0.26.0