예제 #1
0
        public static void OutputManagedRefs(IRefContainer eo, IntPtr intptr, StreamWriter writer, int depth)
        {
            visited[intptr] = intptr;
            writer.WriteLine("  managed0x{0:x} [label=\"{1}\"];", (int)intptr, eo.GetType().Name);

            if (dumpDepth > 0 && depth > dumpDepth)
            {
                return;
            }

            foreach (HeapRef href in eo.GetManagedRefs())
            {
                if (href.Referent == null)
                {
                    continue;
                }

                if (!string.IsNullOrEmpty(href.Name) && skipEdges.Contains(href.Name))
                {
                    continue;
                }

                string edge_label = "";

                if (!href.Strong)
                {
                    edge_label += "weak";
                    if (href.Name != "")
                    {
                        edge_label += "\n" + href.Name;
                    }
                }
                else if (href.Name != "")
                {
                    edge_label = href.Name;
                }

                Foo targetInfo = new Foo();

                targetInfo.obj = href.Referent;

                writer.WriteLine("  managed0x{0:x} -> managed0x{1:x} [label=\"{2}\"];",
                                 (int)intptr,
                                 (int)targetInfo.intptr,
                                 edge_label);

                if (href.Referent is IRefContainer && !visited.ContainsKey(targetInfo.intptr))
                {
                    OutputManagedRefs((IRefContainer)href.Referent,
                                      targetInfo.intptr, writer, depth + 1);
                }
            }
        }
예제 #2
0
        public static void SetManagedPeerCallbacks(INativeEventObjectWrapper obj)
        {
            IRefContainer container = obj as IRefContainer;

            NativeMethods.event_object_set_managed_peer_callbacks(obj.NativeHandle,
                                                                  container == null ? null : NativeDependencyObjectHelper.add_strong_ref,
                                                                  container == null ? null : NativeDependencyObjectHelper.clear_strong_ref,
                                                                  NativeDependencyObjectHelper.mentor_changed);

            if (obj is INativeCollectionWrapper)
            {
                Events.AddHandler(obj, EventIds.Collection_ChangedEvent, native_collection_changed_callback);
            }
        }
예제 #3
0
        static void ClearStrongRef(IntPtr referer, IntPtr referent, IntPtr id)
        {
            try {
                IRefContainer container = NativeDependencyObjectHelper.Lookup(referer) as IRefContainer;
                if (container == null)
                {
                    return;
                }

                container.ClearStrongRef(id, GCHandle.FromIntPtr(referent).Target);
            } catch (Exception ex) {
                try {
                    Console.WriteLine("Moonlight: Unhandled exception in NativeDependencyObjectHelper.ClearStrongRef: {0}", ex);
                } catch {
                }
            }
        }
예제 #4
0
파일: HeapUtil.cs 프로젝트: dfr0/moon
		public static void OutputManagedRefs (IRefContainer eo, IntPtr intptr, StreamWriter writer, int depth)
		{
			visited[intptr] = intptr;
			writer.WriteLine ("  managed0x{0:x} [label=\"{1}\"];", (int)intptr, eo.GetType().Name);

			if (dumpDepth > 0 && depth > dumpDepth)
				return;

			foreach (HeapRef href in eo.GetManagedRefs()) {
				if (href.Referent == null)
					continue;

				if (!string.IsNullOrEmpty (href.Name) && skipEdges.Contains (href.Name))
					continue;

				string edge_label = "";

				if (!href.Strong) {
					edge_label += "weak";
					if (href.Name != "")
						edge_label += "\n" + href.Name;
				}
				else if (href.Name != "")
					edge_label = href.Name;

				Foo targetInfo = new Foo ();

				targetInfo.obj = href.Referent;

				writer.WriteLine ("  managed0x{0:x} -> managed0x{1:x} [label=\"{2}\"];",
						  (int)intptr,
						  (int)targetInfo.intptr,
						  edge_label);

				if (href.Referent is IRefContainer && !visited.ContainsKey (targetInfo.intptr)) {
					OutputManagedRefs ((IRefContainer)href.Referent,
							   targetInfo.intptr, writer, depth + 1);
				}
			}
		}