KAutoObject.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using System.Threading;
  2. namespace Ryujinx.HLE.HOS.Kernel.Common
  3. {
  4. class KAutoObject
  5. {
  6. protected KernelContext KernelContext;
  7. private int _referenceCount;
  8. public KAutoObject(KernelContext context)
  9. {
  10. KernelContext = context;
  11. _referenceCount = 1;
  12. }
  13. public virtual KernelResult SetName(string name)
  14. {
  15. if (!KernelContext.AutoObjectNames.TryAdd(name, this))
  16. {
  17. return KernelResult.InvalidState;
  18. }
  19. return KernelResult.Success;
  20. }
  21. public static KernelResult RemoveName(KernelContext context, string name)
  22. {
  23. if (!context.AutoObjectNames.TryRemove(name, out _))
  24. {
  25. return KernelResult.NotFound;
  26. }
  27. return KernelResult.Success;
  28. }
  29. public static KAutoObject FindNamedObject(KernelContext context, string name)
  30. {
  31. if (context.AutoObjectNames.TryGetValue(name, out KAutoObject obj))
  32. {
  33. return obj;
  34. }
  35. return null;
  36. }
  37. public void IncrementReferenceCount()
  38. {
  39. Interlocked.Increment(ref _referenceCount);
  40. }
  41. public void DecrementReferenceCount()
  42. {
  43. if (Interlocked.Decrement(ref _referenceCount) == 0)
  44. {
  45. Destroy();
  46. }
  47. }
  48. protected virtual void Destroy() { }
  49. }
  50. }