25
25
#include < type_traits>
26
26
#include < vector>
27
27
28
+ #include " defer.hh"
28
29
#include " per-isolate-data.hh"
29
30
#include " translate-time-profile.hh"
30
31
#include " wall.hh"
@@ -58,39 +59,18 @@ using namespace v8;
58
59
59
60
namespace dd {
60
61
61
- class SignalMutex {
62
- std::atomic<bool >& mutex_ ;
62
+ class SignalGuard {
63
+ std::atomic<bool >& guard_ ;
63
64
64
65
inline void store (bool value) {
65
66
std::atomic_signal_fence (std::memory_order_release);
66
- mutex_ .store (value, std::memory_order_relaxed);
67
+ guard_ .store (value, std::memory_order_relaxed);
67
68
}
68
69
69
70
public:
70
- inline SignalMutex (std::atomic<bool >& mutex ) : mutex_(mutex ) { store (true ); }
71
+ inline SignalGuard (std::atomic<bool >& guard ) : guard_(guard ) { store (true ); }
71
72
72
- inline ~SignalMutex () { store (false ); }
73
- };
74
-
75
- // This class is used to update the context count metric when it goes out of
76
- // scope.
77
- class ContextCountMetricUpdater {
78
- uint32_t * fields_;
79
- std::unordered_set<PersistentContextPtr*>& liveContextPtrs_;
80
-
81
- public:
82
- inline ContextCountMetricUpdater (
83
- uint32_t * fields,
84
- std::unordered_set<PersistentContextPtr*>& liveContextPtrs)
85
- : fields_(fields), liveContextPtrs_(liveContextPtrs) {}
86
-
87
- inline ~ContextCountMetricUpdater () {
88
- std::atomic_store_explicit (
89
- reinterpret_cast <std::atomic<uint32_t >*>(
90
- &fields_[WallProfiler::Fields::kCPEDContextCount ]),
91
- liveContextPtrs_.size (),
92
- std::memory_order_relaxed);
93
- }
73
+ inline ~SignalGuard () { store (false ); }
94
74
};
95
75
96
76
void SetContextPtr (ContextPtr& contextPtr,
@@ -108,6 +88,7 @@ class PersistentContextPtr {
108
88
std::vector<PersistentContextPtr*>* dead;
109
89
Persistent<Object> per;
110
90
91
+ public:
111
92
PersistentContextPtr (std::vector<PersistentContextPtr*>* dead) : dead(dead) {}
112
93
113
94
void UnregisterFromGC () {
@@ -137,8 +118,6 @@ class PersistentContextPtr {
137
118
}
138
119
139
120
ContextPtr Get () const { return context; }
140
-
141
- friend class WallProfiler ;
142
121
};
143
122
144
123
// Maximum number of rounds in the GetV8ToEpochOffset
@@ -677,6 +656,14 @@ WallProfiler::WallProfiler(std::chrono::microseconds samplingPeriod,
677
656
}
678
657
}
679
658
659
+ void WallProfiler::UpdateContextCount () {
660
+ std::atomic_store_explicit (
661
+ reinterpret_cast <std::atomic<uint32_t >*>(
662
+ &fields_[WallProfiler::Fields::kCPEDContextCount ]),
663
+ liveContextPtrs_.size (),
664
+ std::memory_order_relaxed);
665
+ }
666
+
680
667
void WallProfiler::Dispose (Isolate* isolate, bool removeFromMap) {
681
668
if (cpuProfiler_ != nullptr ) {
682
669
cpuProfiler_->Dispose ();
@@ -694,13 +681,13 @@ void WallProfiler::Dispose(Isolate* isolate, bool removeFromMap) {
694
681
node::RemoveEnvironmentCleanupHook (
695
682
isolate, &WallProfiler::CleanupHook, isolate);
696
683
697
- ContextCountMetricUpdater updater (fields_, liveContextPtrs_);
698
684
for (auto ptr : liveContextPtrs_) {
699
685
ptr->UnregisterFromGC ();
700
686
delete ptr;
701
687
}
702
688
liveContextPtrs_.clear ();
703
689
deadContextPtrs_.clear ();
690
+ UpdateContextCount ();
704
691
}
705
692
}
706
693
@@ -1133,7 +1120,7 @@ Local<Value> WallProfiler::GetContext(Isolate* isolate) {
1133
1120
}
1134
1121
1135
1122
void WallProfiler::SetCurrentContextPtr (Isolate* isolate, Local<Value> value) {
1136
- SignalMutex m (setInProgress_);
1123
+ SignalGuard m (setInProgress_);
1137
1124
SetContextPtr (curContext_, isolate, value);
1138
1125
}
1139
1126
@@ -1144,7 +1131,9 @@ void WallProfiler::SetContext(Isolate* isolate, Local<Value> value) {
1144
1131
return ;
1145
1132
}
1146
1133
1147
- ContextCountMetricUpdater updater (fields_, liveContextPtrs_);
1134
+ defer {
1135
+ UpdateContextCount ();
1136
+ };
1148
1137
1149
1138
// Clean up dead context pointers
1150
1139
for (auto ptr : deadContextPtrs_) {
@@ -1168,7 +1157,7 @@ void WallProfiler::SetContext(Isolate* isolate, Local<Value> value) {
1168
1157
1169
1158
PersistentContextPtr* contextPtr = nullptr ;
1170
1159
auto profData = maybeProfData.ToLocalChecked ();
1171
- SignalMutex m (setInProgress_);
1160
+ SignalGuard m (setInProgress_);
1172
1161
if (profData->IsUndefined ()) {
1173
1162
if (value->IsNullOrUndefined ()) {
1174
1163
// Don't go to the trouble of mutating the CPED for null or undefined as
0 commit comments