// Copyright (c) 2011-present, Facebook, Inc. All rights reserved. // This source code is licensed under both the GPLv2 (found in the // COPYING file in the root directory) and Apache 2.0 License // (found in the LICENSE.Apache file in the root directory). #pragma once #ifndef ROCKSDB_LITE #include #include "rocksdb/status.h" namespace rocksdb { // TransactionDBMutex and TransactionDBCondVar APIs allows applications to // implement custom mutexes and condition variables to be used by a // TransactionDB when locking keys. // // To open a TransactionDB with a custom TransactionDBMutexFactory, set // TransactionDBOptions.custom_mutex_factory. class TransactionDBMutex { public: virtual ~TransactionDBMutex() {} // Attempt to acquire lock. Return OK on success, or other Status on failure. // If returned status is OK, TransactionDB will eventually call UnLock(). virtual Status Lock() = 0; // Attempt to acquire lock. If timeout is non-negative, operation may be // failed after this many microseconds. // Returns OK on success, // TimedOut if timed out, // or other Status on failure. // If returned status is OK, TransactionDB will eventually call UnLock(). virtual Status TryLockFor(int64_t timeout_time) = 0; // Unlock Mutex that was successfully locked by Lock() or TryLockUntil() virtual void UnLock() = 0; }; class TransactionDBCondVar { public: virtual ~TransactionDBCondVar() {} // Block current thread until condition variable is notified by a call to // Notify() or NotifyAll(). Wait() will be called with mutex locked. // Returns OK if notified. // Returns non-OK if TransactionDB should stop waiting and fail the operation. // May return OK spuriously even if not notified. virtual Status Wait(std::shared_ptr mutex) = 0; // Block current thread until condition variable is notified by a call to // Notify() or NotifyAll(), or if the timeout is reached. // Wait() will be called with mutex locked. // // If timeout is non-negative, operation should be failed after this many // microseconds. // If implementing a custom version of this class, the implementation may // choose to ignore the timeout. // // Returns OK if notified. // Returns TimedOut if timeout is reached. // Returns other status if TransactionDB should otherwis stop waiting and // fail the operation. // May return OK spuriously even if not notified. virtual Status WaitFor(std::shared_ptr mutex, int64_t timeout_time) = 0; // If any threads are waiting on *this, unblock at least one of the // waiting threads. virtual void Notify() = 0; // Unblocks all threads waiting on *this. virtual void NotifyAll() = 0; }; // Factory class that can allocate mutexes and condition variables. class TransactionDBMutexFactory { public: // Create a TransactionDBMutex object. virtual std::shared_ptr AllocateMutex() = 0; // Create a TransactionDBCondVar object. virtual std::shared_ptr AllocateCondVar() = 0; virtual ~TransactionDBMutexFactory() {} }; } // namespace rocksdb #endif // ROCKSDB_LITE