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; } }