• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef __SAMPLING_H__
17 #define __SAMPLING_H__
18 
19 #include <stdint.h>
20 #include <cstddef>
21 #include <random>
22 #include <pthread.h>
23 
24 class Sampling {
25 public:
26     void InitSampling(uint64_t);
27     void Reset();
GetSampleInterval()28     uint64_t GetSampleInterval() const
29     {
30         return sampleInterval_;
31     }
StartSampling(size_t allocSize)32     size_t StartSampling(size_t allocSize)
33     {
34         return (allocSize >= sampleInterval_) ? allocSize : (CalcSamplings(allocSize) * sampleInterval_) ;
35     }
CalcNextSampleInterval()36     int64_t CalcNextSampleInterval()
37     {
38         return static_cast<int64_t>(exponentialDist_(randomEngine_)) + 1;
39     }
Sampling()40     Sampling()
41     {
42         pthread_spin_init(&spinlock_, PTHREAD_PROCESS_PRIVATE);
43     }
~Sampling()44     ~Sampling()
45     {
46         pthread_spin_destroy(&spinlock_);
47     }
48 
49     // for test
SetRandomEngineSeed(uint64_t cnt)50     void SetRandomEngineSeed(uint64_t cnt)
51     {
52         randomEngine_.seed(cnt);
53     }
54 
55 private:
56     class Spinlock {
57     public:
58         Spinlock(const Spinlock&) = delete;
59         Spinlock& operator=(const Spinlock&) = delete;
Spinlock()60         Spinlock()
61         {
62             pthread_spin_lock(&spinlock_);
63         }
~Spinlock()64         ~Spinlock()
65         {
66             pthread_spin_unlock(&spinlock_);
67         }
68     };
69     size_t CalcSamplings(size_t);
70 
71     uint64_t sampleInterval_ {0};
72     double sampleRate_ {0.0};
73     int64_t nextSampleInterval_ {0};
74     std::exponential_distribution<double> exponentialDist_;
75     static inline std::default_random_engine randomEngine_;
76     static inline pthread_spinlock_t spinlock_;
77 };
78 #endif  // __SAMPLING_H__