From f5475890894b4d542f622cee27604de15b41bb4b Mon Sep 17 00:00:00 2001 From: Jaymes Wilks Date: Mon, 4 Feb 2019 14:06:56 -0600 Subject: Support thread local storage Generally adds support to declare variables as thread_local - Add support in HBRT start assembly to skip adjusting TLS relocations - Add support in linker to generate tagged TLS entries - Update linker to process TLS relocations correctly - Update TLS code to ignore top half of module ID - Update module images to hold a "module ID" - Update custome linker to update module ID during binary link - Update TLS code to track TLS sections via module ID Change-Id: I1589550d7787beb08827ca24a728397dedf0373b RTC: 147599 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/71709 Reviewed-by: Ilya Smirnov Reviewed-by: Michael Baiocchi Tested-by: Jenkins Server Tested-by: FSP CI Jenkins Tested-by: Jenkins OP Build CI Tested-by: Jenkins OP HW Reviewed-by: Daniel M. Crowell --- src/include/util/nolockfree/stack.H | 115 ++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 src/include/util/nolockfree/stack.H (limited to 'src/include/util') diff --git a/src/include/util/nolockfree/stack.H b/src/include/util/nolockfree/stack.H new file mode 100644 index 000000000..bc2bb5fbb --- /dev/null +++ b/src/include/util/nolockfree/stack.H @@ -0,0 +1,115 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/include/util/nolockfree/stack.H $ */ +/* */ +/* OpenPOWER HostBoot Project */ +/* */ +/* Contributors Listed Below - COPYRIGHT 2010,2019 */ +/* [+] International Business Machines Corp. */ +/* */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); */ +/* you may not use this file except in compliance with the License. */ +/* You may obtain a copy of the License at */ +/* */ +/* http://www.apache.org/licenses/LICENSE-2.0 */ +/* */ +/* Unless required by applicable law or agreed to in writing, software */ +/* distributed under the License is distributed on an "AS IS" BASIS, */ +/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ +/* implied. See the License for the specific language governing */ +/* permissions and limitations under the License. */ +/* */ +/* IBM_PROLOG_END_TAG */ + +#ifndef __UTIL_NOLOCKFREE_STACK_H +#define __UTIL_NOLOCKFREE_STACK_H + +#include +#include + +namespace Util +{ + namespace NoLockFree + { + + /** + * @brief Non-lockfree stack implementation + * + * This is an intrusive container design, meaning elements being + * added to the stack must have a 'next' member of _T* type. This + * container is not threadsafe. + * + * @note: For a lockfree stack implementation, see Util::LockFree::Stack + */ + template + class Stack + { + public: + + /** + * @brief Constructor + */ + Stack() + : head(nullptr) + { + } + + /** + * @brief Pop an element from the stack. + * + * @return _T* The pointer to the element popped from the stack + */ + _T* pop(); + + /** + * @brief Push an element to the stack. + * + * @param[in] p Pointer to the element to add to the stack. + */ + void push(_T* p); + + /** + * @brief Get a pointer to the first element in the stack + * + * @return _T* The pointer to the first element + * @Note: SMP safety of this pointer is not guaranteed. + */ + _T* first(); + + private: + _T* head; + }; + + template + _T* Stack<_T>::first() + { + return head; + } + + template + _T* Stack<_T>::pop() + { + auto original = head; + if (unlikely(nullptr == original)) + { + return nullptr; + } + head = original->next; + return original; + } + + template + void Stack<_T>::push(_T* p) + { + p->next = head; + head = p; + } + + } // End NoLockFree namespace + +} // End Util namespace + +#endif // __UTIL_NOLOCKFREE_STACK_H + -- cgit v1.2.1