Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        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;
            }
        }