\documentclass{article} \usepackage{graphicx} % Required for inserting images \title{BinaryMutex: Technical Documentation} \author{Amlal El Mahrouss} \date{\today} \begin{document} \maketitle \section{Abstract} {The BinaryMutex is a core component of NeKernel (NeKernel/VMKernel) based systems. The pattern excludes other acquirers to own the USER\_PROCESS that is currently being hold. Thus the acquiree is the USER\_PROCESS itself} \section{Use Case \#1: Process lock for atomic data retrival} \begin{verbatim} BinaryMutex mux; mux.Lock(process); // Say we want to interact with the process itself on this thread, we can then make sure that no race condition happens by using: constexpr auto kSecondsMax = 5; mux.WaitForProcess(kSecondsMax); process.DoFoo(); \end{verbatim} \section{Implementation} The source implementation consists of: \begin{verbatim} class BinaryMutex final { public: explicit BinaryMutex() = default; ~BinaryMutex() = default; public: bool IsLocked() const; bool Unlock() noexcept; public: BOOL WaitForProcess(const UInt32& sec) noexcept; public: bool Lock(USER_PROCESS* process); bool LockOrWait(USER_PROCESS* process, TimerInterface* timer); public: NE_COPY_DEFAULT(BinaryMutex) private: USER_PROCESS* fLockingProcess; }; \end{verbatim} \section{Conclusion} This pattern is useful for systems that need to make sure that a process isn't tampered by concurrent usages. Thus its existence in VMKernel and NeKernel. \end{document}