Apply the Apache 2.0 license. Change-Id: I4a7aeefedcd2d891093520d5a10ebefadcddb5be Reviewed-on: https://swiftshader-review.googlesource.com/5320 Reviewed-by: Nicolas Capens <capn@google.com> Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/Common/MutexLock.hpp b/src/Common/MutexLock.hpp index 31e5189..16835ed 100644 --- a/src/Common/MutexLock.hpp +++ b/src/Common/MutexLock.hpp
@@ -1,126 +1,129 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2011 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef sw_MutexLock_hpp -#define sw_MutexLock_hpp - -#include "Thread.hpp" - -namespace sw -{ - class BackoffLock - { - public: - BackoffLock() - { - mutex = 0; - } - - bool attemptLock() - { - if(!isLocked()) - { - if(atomicExchange(&mutex, 1) == 0) - { - return true; - } - } - - return false; - } - - void lock() - { - int backoff = 1; - - while(!attemptLock()) - { - if(backoff <= 64) - { - for(int i = 0; i < backoff; i++) - { - nop(); - nop(); - nop(); - nop(); - nop(); - - nop(); - nop(); - nop(); - nop(); - nop(); - - nop(); - nop(); - nop(); - nop(); - nop(); - - nop(); - nop(); - nop(); - nop(); - nop(); - - nop(); - nop(); - nop(); - nop(); - nop(); - - nop(); - nop(); - nop(); - nop(); - nop(); - - nop(); - nop(); - nop(); - nop(); - nop(); - } - - backoff *= 2; - } - else - { - Thread::yield(); - - backoff = 1; - } - }; - } - - void unlock() - { - mutex = 0; - } - - bool isLocked() - { - return mutex != 0; - } - - private: - struct - { - // Ensure that the mutex variable is on its own 64-byte cache line to avoid false sharing - // Padding must be public to avoid compiler warnings - volatile int padding1[16]; - volatile int mutex; - volatile int padding2[15]; - }; - }; -} - -#endif // sw_MutexLock_hpp +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. +// +// 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. + +#ifndef sw_MutexLock_hpp +#define sw_MutexLock_hpp + +#include "Thread.hpp" + +namespace sw +{ + class BackoffLock + { + public: + BackoffLock() + { + mutex = 0; + } + + bool attemptLock() + { + if(!isLocked()) + { + if(atomicExchange(&mutex, 1) == 0) + { + return true; + } + } + + return false; + } + + void lock() + { + int backoff = 1; + + while(!attemptLock()) + { + if(backoff <= 64) + { + for(int i = 0; i < backoff; i++) + { + nop(); + nop(); + nop(); + nop(); + nop(); + + nop(); + nop(); + nop(); + nop(); + nop(); + + nop(); + nop(); + nop(); + nop(); + nop(); + + nop(); + nop(); + nop(); + nop(); + nop(); + + nop(); + nop(); + nop(); + nop(); + nop(); + + nop(); + nop(); + nop(); + nop(); + nop(); + + nop(); + nop(); + nop(); + nop(); + nop(); + } + + backoff *= 2; + } + else + { + Thread::yield(); + + backoff = 1; + } + }; + } + + void unlock() + { + mutex = 0; + } + + bool isLocked() + { + return mutex != 0; + } + + private: + struct + { + // Ensure that the mutex variable is on its own 64-byte cache line to avoid false sharing + // Padding must be public to avoid compiler warnings + volatile int padding1[16]; + volatile int mutex; + volatile int padding2[15]; + }; + }; +} + +#endif // sw_MutexLock_hpp