zeek/auxil/libunistd/portable/AtomicMutex.h
Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

50 lines
789 B
C++

// libportable/AtomicMutex.h
// Robin.Rowe@cinepaint.org 2014/11/20
#ifndef AtomicMutex_h
#define AtomicMutex_h
#ifdef UNREAL_ENGINE
#include <AllowWindowsPlatformTypes.h>
#endif
#include <atomic>
#ifdef UNREAL_ENGINE
#include <HideWindowsPlatformTypes.h>
#endif
namespace portable
{
class AtomicMutex
{ friend class SoftLock;
std::atomic<int> lock;
public:
AtomicMutex()
{ lock=0;
}
bool IsLocked() const
{ return 1==lock;
}
bool operator!() const
{ return !IsLocked();
}
bool Lock()
{ const int lockCount=lock.fetch_add(1,std::memory_order_relaxed)+1;
const bool isLocked = (1==lockCount);
if(!isLocked)
{ Unlock();
}
return isLocked;
}
int Unlock()
{ const int lockCount=lock.fetch_sub(1,std::memory_order_relaxed)-1;
return lockCount;
}
};
}
#endif