tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

LSWriteOptimizer.cpp (1962B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
      5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #include "LSWriteOptimizer.h"
      8 
      9 #include <new>
     10 
     11 #include "nsBaseHashtable.h"
     12 #include "nsTArray.h"
     13 
     14 namespace mozilla::dom {
     15 
     16 class LSWriteOptimizerBase::WriteInfoComparator {
     17 public:
     18  bool Equals(const WriteInfo* a, const WriteInfo* b) const {
     19    MOZ_ASSERT(a && b);
     20    return a->SerialNumber() == b->SerialNumber();
     21  }
     22 
     23  bool LessThan(const WriteInfo* a, const WriteInfo* b) const {
     24    MOZ_ASSERT(a && b);
     25    return a->SerialNumber() < b->SerialNumber();
     26  }
     27 };
     28 
     29 void LSWriteOptimizerBase::DeleteItem(const nsAString& aKey, int64_t aDelta) {
     30  AssertIsOnOwningThread();
     31 
     32  mWriteInfos.WithEntryHandle(aKey, [&](auto&& entry) {
     33    if (entry && entry.Data()->GetType() == WriteInfo::InsertItem) {
     34      entry.Remove();
     35    } else {
     36      entry.InsertOrUpdate(
     37          MakeUnique<DeleteItemInfo>(NextSerialNumber(), aKey));
     38    }
     39  });
     40 
     41  mTotalDelta += aDelta;
     42 }
     43 
     44 void LSWriteOptimizerBase::Truncate(int64_t aDelta) {
     45  AssertIsOnOwningThread();
     46 
     47  mWriteInfos.Clear();
     48 
     49  if (!mTruncateInfo) {
     50    mTruncateInfo = MakeUnique<TruncateInfo>(NextSerialNumber());
     51  }
     52 
     53  mTotalDelta += aDelta;
     54 }
     55 
     56 void LSWriteOptimizerBase::GetSortedWriteInfos(
     57    nsTArray<NotNull<WriteInfo*>>& aWriteInfos) {
     58  AssertIsOnOwningThread();
     59 
     60  if (mTruncateInfo) {
     61    aWriteInfos.InsertElementSorted(WrapNotNullUnchecked(mTruncateInfo.get()),
     62                                    WriteInfoComparator());
     63  }
     64 
     65  for (const auto& entry : mWriteInfos) {
     66    WriteInfo* writeInfo = entry.GetWeak();
     67 
     68    aWriteInfos.InsertElementSorted(WrapNotNull(writeInfo),
     69                                    WriteInfoComparator());
     70  }
     71 }
     72 
     73 }  // namespace mozilla::dom