blob: 73d4572127550876493794ead4693126f953bba1 [file] [log] [blame]
// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef PLATFORM_PUBLIC_LOCKABLE_H_
#define PLATFORM_PUBLIC_LOCKABLE_H_
#include "absl/base/thread_annotations.h"
namespace location {
namespace nearby {
// A resource that can be locked. This class is provided
// for clang thread safety analysis at compile time.
// There is no actual locking at runtime.
class ABSL_LOCKABLE Lockable {
private:
void Acquire() const ABSL_EXCLUSIVE_LOCK_FUNCTION() {}
void Release() const ABSL_UNLOCK_FUNCTION() {}
friend class ThreadLockHolder;
};
// RAII holder for a Lockable resource.
class ABSL_SCOPED_LOCKABLE ThreadLockHolder {
public:
explicit ThreadLockHolder(const Lockable* lockable)
ABSL_EXCLUSIVE_LOCK_FUNCTION(*lockable)
: lockable_{lockable} {
lockable_->Acquire();
}
~ThreadLockHolder() ABSL_UNLOCK_FUNCTION() { lockable_->Release(); }
private:
Lockable const* lockable_;
};
} // namespace nearby
} // namespace location
#endif // PLATFORM_PUBLIC_LOCKABLE_H_