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); } } }
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); } }
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 { } } }
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); } } }