KPageList.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. namespace Ryujinx.HLE.HOS.Kernel
  4. {
  5. class KPageList : IEnumerable<KPageNode>
  6. {
  7. public LinkedList<KPageNode> Nodes { get; private set; }
  8. public KPageList()
  9. {
  10. Nodes = new LinkedList<KPageNode>();
  11. }
  12. public KernelResult AddRange(ulong address, ulong pagesCount)
  13. {
  14. if (pagesCount != 0)
  15. {
  16. if (Nodes.Last != null)
  17. {
  18. KPageNode lastNode = Nodes.Last.Value;
  19. if (lastNode.Address + lastNode.PagesCount * KMemoryManager.PageSize == address)
  20. {
  21. address = lastNode.Address;
  22. pagesCount += lastNode.PagesCount;
  23. Nodes.RemoveLast();
  24. }
  25. }
  26. Nodes.AddLast(new KPageNode(address, pagesCount));
  27. }
  28. return KernelResult.Success;
  29. }
  30. public ulong GetPagesCount()
  31. {
  32. ulong sum = 0;
  33. foreach (KPageNode node in Nodes)
  34. {
  35. sum += node.PagesCount;
  36. }
  37. return sum;
  38. }
  39. public bool IsEqual(KPageList other)
  40. {
  41. LinkedListNode<KPageNode> thisNode = Nodes.First;
  42. LinkedListNode<KPageNode> otherNode = other.Nodes.First;
  43. while (thisNode != null && otherNode != null)
  44. {
  45. if (thisNode.Value.Address != otherNode.Value.Address ||
  46. thisNode.Value.PagesCount != otherNode.Value.PagesCount)
  47. {
  48. return false;
  49. }
  50. thisNode = thisNode.Next;
  51. otherNode = otherNode.Next;
  52. }
  53. return thisNode == null && otherNode == null;
  54. }
  55. public IEnumerator<KPageNode> GetEnumerator()
  56. {
  57. return Nodes.GetEnumerator();
  58. }
  59. IEnumerator IEnumerable.GetEnumerator()
  60. {
  61. return GetEnumerator();
  62. }
  63. }
  64. }