1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2019 Arm Ltd and Contributors. All rights reserved. 3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT 4*89c4ff92SAndroid Build Coastguard Worker // 5*89c4ff92SAndroid Build Coastguard Worker 6*89c4ff92SAndroid Build Coastguard Worker #pragma once 7*89c4ff92SAndroid Build Coastguard Worker 8*89c4ff92SAndroid Build Coastguard Worker #include "IProfilingGuidGenerator.hpp" 9*89c4ff92SAndroid Build Coastguard Worker #include "ProfilingGuid.hpp" 10*89c4ff92SAndroid Build Coastguard Worker 11*89c4ff92SAndroid Build Coastguard Worker #include <functional> 12*89c4ff92SAndroid Build Coastguard Worker #include <mutex> 13*89c4ff92SAndroid Build Coastguard Worker 14*89c4ff92SAndroid Build Coastguard Worker namespace arm 15*89c4ff92SAndroid Build Coastguard Worker { 16*89c4ff92SAndroid Build Coastguard Worker 17*89c4ff92SAndroid Build Coastguard Worker namespace pipe 18*89c4ff92SAndroid Build Coastguard Worker { 19*89c4ff92SAndroid Build Coastguard Worker 20*89c4ff92SAndroid Build Coastguard Worker class ProfilingGuidGenerator : public IProfilingGuidGenerator 21*89c4ff92SAndroid Build Coastguard Worker { 22*89c4ff92SAndroid Build Coastguard Worker public: 23*89c4ff92SAndroid Build Coastguard Worker /// Construct a generator with the default address space static/dynamic partitioning ProfilingGuidGenerator()24*89c4ff92SAndroid Build Coastguard Worker ProfilingGuidGenerator() : m_Sequence(0) {} 25*89c4ff92SAndroid Build Coastguard Worker 26*89c4ff92SAndroid Build Coastguard Worker /// Return the next random Guid in the sequence NextGuid()27*89c4ff92SAndroid Build Coastguard Worker inline ProfilingDynamicGuid NextGuid() override 28*89c4ff92SAndroid Build Coastguard Worker { 29*89c4ff92SAndroid Build Coastguard Worker #if !defined(ARMNN_DISABLE_THREADS) 30*89c4ff92SAndroid Build Coastguard Worker std::lock_guard<std::mutex> sequencelock(m_SequenceMutex); 31*89c4ff92SAndroid Build Coastguard Worker #endif 32*89c4ff92SAndroid Build Coastguard Worker ProfilingDynamicGuid guid(m_Sequence); 33*89c4ff92SAndroid Build Coastguard Worker m_Sequence++; 34*89c4ff92SAndroid Build Coastguard Worker if (m_Sequence >= MIN_STATIC_GUID) 35*89c4ff92SAndroid Build Coastguard Worker { 36*89c4ff92SAndroid Build Coastguard Worker // Reset the sequence to 0 when it reaches the upper bound of dynamic guid 37*89c4ff92SAndroid Build Coastguard Worker m_Sequence = 0; 38*89c4ff92SAndroid Build Coastguard Worker } 39*89c4ff92SAndroid Build Coastguard Worker return guid; 40*89c4ff92SAndroid Build Coastguard Worker } 41*89c4ff92SAndroid Build Coastguard Worker 42*89c4ff92SAndroid Build Coastguard Worker /// Create a ProfilingStaticGuid based on a hash of the string GenerateStaticId(const std::string & str)43*89c4ff92SAndroid Build Coastguard Worker inline ProfilingStaticGuid GenerateStaticId(const std::string& str) override 44*89c4ff92SAndroid Build Coastguard Worker { 45*89c4ff92SAndroid Build Coastguard Worker uint64_t staticHash = m_Hash(str) | MIN_STATIC_GUID; 46*89c4ff92SAndroid Build Coastguard Worker return ProfilingStaticGuid(staticHash); 47*89c4ff92SAndroid Build Coastguard Worker } 48*89c4ff92SAndroid Build Coastguard Worker 49*89c4ff92SAndroid Build Coastguard Worker /// Reset the generator back to zero. Used mainly for test. Reset()50*89c4ff92SAndroid Build Coastguard Worker inline void Reset() 51*89c4ff92SAndroid Build Coastguard Worker { 52*89c4ff92SAndroid Build Coastguard Worker #if !defined(ARMNN_DISABLE_THREADS) 53*89c4ff92SAndroid Build Coastguard Worker std::lock_guard<std::mutex> sequencelock(m_SequenceMutex); 54*89c4ff92SAndroid Build Coastguard Worker #endif 55*89c4ff92SAndroid Build Coastguard Worker m_Sequence = 0; 56*89c4ff92SAndroid Build Coastguard Worker } 57*89c4ff92SAndroid Build Coastguard Worker 58*89c4ff92SAndroid Build Coastguard Worker private: 59*89c4ff92SAndroid Build Coastguard Worker std::hash<std::string> m_Hash; 60*89c4ff92SAndroid Build Coastguard Worker uint64_t m_Sequence; 61*89c4ff92SAndroid Build Coastguard Worker #if !defined(ARMNN_DISABLE_THREADS) 62*89c4ff92SAndroid Build Coastguard Worker std::mutex m_SequenceMutex; 63*89c4ff92SAndroid Build Coastguard Worker #endif 64*89c4ff92SAndroid Build Coastguard Worker }; 65*89c4ff92SAndroid Build Coastguard Worker 66*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe 67*89c4ff92SAndroid Build Coastguard Worker 68*89c4ff92SAndroid Build Coastguard Worker } // namespace arm 69