KProcessHandleTable.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using System;
  2. namespace Ryujinx.Core.OsHle.Handles
  3. {
  4. class KProcessHandleTable : IDisposable
  5. {
  6. private IdDictionary Handles;
  7. public KProcessHandleTable()
  8. {
  9. Handles = new IdDictionary();
  10. }
  11. public int OpenHandle(object Obj)
  12. {
  13. return Handles.Add(Obj);
  14. }
  15. public T GetData<T>(int Handle)
  16. {
  17. return Handles.GetData<T>(Handle);
  18. }
  19. public bool ReplaceData(int Id, object Data)
  20. {
  21. return Handles.ReplaceData(Id, Data);
  22. }
  23. public bool CloseHandle(int Handle)
  24. {
  25. object Data = Handles.GetData(Handle);
  26. if (Data is HTransferMem TMem)
  27. {
  28. TMem.Memory.Manager.Reprotect(
  29. TMem.Position,
  30. TMem.Size,
  31. TMem.Perm);
  32. }
  33. return Handles.Delete(Handle);
  34. }
  35. public void Dispose()
  36. {
  37. Dispose(true);
  38. }
  39. protected virtual void Dispose(bool Disposing)
  40. {
  41. if (Disposing)
  42. {
  43. foreach (object Obj in Handles)
  44. {
  45. if (Obj is IDisposable DisposableObj)
  46. {
  47. DisposableObj.Dispose();
  48. }
  49. }
  50. }
  51. }
  52. }
  53. }