for (auto l : logs_to_free_) {
delete l;
}
+ for (auto& log : logs_) {
+ log.ClearWriter();
+ }
logs_.clear();
// versions need to be destroyed before table_cache since it can hold
// logs_ could have changed while we were waiting.
continue;
}
- logs_to_free_.push_back(log.writer.release());
+ logs_to_free_.push_back(log.ReleaseWriter());
logs_.pop_front();
}
// Current log cannot be obsolete.
auto& log = *it;
assert(!log.getting_synced);
log.getting_synced = true;
- logs_to_sync.push_back(log.writer.get());
+ logs_to_sync.push_back(log.writer);
}
need_log_dir_sync = !log_dir_synced_;
auto& log = *it;
assert(log.getting_synced);
if (status.ok() && logs_.size() > 1) {
- logs_to_free_.push_back(log.writer.release());
+ logs_to_free_.push_back(log.ReleaseWriter());
logs_.erase(it++);
} else {
log.getting_synced = false;
assert(new_log != nullptr);
log_empty_ = true;
log_dir_synced_ = false;
- logs_.emplace_back(logfile_number_, std::unique_ptr<log::Writer>(new_log));
+ logs_.emplace_back(logfile_number_, new_log);
alive_log_files_.push_back(LogFileNumberSize(logfile_number_));
for (auto loop_cfd : *versions_->GetColumnFamilySet()) {
// all this is just optimization to delete logs that
impl->logfile_number_ = new_log_number;
unique_ptr<WritableFileWriter> file_writer(
new WritableFileWriter(std::move(lfile), opt_env_options));
- impl->logs_.emplace_back(
- new_log_number,
- std::unique_ptr<log::Writer>(
- new log::Writer(std::move(file_writer))));
+ impl->logs_.emplace_back(new_log_number,
+ new log::Writer(std::move(file_writer)));
// set column family handles
for (auto cf : column_families) {
bool getting_flushed = false;
};
struct LogWriterNumber {
- LogWriterNumber(uint64_t _number, std::unique_ptr<log::Writer> _writer)
- : number(_number), writer(std::move(_writer)) {}
+ // pass ownership of _writer
+ LogWriterNumber(uint64_t _number, log::Writer* _writer)
+ : number(_number), writer(_writer) {}
+
+ log::Writer* ReleaseWriter() {
+ auto* w = writer;
+ writer = nullptr;
+ return w;
+ }
+ void ClearWriter() {
+ delete writer;
+ writer = nullptr;
+ }
+
uint64_t number;
- std::unique_ptr<log::Writer> writer;
+ // Visual Studio doesn't support deque's member to be noncopyable because
+ // of a unique_ptr as a member.
+ log::Writer* writer; // own
// true for some prefix of logs_
bool getting_synced = false;
};