Files
caliverse_server/ServerCore/Sync/AtomicGuard.cs
2025-05-01 07:20:41 +09:00

124 lines
3.4 KiB
C#

using System;
using System.Net;
using System.Threading;
using GAURD_KEY = System.String;
namespace ServerCore;
//=============================================================================================
// 병렬 프로그래밍 환경에서 특정 로직이 동시에 실행되지 않도록 보호하는 클래스 이다.
//
// author : kangms
//
//=============================================================================================
public class AtomicGuard : IDisposable
{
private string m_try_guard_key = string.Empty;
private string m_using_guard_key = string.Empty;
private AtomicString? m_guard_key_nullable;
private AtomicBool? m_atomic_bool_nullable;
public AtomicGuard(GAURD_KEY guardKey)
{
m_try_guard_key = guardKey;
}
public AtomicGuard(AtomicString guardKey)
{
m_guard_key_nullable = guardKey;
}
public AtomicGuard(AtomicString guardKey, AtomicBool atomicBool)
{
m_guard_key_nullable = guardKey;
m_atomic_bool_nullable = atomicBool;
}
public bool tryGuard()
{
if (null == m_guard_key_nullable)
{
var err_msg = $"m_guard_key_nullable is null !!! in tryGuard() - guardKey:{m_try_guard_key}";
Log.getLogger().error(err_msg);
return false;
}
if(false == m_guard_key_nullable.compareAndSet(string.Empty, m_try_guard_key))
{
var err_msg = $"Failed to in compareAndSet() !!! in tryGuard() - guardKey:{m_try_guard_key}";
Log.getLogger().info(err_msg);
return false;
}
if (null == m_atomic_bool_nullable)
{
var err_msg = $"m_atomic_bool_nullable is null !!! in tryGuard() - guardKey:{m_try_guard_key}";
Log.getLogger().error(err_msg);
return false;
}
if (false == m_atomic_bool_nullable.set(true))
{
var err_msg = $"Failed to set true !!! in tryGuard() - guardKey:{m_try_guard_key}";
Log.getLogger().info(err_msg);
return false;
}
m_using_guard_key = m_try_guard_key;
return true;
}
public void Dispose()
{
if (null == m_guard_key_nullable)
{
var err_msg = $"m_guard_key_nullable is null !!! in Dispose() - guardKey:{m_try_guard_key}";
Log.getLogger().error(err_msg);
return;
}
var guard_key = m_guard_key_nullable.Value;
if (false == m_guard_key_nullable.compareAndSet(m_using_guard_key, string.Empty))
{
var err_msg = $"Failed to compareAndSet() !!! in Dispose() : usingGuardKey:{m_using_guard_key} - guardKey:{guard_key}";
Log.getLogger().info(err_msg);
return;
}
if (null == m_atomic_bool_nullable)
{
var err_msg = $"m_atomic_bool_nullable is null !!! in Dispose() - guardKey:{guard_key}";
Log.getLogger().error(err_msg);
return;
}
if (false == m_atomic_bool_nullable.set(false))
{
var err_msg = $"Failed to set false in Dispose() !!! - guardKey:{guard_key}";
Log.getLogger().error(err_msg);
return;
}
}
public void bindAtomic(AtomicString guardKey, AtomicBool atomicBool)
{
m_guard_key_nullable = guardKey;
m_atomic_bool_nullable = atomicBool;
}
}