// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_MAY_AUTO_LOCK_H_
#define MOJO_PUBLIC_CPP_BINDINGS_LIB_MAY_AUTO_LOCK_H_
#include "base/component_export.h"
#include "base/macros.h"
#include "base/optional.h"
#include "base/synchronization/lock.h"
namespace mojo {
namespace internal {
// Similar to base::AutoLock, except that it does nothing if |lock| passed into
// the constructor is null.
class COMPONENT_EXPORT(MOJO_CPP_BINDINGS_BASE) MayAutoLock {
public:
explicit MayAutoLock(base::Optional<base::Lock>* lock)
: lock_(lock->has_value() ? &lock->value() : nullptr) {
if (lock_)
lock_->Acquire();
}
~MayAutoLock() {
if (lock_) {
lock_->AssertAcquired();
lock_->Release();
}
}
private:
base::Lock* lock_;
DISALLOW_COPY_AND_ASSIGN(MayAutoLock);
};
// Similar to base::AutoUnlock, except that it does nothing if |lock| passed
// into the constructor is null.
class COMPONENT_EXPORT(MOJO_CPP_BINDINGS_BASE) MayAutoUnlock {
public:
explicit MayAutoUnlock(base::Optional<base::Lock>* lock)
: lock_(lock->has_value() ? &lock->value() : nullptr) {
if (lock_) {
lock_->AssertAcquired();
lock_->Release();
}
}
~MayAutoUnlock() {
if (lock_)
lock_->Acquire();
}
private:
base::Lock* lock_;
DISALLOW_COPY_AND_ASSIGN(MayAutoUnlock);
};
} // namespace internal
} // namespace mojo
#endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_MAY_AUTO_LOCK_H_