예제 #1
0
        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));
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        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);
        }
예제 #6
0
        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);
        }