public JvmNativeEnvironment AttachCurrentThread(ref JavaVMAttachArgs args, jvmtiVersion toolsVersion) { JniInvokeInterface jniInvokeInterface = GetRawInterface(); JNIEnvHandle env; int result = jniInvokeInterface.AttachCurrentThread(this, out env, ref args); return(GetEnvironment(toolsVersion).GetNativeFunctionTable(env)); }
public int AttachCurrentThreadAsDaemon(JvmtiEnvironment environment, out JniEnvironment nativeEnvironment, bool agentThread) { JavaVMAttachArgs args = new JavaVMAttachArgs(jniVersion.Version1_6, IntPtr.Zero, jthreadGroup.Null); bool alreadyAgent = IsAgentThread.Value; if (agentThread && !alreadyAgent) { IsAgentThread.Value = true; } JNIEnvHandle jniEnv; int error = RawInterface.AttachCurrentThreadAsDaemon(this, out jniEnv, ref args); if (error == 0) { bool created; nativeEnvironment = JniEnvironment.GetOrCreateInstance(jniEnv, out created); if (agentThread && !alreadyAgent) { if (environment == null) { GetEnvironment(out environment); } jthread thread; JvmtiErrorHandler.ThrowOnFailure(environment.RawInterface.GetCurrentThread(environment, out thread)); if (thread != jthread.Null) { ThreadId threadId = TrackLocalThreadReference(thread, environment, nativeEnvironment, true); lock (_agentThreads) { _agentThreads.Add(threadId); } } } } else { nativeEnvironment = null; } return(error); }