@ -3,9 +3,8 @@
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
# include "test_util/sync_point.h"
# include <assert.h>
# include <atomic>
# include <condition_variable>
# include <functional>
@ -15,15 +14,39 @@
# include <unordered_map>
# include <unordered_set>
# include "memory/concurrent_arena.h"
# include "port/port.h"
# include "test_util/sync_point.h"
# include "util/dynamic_bloom.h"
# include "util/random.h"
# pragma once
# ifndef NDEBUG
namespace ROCKSDB_NAMESPACE {
// A hacky allocator for single use.
// Arena depends on SyncPoint and create circular dependency.
class SingleAllocator : public Allocator {
public :
char * Allocate ( size_t ) override {
assert ( false ) ;
return nullptr ;
}
char * AllocateAligned ( size_t bytes , size_t , Logger * ) override {
buf_ . resize ( bytes ) ;
return const_cast < char * > ( buf_ . data ( ) ) ;
}
size_t BlockSize ( ) const override {
assert ( false ) ;
return 0 ;
}
private :
std : : string buf_ ;
} ;
struct SyncPoint : : Data {
Data ( ) : enabled_ ( false ) { }
Data ( ) : point_filter_ ( & alloc_ , /*total_bits=*/ 8192 ) , enabled_ ( false ) { }
// Enable proper deletion by subclasses
virtual ~ Data ( ) { }
// successor/predecessor map loaded from LoadDependency
@ -37,6 +60,9 @@ struct SyncPoint::Data {
std : : condition_variable cv_ ;
// sync points that have been passed through
std : : unordered_set < std : : string > cleared_points_ ;
SingleAllocator alloc_ ;
// A filter before holding mutex to speed up process.
DynamicBloom point_filter_ ;
std : : atomic < bool > enabled_ ;
int num_callbacks_running_ = 0 ;
@ -48,6 +74,7 @@ struct SyncPoint::Data {
const std : : function < void ( void * ) > & callback ) {
std : : lock_guard < std : : mutex > lock ( mutex_ ) ;
callbacks_ [ point ] = callback ;
point_filter_ . Add ( point ) ;
}
void ClearCallBack ( const std : : string & point ) ;