124 lines
3.4 KiB
C#
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;
|
|
}
|
|
}
|