#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_MAY_AUTO_LOCK_H_
#define MOJO_PUBLIC_CPP_BINDINGS_LIB_MAY_AUTO_LOCK_H_
#include <optional>
#include "base/component_export.h"
#include "base/memory/raw_ptr_exclusion.h"
#include "base/synchronization/lock.h"
namespace mojo {
namespace internal {
class COMPONENT_EXPORT(MOJO_CPP_BINDINGS_BASE) MayAutoLock {
public:
explicit MayAutoLock(std::optional<base::Lock>* lock)
: lock_(lock->has_value() ? &lock->value() : nullptr) {
if (lock_)
lock_->Acquire();
}
MayAutoLock(const MayAutoLock&) = delete;
MayAutoLock& operator=(const MayAutoLock&) = delete;
~MayAutoLock() {
if (lock_) {
lock_->AssertAcquired();
lock_->Release();
}
}
private:
RAW_PTR_EXCLUSION base::Lock* lock_;
};
class COMPONENT_EXPORT(MOJO_CPP_BINDINGS_BASE) MayAutoUnlock {
public:
explicit MayAutoUnlock(std::optional<base::Lock>* lock)
: lock_(lock->has_value() ? &lock->value() : nullptr) {
if (lock_) {
lock_->AssertAcquired();
lock_->Release();
}
}
MayAutoUnlock(const MayAutoUnlock&) = delete;
MayAutoUnlock& operator=(const MayAutoUnlock&) = delete;
~MayAutoUnlock() {
if (lock_)
lock_->Acquire();
}
private:
RAW_PTR_EXCLUSION base::Lock* lock_;
};
}
}
#endif