KPageList.cs 2.1 KB

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