-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathguards.cpp
More file actions
89 lines (77 loc) · 2.61 KB
/
Copy pathguards.cpp
File metadata and controls
89 lines (77 loc) · 2.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
* Copyright 2025, 2026 Datadog, Inc
*
* 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.
*/
#include "guards.h"
#include "common.h"
#include "os.h"
#include "threadLocalData.inline.h"
#include <cassert>
// Signal-context tracking — backed by ProfiledThread::_signal_depth; see
// the comment block in guards.h for the rationale (initial-exec TLS was
// rejected because of the static TLS surplus on Graal).
int getInSignalDepth() {
ProfiledThread *pt = ProfiledThread::current();
return pt != nullptr ? static_cast<int>(pt->signalDepth()) : 0;
}
bool isInTrackedSignalContext() {
ProfiledThread *pt = ProfiledThread::current();
// null ProfiledThread = no thread context;
// the SignalHandlerScope never ran, so we have no positive evidence
// of a signal frame.
// See header comment for the rationale of returning false here.
return pt != nullptr && pt->signalDepth() != 0;
}
SignalHandlerScope::SignalHandlerScope() : _active(true), _current(nullptr) {
ProfiledThread *pt = ProfiledThread::acquireCurrent();
if (pt != nullptr) {
_current = pt;
pt->enterSignalScope();
} else {
// No thread context: nothing to update; mark inactive so destructor
// and release() are no-ops.
_active = false;
}
}
SignalHandlerScope::~SignalHandlerScope() {
if (!_active) return;
if (_current != nullptr) {
_current->exitSignalScope();
}
}
void SignalHandlerScope::release() {
if (!_active) return;
ProfiledThread *pt = ProfiledThread::current();
if (pt != nullptr) {
pt->exitSignalScope();
}
_active = false;
}
void signalHandlerUnwindAfterLongjmp() {
ProfiledThread *pt = ProfiledThread::current();
if (pt != nullptr) {
pt->exitSignalScope();
}
}
CriticalSection::CriticalSection() : _entered(false), _thread_ptr(nullptr) {
_thread_ptr = ProfiledThread::current();
assert(_thread_ptr != nullptr);
_entered = _thread_ptr->tryEnterCriticalSection();
}
CriticalSection::~CriticalSection() {
assert(_thread_ptr != nullptr);
if (_entered) {
_thread_ptr->exitCriticalSection();
}
}