| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- using System.Diagnostics;
- using System.Threading;
- namespace Ryujinx.HLE.HOS.Kernel.Common
- {
- class KAutoObject
- {
- protected KernelContext KernelContext;
- private int _referenceCount;
- public KAutoObject(KernelContext context)
- {
- KernelContext = context;
- _referenceCount = 1;
- }
- public virtual KernelResult SetName(string name)
- {
- if (!KernelContext.AutoObjectNames.TryAdd(name, this))
- {
- return KernelResult.InvalidState;
- }
- return KernelResult.Success;
- }
- public static KernelResult RemoveName(KernelContext context, string name)
- {
- if (!context.AutoObjectNames.TryRemove(name, out _))
- {
- return KernelResult.NotFound;
- }
- return KernelResult.Success;
- }
- public static KAutoObject FindNamedObject(KernelContext context, string name)
- {
- if (context.AutoObjectNames.TryGetValue(name, out KAutoObject obj))
- {
- return obj;
- }
- return null;
- }
- public void IncrementReferenceCount()
- {
- int newRefCount = Interlocked.Increment(ref _referenceCount);
- Debug.Assert(newRefCount >= 2);
- }
- public void DecrementReferenceCount()
- {
- int newRefCount = Interlocked.Decrement(ref _referenceCount);
- Debug.Assert(newRefCount >= 0);
- if (newRefCount == 0)
- {
- Destroy();
- }
- }
- protected virtual void Destroy()
- {
- }
- }
- }
|