초기커밋
This commit is contained in:
123
ServerCore/Sync/AtomicGuard.cs
Normal file
123
ServerCore/Sync/AtomicGuard.cs
Normal file
@@ -0,0 +1,123 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user