mirror of
https://github.com/ryujinx-mirror/ryujinx.git
synced 2024-12-25 05:05:46 +00:00
08831eecf7
* IPC refactor part 3 + 4: New server HIPC message processor with source generator based serialization * Make types match on calls to AlignUp/AlignDown * Formatting * Address some PR feedback * Move BitfieldExtensions to Ryujinx.Common.Utilities and consolidate implementations * Rename Reader/Writer to SpanReader/SpanWriter and move to Ryujinx.Common.Memory * Implement EventType * Address more PR feedback * Log request processing errors since they are not normal * Rename waitable to multiwait and add missing lock * PR feedback * Ac_K PR feedback
73 lines
No EOL
1.7 KiB
C#
73 lines
No EOL
1.7 KiB
C#
using Ryujinx.Horizon.Common;
|
|
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 Result SetName(string name)
|
|
{
|
|
if (!KernelContext.AutoObjectNames.TryAdd(name, this))
|
|
{
|
|
return KernelResult.InvalidState;
|
|
}
|
|
|
|
return Result.Success;
|
|
}
|
|
|
|
public static Result RemoveName(KernelContext context, string name)
|
|
{
|
|
if (!context.AutoObjectNames.TryRemove(name, out _))
|
|
{
|
|
return KernelResult.NotFound;
|
|
}
|
|
|
|
return Result.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()
|
|
{
|
|
}
|
|
}
|
|
} |