From 59fcee6bc02107bdabebd443054e3ae2fd5fd8df Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 5 Jul 2018 13:30:48 -0700 Subject: [PATCH] improved clear() and avoid bad indices --- libraries/workload/src/workload/Space.cpp | 8 ++++++-- libraries/workload/src/workload/Space.h | 4 ++-- libraries/workload/src/workload/Transaction.cpp | 6 ++++++ libraries/workload/src/workload/Transaction.h | 2 ++ 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/libraries/workload/src/workload/Space.cpp b/libraries/workload/src/workload/Space.cpp index 54fad79741..747df5f6c4 100644 --- a/libraries/workload/src/workload/Space.cpp +++ b/libraries/workload/src/workload/Space.cpp @@ -46,7 +46,7 @@ void Space::processResets(const Transaction::Resets& transactions) { auto proxyID = std::get<0>(reset); // Guard against proxyID being past the end of the list. - if (proxyID < 0 || proxyID >= (int32_t)_proxies.size() || proxyID >= (int32_t)_owners.size()) { + if (!_IDAllocator.checkIndex(proxyID)) { continue; } auto& item = _proxies[proxyID]; @@ -61,6 +61,9 @@ void Space::processResets(const Transaction::Resets& transactions) { void Space::processRemoves(const Transaction::Removes& transactions) { for (auto removedID : transactions) { + if (!_IDAllocator.checkIndex(removedID)) { + continue; + } _IDAllocator.freeIndex(removedID); // Access the true item @@ -75,7 +78,7 @@ void Space::processRemoves(const Transaction::Removes& transactions) { void Space::processUpdates(const Transaction::Updates& transactions) { for (auto& update : transactions) { auto updateID = std::get<0>(update); - if (updateID == INVALID_PROXY_ID) { + if (!_IDAllocator.checkIndex(updateID)) { continue; } @@ -141,6 +144,7 @@ uint8_t Space::getRegion(int32_t proxyID) const { } void Space::clear() { + Collection::clear(); std::unique_lock lock(_proxiesMutex); _IDAllocator.clear(); _proxies.clear(); diff --git a/libraries/workload/src/workload/Space.h b/libraries/workload/src/workload/Space.h index 960c905f7c..310955f4c6 100644 --- a/libraries/workload/src/workload/Space.h +++ b/libraries/workload/src/workload/Space.h @@ -42,7 +42,7 @@ public: uint32_t getNumViews() const { return (uint32_t)(_views.size()); } void copyViews(std::vector& copy) const; - uint32_t getNumObjects() const { return _IDAllocator.getNumLiveIndices(); } // (uint32_t)(_proxies.size() - _freeIndices.size()); } + uint32_t getNumObjects() const { return _IDAllocator.getNumLiveIndices(); } uint32_t getNumAllocatedProxies() const { return (uint32_t)(_IDAllocator.getNumAllocatedIndices()); } void categorizeAndGetChanges(std::vector& changes); @@ -51,7 +51,7 @@ public: const Owner getOwner(int32_t proxyID) const; uint8_t getRegion(int32_t proxyID) const; - void clear(); + void clear() override; private: void processTransactionFrame(const Transaction& transaction) override; diff --git a/libraries/workload/src/workload/Transaction.cpp b/libraries/workload/src/workload/Transaction.cpp index 31c28cdf22..14984e9c77 100644 --- a/libraries/workload/src/workload/Transaction.cpp +++ b/libraries/workload/src/workload/Transaction.cpp @@ -111,6 +111,12 @@ Collection::Collection() { Collection::~Collection() { } +void Collection::clear() { + std::unique_lock lock(_transactionQueueMutex); + _transactionQueue.clear(); + _transactionFrames.clear(); +} + ProxyID Collection::allocateID() { // Just increment and return the previous value initialized at 0 return _IDAllocator.allocateIndex(); diff --git a/libraries/workload/src/workload/Transaction.h b/libraries/workload/src/workload/Transaction.h index aa2a427127..22328cf4b1 100644 --- a/libraries/workload/src/workload/Transaction.h +++ b/libraries/workload/src/workload/Transaction.h @@ -137,6 +137,8 @@ public: Collection(); ~Collection(); + virtual void clear(); + // This call is thread safe, can be called from anywhere to allocate a new ID ProxyID allocateID();