public Error GetThreadStatus(out ThreadStatus threadStatus, out SuspendStatus suspendStatus, ThreadId thread) { byte[] packet = new byte[HeaderSize + ThreadIdSize]; int id = GetMessageId(); SerializeHeader(packet, id, ThreadReferenceCommand.Status); WriteObjectId(packet, HeaderSize, thread); byte[] response = SendPacket(id, packet); Error errorCode = ReadErrorCode(response); if (errorCode != Error.None) { threadStatus = default(ThreadStatus); suspendStatus = default(SuspendStatus); return errorCode; } int offset = HeaderSize; threadStatus = (ThreadStatus)ReadInt32(response, ref offset); suspendStatus = (SuspendStatus)ReadInt32(response, ref offset); return Error.None; }
public Error GetThreadStatus(ThreadId threadId, out ThreadStatus threadStatus, out SuspendStatus suspendStatus) { threadStatus = 0; suspendStatus = 0; JniEnvironment nativeEnvironment; JvmtiEnvironment environment; jvmtiError error = GetEnvironment(out environment, out nativeEnvironment); if (error != jvmtiError.None) return GetStandardError(error); using (var thread = VirtualMachine.GetLocalReferenceForThread(nativeEnvironment, threadId)) { if (!thread.IsAlive) return Error.InvalidThread; jvmtiThreadState state; error = environment.RawInterface.GetThreadState(environment, thread.Value, out state); if (error != jvmtiError.None) return GetStandardError(error); suspendStatus = SuspendStatus.None; if ((state & jvmtiThreadState.Suspended) != 0) suspendStatus = SuspendStatus.Suspended; if ((state & jvmtiThreadState.BlockedOnMonitorEnter) != 0) threadStatus = ThreadStatus.Monitor; else if ((state & jvmtiThreadState.Sleeping) != 0) threadStatus = ThreadStatus.Sleeping; else if ((state & jvmtiThreadState.Terminated) != 0) threadStatus = ThreadStatus.Zombie; else if ((state & jvmtiThreadState.Waiting) != 0) threadStatus = ThreadStatus.Wait; else threadStatus = ThreadStatus.Running; return Error.None; } }