ReturnCode ProfilerSocket::writeMessage()

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;
        }