Skip to content

Commit

Permalink
feat(todo): change raw pointer to unique pointer for member variables…
Browse files Browse the repository at this point in the history
… in bustub_instance.h (#589)

feat: change raw pointer to unique pointer for member variables in bustub_instance.h
  • Loading branch information
xzhseh committed Aug 11, 2023
1 parent 2f2890b commit 942f7c3
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 43 deletions.
63 changes: 29 additions & 34 deletions src/common/bustub_instance.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include <memory>
#include <optional>
#include <shared_mutex>
#include <string>
Expand All @@ -15,7 +16,6 @@
#include "catalog/schema.h"
#include "catalog/table_generator.h"
#include "common/bustub_instance.h"
#include "common/enums/statement_type.h"
#include "common/exception.h"
#include "common/util/string_util.h"
#include "concurrency/lock_manager.h"
Expand All @@ -39,87 +39,90 @@
namespace bustub {

auto BustubInstance::MakeExecutorContext(Transaction *txn, bool is_modify) -> std::unique_ptr<ExecutorContext> {
return std::make_unique<ExecutorContext>(txn, catalog_, buffer_pool_manager_, txn_manager_, lock_manager_, is_modify);
return std::make_unique<ExecutorContext>(txn, catalog_.get(), buffer_pool_manager_.get(), txn_manager_.get(),
lock_manager_.get(), is_modify);
}

BustubInstance::BustubInstance(const std::string &db_file_name) {
enable_logging = false;

// Storage related.
disk_manager_ = new DiskManager(db_file_name);
disk_manager_ = std::make_unique<DiskManager>(db_file_name);

// Log related.
log_manager_ = new LogManager(disk_manager_);
log_manager_ = std::make_unique<LogManager>(disk_manager_.get());

// We need more frames for GenerateTestTable to work. Therefore, we use 128 instead of the default
// buffer pool size specified in `config.h`.
try {
buffer_pool_manager_ = new BufferPoolManager(128, disk_manager_, LRUK_REPLACER_K, log_manager_);
buffer_pool_manager_ =
std::make_unique<BufferPoolManager>(128, disk_manager_.get(), LRUK_REPLACER_K, log_manager_.get());
} catch (NotImplementedException &e) {
std::cerr << "BufferPoolManager is not implemented, only mock tables are supported." << std::endl;
buffer_pool_manager_ = nullptr;
}

// Transaction (txn) related.
lock_manager_ = std::make_unique<LockManager>();

lock_manager_ = new LockManager();
txn_manager_ = std::make_unique<TransactionManager>(lock_manager_.get(), log_manager_.get());

txn_manager_ = new TransactionManager(lock_manager_, log_manager_);

lock_manager_->txn_manager_ = txn_manager_;
lock_manager_->txn_manager_ = txn_manager_.get();

#ifndef __EMSCRIPTEN__
lock_manager_->StartDeadlockDetection();
#endif

// Checkpoint related.
checkpoint_manager_ = new CheckpointManager(txn_manager_, log_manager_, buffer_pool_manager_);
checkpoint_manager_ =
std::make_unique<CheckpointManager>(txn_manager_.get(), log_manager_.get(), buffer_pool_manager_.get());

// Catalog.
catalog_ = new Catalog(buffer_pool_manager_, lock_manager_, log_manager_);
// Catalog related.
catalog_ = std::make_unique<Catalog>(buffer_pool_manager_.get(), lock_manager_.get(), log_manager_.get());

// Execution engine.
execution_engine_ = new ExecutionEngine(buffer_pool_manager_, txn_manager_, catalog_);
// Execution engine related.
execution_engine_ = std::make_unique<ExecutionEngine>(buffer_pool_manager_.get(), txn_manager_.get(), catalog_.get());
}

BustubInstance::BustubInstance() {
enable_logging = false;

// Storage related.
disk_manager_ = new DiskManagerUnlimitedMemory();
disk_manager_ = std::make_unique<DiskManagerUnlimitedMemory>();

// Log related.
log_manager_ = new LogManager(disk_manager_);
log_manager_ = std::make_unique<LogManager>(disk_manager_.get());

// We need more frames for GenerateTestTable to work. Therefore, we use 128 instead of the default
// buffer pool size specified in `config.h`.
try {
buffer_pool_manager_ = new BufferPoolManager(128, disk_manager_, LRUK_REPLACER_K, log_manager_);
buffer_pool_manager_ =
std::make_unique<BufferPoolManager>(128, disk_manager_.get(), LRUK_REPLACER_K, log_manager_.get());
} catch (NotImplementedException &e) {
std::cerr << "BufferPoolManager is not implemented, only mock tables are supported." << std::endl;
buffer_pool_manager_ = nullptr;
}

// Transaction (txn) related.
lock_manager_ = std::make_unique<LockManager>();

lock_manager_ = new LockManager();

txn_manager_ = new TransactionManager(lock_manager_, log_manager_);
txn_manager_ = std::make_unique<TransactionManager>(lock_manager_.get(), log_manager_.get());

lock_manager_->txn_manager_ = txn_manager_;
lock_manager_->txn_manager_ = txn_manager_.get();

#ifndef __EMSCRIPTEN__
lock_manager_->StartDeadlockDetection();
#endif

// Checkpoint related.
checkpoint_manager_ = new CheckpointManager(txn_manager_, log_manager_, buffer_pool_manager_);
checkpoint_manager_ =
std::make_unique<CheckpointManager>(txn_manager_.get(), log_manager_.get(), buffer_pool_manager_.get());

// Catalog.
catalog_ = new Catalog(buffer_pool_manager_, lock_manager_, log_manager_);
// Catalog related.
catalog_ = std::make_unique<Catalog>(buffer_pool_manager_.get(), lock_manager_.get(), log_manager_.get());

// Execution engine.
execution_engine_ = new ExecutionEngine(buffer_pool_manager_, txn_manager_, catalog_);
// Execution engine related.
execution_engine_ = std::make_unique<ExecutionEngine>(buffer_pool_manager_.get(), txn_manager_.get(), catalog_.get());
}

void BustubInstance::CmdDisplayTables(ResultWriter &writer) {
Expand Down Expand Up @@ -354,14 +357,6 @@ BustubInstance::~BustubInstance() {
if (enable_logging) {
log_manager_->StopFlushThread();
}
delete execution_engine_;
delete catalog_;
delete checkpoint_manager_;
delete log_manager_;
delete buffer_pool_manager_;
delete lock_manager_;
delete txn_manager_;
delete disk_manager_;
}

} // namespace bustub
19 changes: 10 additions & 9 deletions src/include/common/bustub_instance.h
Original file line number Diff line number Diff line change
Expand Up @@ -250,17 +250,18 @@ class BustubInstance {
*/
void GenerateMockTable();

// TODO(chi): change to unique_ptr. Currently they're directly referenced by recovery test, so
// Currently the followings are directly referenced by recovery test, so
// we cannot do anything on them until someone decides to refactor the recovery test.

DiskManager *disk_manager_;
BufferPoolManager *buffer_pool_manager_;
LockManager *lock_manager_;
TransactionManager *txn_manager_;
LogManager *log_manager_;
CheckpointManager *checkpoint_manager_;
Catalog *catalog_;
ExecutionEngine *execution_engine_;
std::unique_ptr<DiskManager> disk_manager_;
std::unique_ptr<BufferPoolManager> buffer_pool_manager_;
std::unique_ptr<LockManager> lock_manager_;
std::unique_ptr<TransactionManager> txn_manager_;
std::unique_ptr<LogManager> log_manager_;
std::unique_ptr<CheckpointManager> checkpoint_manager_;
std::unique_ptr<Catalog> catalog_;
std::unique_ptr<ExecutionEngine> execution_engine_;
/** Coordination for catalog */
std::shared_mutex catalog_lock_;

auto GetSessionVariable(const std::string &key) -> std::string {
Expand Down

0 comments on commit 942f7c3

Please sign in to comment.