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. }