internal jvmtiError GetThread(ThreadId threadId, out jthread thread) { lock (_threads) { if (!_threads.TryGetValue(threadId, out thread)) { return(jvmtiError.InvalidThread); } return(jvmtiError.None); } }
public StepRequest(VirtualMachine virtualMachine, ThreadReference thread, StepSize size, StepDepth depth) : base(virtualMachine) { Contract.Requires(virtualMachine != null); _thread = thread; _size = size; _depth = depth; ThreadId threadId = default(ThreadId); if (thread != null) { threadId = thread.ThreadId; } Modifiers.Add(Types.EventRequestModifier.Step(threadId, (Types.StepSize)size, (Types.StepDepth)depth)); }
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); }
internal ThreadId TrackLocalThreadReference(jthread thread, JvmtiEnvironment environment, JniEnvironment nativeEnvironment, bool freeLocalReference) { if (thread == jthread.Null) { return(default(ThreadId)); } int hashCode; JvmtiErrorHandler.ThrowOnFailure(environment.RawInterface.GetObjectHashCode(environment, thread, out hashCode)); ThreadId threadId = new ThreadId(hashCode); lock (_threads) { if (!_threads.ContainsKey(threadId)) { jweak weak = nativeEnvironment.NewWeakGlobalReference(thread); bool added = false; if (!_threads.ContainsKey(threadId)) { _threads.Add(threadId, new jthread(weak.Handle)); added = true; } if (!added) { nativeEnvironment.DeleteWeakGlobalReference(weak); } } } if (freeLocalReference) { nativeEnvironment.DeleteLocalReference(thread); } return(threadId); }
internal LocalThreadReferenceHolder GetLocalReferenceForThread(JniEnvironment nativeEnvironment, ThreadId threadId) { LocalThreadReferenceHolder thread; var error = GetLocalReferenceForThread(nativeEnvironment, threadId, out thread); if (error != jvmtiError.None) { return(new LocalThreadReferenceHolder()); } return(thread); }
internal jvmtiError GetLocalReferenceForThread(JniEnvironment nativeEnvironment, ThreadId threadId, out LocalThreadReferenceHolder thread) { thread = default(LocalThreadReferenceHolder); jthread threadHandle; jvmtiError error = GetThread(threadId, out threadHandle); if (error != jvmtiError.None) { return(error); } thread = new LocalThreadReferenceHolder(nativeEnvironment, threadHandle); return(jvmtiError.None); }