mirror of
https://github.com/facebook/sapling.git
synced 2024-10-07 07:17:55 +03:00
Remove unique_ptr Wrapping Deltas in Journal Methods
Summary: Replace the uses of std::unique_ptr<JournalDelta> with just the JournalDelta itself to avoid an extra allocation. Reviewed By: chadaustin, strager Differential Revision: D16572089 fbshipit-source-id: be080b2fb9096f6c8783e2ecae21a99466336f6f
This commit is contained in:
parent
c791040e1a
commit
256b962c6a
@ -11,41 +11,39 @@ namespace facebook {
|
||||
namespace eden {
|
||||
|
||||
void Journal::recordCreated(RelativePathPiece fileName) {
|
||||
addDelta(std::make_unique<JournalDelta>(fileName, JournalDelta::CREATED));
|
||||
addDelta(JournalDelta(fileName, JournalDelta::CREATED));
|
||||
}
|
||||
|
||||
void Journal::recordRemoved(RelativePathPiece fileName) {
|
||||
addDelta(std::make_unique<JournalDelta>(fileName, JournalDelta::REMOVED));
|
||||
addDelta(JournalDelta(fileName, JournalDelta::REMOVED));
|
||||
}
|
||||
|
||||
void Journal::recordChanged(RelativePathPiece fileName) {
|
||||
addDelta(std::make_unique<JournalDelta>(fileName, JournalDelta::CHANGED));
|
||||
addDelta(JournalDelta(fileName, JournalDelta::CHANGED));
|
||||
}
|
||||
|
||||
void Journal::recordRenamed(
|
||||
RelativePathPiece oldName,
|
||||
RelativePathPiece newName) {
|
||||
addDelta(
|
||||
std::make_unique<JournalDelta>(oldName, newName, JournalDelta::RENAMED));
|
||||
addDelta(JournalDelta(oldName, newName, JournalDelta::RENAMED));
|
||||
}
|
||||
|
||||
void Journal::recordReplaced(
|
||||
RelativePathPiece oldName,
|
||||
RelativePathPiece newName) {
|
||||
addDelta(
|
||||
std::make_unique<JournalDelta>(oldName, newName, JournalDelta::REPLACED));
|
||||
addDelta(JournalDelta(oldName, newName, JournalDelta::REPLACED));
|
||||
}
|
||||
|
||||
void Journal::recordHashUpdate(Hash toHash) {
|
||||
auto delta = std::make_unique<JournalDelta>();
|
||||
delta->toHash = toHash;
|
||||
JournalDelta delta;
|
||||
delta.toHash = toHash;
|
||||
addDelta(std::move(delta));
|
||||
}
|
||||
|
||||
void Journal::recordHashUpdate(Hash fromHash, Hash toHash) {
|
||||
auto delta = std::make_unique<JournalDelta>();
|
||||
delta->fromHash = fromHash;
|
||||
delta->toHash = toHash;
|
||||
JournalDelta delta;
|
||||
delta.fromHash = fromHash;
|
||||
delta.toHash = toHash;
|
||||
addDelta(std::move(delta));
|
||||
}
|
||||
|
||||
@ -53,10 +51,10 @@ void Journal::recordUncleanPaths(
|
||||
Hash fromHash,
|
||||
Hash toHash,
|
||||
std::unordered_set<RelativePath>&& uncleanPaths) {
|
||||
auto delta = std::make_unique<JournalDelta>();
|
||||
delta->fromHash = fromHash;
|
||||
delta->toHash = toHash;
|
||||
delta->uncleanPaths = std::move(uncleanPaths);
|
||||
JournalDelta delta;
|
||||
delta.fromHash = fromHash;
|
||||
delta.toHash = toHash;
|
||||
delta.uncleanPaths = std::move(uncleanPaths);
|
||||
addDelta(std::move(delta));
|
||||
}
|
||||
|
||||
@ -71,19 +69,19 @@ void Journal::truncateIfNecessary(DeltaState& deltaState) {
|
||||
}
|
||||
|
||||
void Journal::addDeltaWithoutNotifying(
|
||||
std::unique_ptr<JournalDelta> delta,
|
||||
JournalDelta&& delta,
|
||||
DeltaState& deltaState) {
|
||||
delta->sequenceID = deltaState.nextSequence++;
|
||||
delta.sequenceID = deltaState.nextSequence++;
|
||||
|
||||
delta->time = std::chrono::steady_clock::now();
|
||||
delta.time = std::chrono::steady_clock::now();
|
||||
|
||||
// If the hashes were not set to anything, default to copying
|
||||
// the value from the prior journal entry
|
||||
if (!deltaState.deltas.empty() && delta->fromHash == kZeroHash &&
|
||||
delta->toHash == kZeroHash) {
|
||||
if (!deltaState.deltas.empty() && delta.fromHash == kZeroHash &&
|
||||
delta.toHash == kZeroHash) {
|
||||
JournalDelta& previous = deltaState.deltas.back();
|
||||
delta->fromHash = previous.toHash;
|
||||
delta->toHash = delta->fromHash;
|
||||
delta.fromHash = previous.toHash;
|
||||
delta.toHash = delta.fromHash;
|
||||
}
|
||||
|
||||
// Check memory before adding the new delta to make sure we always
|
||||
@ -101,24 +99,24 @@ void Journal::addDeltaWithoutNotifying(
|
||||
// and 4 are the same modification, accumulateRange(3) would have a
|
||||
// fromSequence of 3 without compaction and a fromSequence of 4 with
|
||||
// compaction]
|
||||
if (!deltaState.deltas.empty() && delta->isModification() &&
|
||||
delta->isSameAction(deltaState.deltas.back())) {
|
||||
deltaState.stats->latestTimestamp = delta->time;
|
||||
if (!deltaState.deltas.empty() && delta.isModification() &&
|
||||
delta.isSameAction(deltaState.deltas.back())) {
|
||||
deltaState.stats->latestTimestamp = delta.time;
|
||||
deltaState.stats->memoryUsage -=
|
||||
deltaState.deltas.back().estimateMemoryUsage();
|
||||
deltaState.stats->memoryUsage += delta->estimateMemoryUsage();
|
||||
deltaState.deltas.back() = std::move(*delta);
|
||||
deltaState.stats->memoryUsage += delta.estimateMemoryUsage();
|
||||
deltaState.deltas.back() = std::move(delta);
|
||||
} else {
|
||||
if (deltaState.stats) {
|
||||
++(deltaState.stats->entryCount);
|
||||
deltaState.stats->memoryUsage += delta->estimateMemoryUsage();
|
||||
deltaState.stats->memoryUsage += delta.estimateMemoryUsage();
|
||||
} else {
|
||||
deltaState.stats = JournalStats();
|
||||
deltaState.stats->entryCount = 1;
|
||||
deltaState.stats->memoryUsage = delta->estimateMemoryUsage();
|
||||
deltaState.stats->memoryUsage = delta.estimateMemoryUsage();
|
||||
}
|
||||
deltaState.stats->latestTimestamp = delta->time;
|
||||
deltaState.deltas.emplace_back(std::move(*delta));
|
||||
deltaState.stats->latestTimestamp = delta.time;
|
||||
deltaState.deltas.emplace_back(std::move(delta));
|
||||
}
|
||||
|
||||
deltaState.stats->earliestTimestamp = deltaState.deltas.front().time;
|
||||
@ -131,7 +129,7 @@ void Journal::notifySubscribers() const {
|
||||
}
|
||||
}
|
||||
|
||||
void Journal::addDelta(std::unique_ptr<JournalDelta> delta) {
|
||||
void Journal::addDelta(JournalDelta&& delta) {
|
||||
{
|
||||
auto deltaState = deltaState_.wlock();
|
||||
addDeltaWithoutNotifying(std::move(delta), *deltaState);
|
||||
@ -223,7 +221,7 @@ void Journal::flush() {
|
||||
: deltaState->deltas.back().toHash;
|
||||
deltaState->deltas.clear();
|
||||
deltaState->stats = std::nullopt;
|
||||
auto delta = std::make_unique<JournalDelta>();
|
||||
auto delta = JournalDelta();
|
||||
/* Tracking the hash correctly when the journal is flushed is important
|
||||
* since Watchman uses the hash to correctly determine what additional files
|
||||
* were changed when a checkout happens, journals have at least one entry
|
||||
@ -231,8 +229,8 @@ void Journal::flush() {
|
||||
* operation should leave us on the same checkout we were on before the
|
||||
* flush operation.
|
||||
*/
|
||||
delta->fromHash = lastHash;
|
||||
delta->toHash = lastHash;
|
||||
delta.fromHash = lastHash;
|
||||
delta.toHash = lastHash;
|
||||
addDeltaWithoutNotifying(std::move(delta), *deltaState);
|
||||
}
|
||||
notifySubscribers();
|
||||
|
@ -168,7 +168,7 @@ class Journal {
|
||||
* The delta will have a new sequence number and timestamp
|
||||
* applied.
|
||||
*/
|
||||
void addDelta(std::unique_ptr<JournalDelta> delta);
|
||||
void addDelta(JournalDelta&& delta);
|
||||
|
||||
static constexpr size_t kDefaultJournalMemoryLimit = 1000000000;
|
||||
|
||||
@ -199,9 +199,7 @@ class Journal {
|
||||
* The delta will have a new sequence number and timestamp
|
||||
* applied. A lock to the deltaState must be held and passed to this function.
|
||||
*/
|
||||
void addDeltaWithoutNotifying(
|
||||
std::unique_ptr<JournalDelta> delta,
|
||||
DeltaState& deltaState);
|
||||
void addDeltaWithoutNotifying(JournalDelta&& delta, DeltaState& deltaState);
|
||||
|
||||
/** Notify subscribers that a change has happened, should be called with no
|
||||
* Journal locks held.
|
||||
|
Loading…
Reference in New Issue
Block a user