in jvmti-access/src/main/jni/ProfilerSocket.cpp [123:149]
ReturnCode ProfilerSocket::writeMessage(JNIEnv* jniEnv, jbyteArray message) {
std::lock_guard<std::mutex> guard(mutex);
if (state == nullptr) {
return raiseExceptionAndReturn(jniEnv, ReturnCode::ERROR, "Profiler socket has not been opened yet!");
}
jboolean isCopy;
jsize numBytes = jniEnv->GetArrayLength(message);
jbyte* data = jniEnv->GetByteArrayElements(message, &isCopy);
if (data == nullptr) {
return raiseExceptionAndReturn(jniEnv, ReturnCode::ERROR, "Could not get array data");
}
sockaddr_un addr = {};
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, state->socketFilePath.c_str(), sizeof(addr.sun_path) - 1);
auto result = sendto(state->socketFd, data, numBytes, MSG_DONTWAIT, (sockaddr*)&addr, sizeof(addr));
auto errorNum = errno;
jniEnv->ReleaseByteArrayElements(message, data, 0);
if (result != numBytes) {
return raiseExceptionAndReturn(jniEnv, ReturnCode::ERROR, "Could not send to socket, return value is ", result," errno is ", errorNum);
}
return ReturnCode::SUCCESS;
}