Skip to content

Commit fe9f51f

Browse files
Merge pull request #107 from DataDog/rgs/async-sample-mutex-interleaved-test
fix async-sample mutex
2 parents 171a540 + e54df97 commit fe9f51f

7 files changed

Lines changed: 83 additions & 40 deletions

File tree

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#ifndef ASYNCSAMPLEMUTEX_H
2+
#define ASYNCSAMPLEMUTEX_H
3+
4+
#include "threadLocalData.h"
5+
6+
// controls access to AGCT
7+
class AsyncSampleMutex {
8+
private:
9+
ThreadLocalData* _threadLocalData;
10+
bool _acquired;
11+
12+
bool try_acquire() {
13+
if (_threadLocalData != nullptr && !_threadLocalData->is_unwinding_Java()) {
14+
_threadLocalData->set_unwinding_Java(true);
15+
return true;
16+
}
17+
return false;
18+
}
19+
20+
public:
21+
AsyncSampleMutex(ThreadLocalData* threadLocalData) : _threadLocalData(threadLocalData) {
22+
_acquired = try_acquire();
23+
}
24+
25+
AsyncSampleMutex(AsyncSampleMutex& other) = delete;
26+
27+
~AsyncSampleMutex() {
28+
if (_acquired) {
29+
_threadLocalData->set_unwinding_Java(false);
30+
}
31+
}
32+
33+
bool acquired() {
34+
return _acquired;
35+
}
36+
};
37+
38+
#endif //ASYNCSAMPLEMUTEX_H

ddprof-lib/src/main/cpp/profiler.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
#include "vmStructs.h"
4646
#include "context.h"
4747
#include "counters.h"
48+
#include "asyncSampleMutex.h"
4849

4950

5051
// The instance is not deleted on purpose, since profiler structures
@@ -683,7 +684,7 @@ void Profiler::recordSample(void* ucontext, u64 counter, int tid, jint event_typ
683684
int java_frames = 0;
684685
{
685686
// Async events
686-
AsyncSampleMutex mutex;
687+
AsyncSampleMutex mutex(ProfiledThread::current());
687688
if (mutex.acquired()) {
688689
java_frames = getJavaTraceAsync(ucontext, frames + num_frames, _max_stack_depth, &java_ctx,
689690
&truncated);

ddprof-lib/src/main/cpp/profiler.h

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -59,34 +59,6 @@ struct CallTraceBuffer {
5959
ASGCT_CallFrame _asgct_frames[1];
6060
};
6161

62-
// controls access to AGCT
63-
class AsyncSampleMutex {
64-
private:
65-
bool _acquired;
66-
bool try_set(bool flag) {
67-
ProfiledThread* current = ProfiledThread::current();
68-
if (current != NULL) {
69-
bool was_set = current->is_unwinding_Java();
70-
current->set_unwinding_Java(flag);
71-
return !was_set;
72-
}
73-
return false;
74-
}
75-
public:
76-
AsyncSampleMutex() {
77-
_acquired = try_set(true);
78-
}
79-
AsyncSampleMutex(AsyncSampleMutex& other) = delete;
80-
~AsyncSampleMutex() {
81-
if (_acquired) {
82-
try_set(false);
83-
}
84-
}
85-
bool acquired() {
86-
return _acquired;
87-
}
88-
};
89-
9062

9163
class FrameName;
9264
class NMethod;

ddprof-lib/src/main/cpp/thread.h

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88
#include <vector>
99
#include "os.h"
1010
#include <jvmti.h>
11+
#include "threadLocalData.h"
1112

12-
class ProfiledThread {
13+
class ProfiledThread : public ThreadLocalData {
1314
private:
1415
static pthread_key_t _tls_key;
1516
static int _buffer_size;
@@ -32,18 +33,17 @@ class ProfiledThread {
3233
u32 _call_trace_id;
3334
u32 _recording_epoch;
3435
u64 _span_id;
35-
bool _unwinding_java;
3636

3737
ProfiledThread(int buffer_pos, int tid) :
38+
ThreadLocalData(),
3839
_buffer_pos(buffer_pos),
3940
_tid(tid),
4041
_cpu_epoch(0),
4142
_wall_epoch(0),
4243
_pc(0),
4344
_call_trace_id(0),
4445
_recording_epoch(0),
45-
_span_id(0),
46-
_unwinding_java(false){};
46+
_span_id(0) {};
4747

4848
void releaseFromBuffer();
4949
public:
@@ -61,12 +61,6 @@ class ProfiledThread {
6161

6262
static ProfiledThread* current();
6363
static int currentTid();
64-
bool is_unwinding_Java() {
65-
return _unwinding_java;
66-
}
67-
void set_unwinding_Java(bool flag) {
68-
_unwinding_java = flag;
69-
}
7064

7165
inline int tid() {
7266
return _tid;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#ifndef THREADLOCALDATA_H
2+
#define THREADLOCALDATA_H
3+
4+
class ThreadLocalData {
5+
protected:
6+
bool _unwinding_Java;
7+
public:
8+
ThreadLocalData() : _unwinding_Java(false) {}
9+
virtual bool is_unwinding_Java() final {
10+
return _unwinding_Java;
11+
}
12+
13+
virtual void set_unwinding_Java(bool unwinding_Java) final {
14+
_unwinding_Java = unwinding_Java;
15+
}
16+
};
17+
18+
#endif //THREADLOCALDATA_H

ddprof-lib/src/test/cpp/ddprof_ut.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
#include <gtest/gtest.h>
22

3+
#include "asyncSampleMutex.h"
34
#include "buffers.h"
45
#include "context.h"
56
#include "counters.h"
67
#include "mutex.h"
78
#include "os.h"
89
#include "threadFilter.h"
910
#include "threadInfo.h"
11+
#include "threadLocalData.h"
1012
#include <vector>
1113

1214
ssize_t callback(char* ptr, int len) {
@@ -172,6 +174,24 @@
172174
ASSERT_EQ(0, info.size());
173175
}
174176

177+
TEST(AsyncSampleMutex, testAsyncSampleMutexInterleaving) {
178+
ThreadLocalData data;
179+
EXPECT_FALSE(data.is_unwinding_Java());
180+
{
181+
AsyncSampleMutex first(&data);
182+
EXPECT_TRUE(first.acquired());
183+
EXPECT_TRUE(data.is_unwinding_Java());
184+
{
185+
AsyncSampleMutex second(&data);
186+
EXPECT_FALSE(second.acquired());
187+
EXPECT_TRUE(first.acquired());
188+
EXPECT_TRUE(data.is_unwinding_Java());
189+
}
190+
EXPECT_TRUE(first.acquired());
191+
}
192+
EXPECT_FALSE(data.is_unwinding_Java());
193+
}
194+
175195
int main(int argc, char **argv) {
176196
::testing::InitGoogleTest(&argc, argv);
177197
return RUN_ALL_TESTS();

ddprof-lib/test.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ function build_and_test() {
2222
cd ${HERE}/src/test
2323
cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -Wno-dev -S . -B ${TARGET}
2424
cmake --build ${TARGET}
25-
cd ${TARGET} && ctest
25+
cd ${TARGET} && ctest --output-on-failure
2626
}
2727

2828
if [ -z "${BUILD_TYPE}" ]; then

0 commit comments

Comments
 (0)