Skip to content

Commit 317d567

Browse files
Keep thread name after attaching it to JVM (#1713)
When native thread is attached to JVM, then it's name is taken from JavaVMAttachArgs. When no JavaVMAttachArgs, or no JavaVMAttachArgs::name passed, then JVM on its own decides on naming thread. Those names are not descriptive. To preserve thread name, pass the currently set thread name in JavaVMAttachArgs::name. Relates-To: HNAV-15387 Signed-off-by: Michal Zimonczyk <ext-michal.zimonczyk@here.com>
1 parent 923e71b commit 317d567

1 file changed

Lines changed: 19 additions & 2 deletions

File tree

olp-cpp-sdk-core/src/http/android/utils/JNIThreadBinder.h

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2019 HERE Europe B.V.
2+
* Copyright (C) 2019-2026 HERE Europe B.V.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
2222
#ifdef __ANDROID__
2323

2424
#include <jni.h>
25+
#include <sys/prctl.h>
2526

2627
namespace olp {
2728
namespace http {
@@ -35,7 +36,9 @@ class JNIThreadBinder final {
3536
: attached_(false), jni_env_(nullptr), jni_vm_(vm) {
3637
if (jni_vm_->GetEnv(reinterpret_cast<void**>(&jni_env_), JNI_VERSION_1_6) !=
3738
JNI_OK) {
38-
if (jni_vm_->AttachCurrentThread(&jni_env_, nullptr) == JNI_OK) {
39+
captureThreadName();
40+
auto attachArgs = getJvmAttachArgs();
41+
if (jni_vm_->AttachCurrentThread(&jni_env_, &attachArgs) == JNI_OK) {
3942
attached_ = true;
4043
}
4144
}
@@ -56,9 +59,23 @@ class JNIThreadBinder final {
5659
JNIEnv* GetEnv() const { return jni_env_; }
5760

5861
private:
62+
void captureThreadName() {
63+
if (prctl(PR_GET_NAME, threadName_) != 0) {
64+
threadName_[0] = '\0';
65+
}
66+
}
67+
68+
JavaVMAttachArgs getJvmAttachArgs() const {
69+
return JavaVMAttachArgs{.version = JNI_VERSION_1_6,
70+
.name = threadName_[0] ? threadName_ : nullptr,
71+
.group = nullptr};
72+
}
73+
5974
bool attached_;
6075
JNIEnv* jni_env_;
6176
JavaVM* jni_vm_;
77+
constexpr static size_t kThreadNameMaxLength = 16;
78+
char threadName_[kThreadNameMaxLength] = {0};
6279
};
6380

6481
} // namespace utils

0 commit comments

Comments
 (0)