OLD | NEW |
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/metrics/persistent_memory_allocator.h" | 5 #include "base/metrics/persistent_memory_allocator.h" |
6 | 6 |
7 #include <assert.h> | 7 #include <assert.h> |
8 #include <algorithm> | 8 #include <algorithm> |
9 | 9 |
10 #if defined(OS_WIN) | 10 #if defined(OS_WIN) |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 : allocator_(allocator), last_record_(0), record_count_(0) { | 155 : allocator_(allocator), last_record_(0), record_count_(0) { |
156 Reset(starting_after); | 156 Reset(starting_after); |
157 } | 157 } |
158 | 158 |
159 void PersistentMemoryAllocator::Iterator::Reset() { | 159 void PersistentMemoryAllocator::Iterator::Reset() { |
160 last_record_.store(kReferenceQueue, std::memory_order_relaxed); | 160 last_record_.store(kReferenceQueue, std::memory_order_relaxed); |
161 record_count_.store(0, std::memory_order_relaxed); | 161 record_count_.store(0, std::memory_order_relaxed); |
162 } | 162 } |
163 | 163 |
164 void PersistentMemoryAllocator::Iterator::Reset(Reference starting_after) { | 164 void PersistentMemoryAllocator::Iterator::Reset(Reference starting_after) { |
| 165 if (starting_after == 0) { |
| 166 Reset(); |
| 167 return; |
| 168 } |
| 169 |
165 last_record_.store(starting_after, std::memory_order_relaxed); | 170 last_record_.store(starting_after, std::memory_order_relaxed); |
166 record_count_.store(0, std::memory_order_relaxed); | 171 record_count_.store(0, std::memory_order_relaxed); |
167 | 172 |
168 // Ensure that the starting point is a valid, iterable block (meaning it can | 173 // Ensure that the starting point is a valid, iterable block (meaning it can |
169 // be read and has a non-zero "next" pointer). | 174 // be read and has a non-zero "next" pointer). |
170 const volatile BlockHeader* block = | 175 const volatile BlockHeader* block = |
171 allocator_->GetBlock(starting_after, 0, 0, false, false); | 176 allocator_->GetBlock(starting_after, 0, 0, false, false); |
172 if (!block || block->next.load(std::memory_order_relaxed) == 0) { | 177 if (!block || block->next.load(std::memory_order_relaxed) == 0) { |
173 NOTREACHED(); | 178 NOTREACHED(); |
174 last_record_.store(kReferenceQueue, std::memory_order_release); | 179 last_record_.store(kReferenceQueue, std::memory_order_release); |
(...skipping 988 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1163 if (!mem) { | 1168 if (!mem) { |
1164 // This should never happen but be tolerant if it does as corruption from | 1169 // This should never happen but be tolerant if it does as corruption from |
1165 // the outside is something to guard against. | 1170 // the outside is something to guard against. |
1166 NOTREACHED(); | 1171 NOTREACHED(); |
1167 return nullptr; | 1172 return nullptr; |
1168 } | 1173 } |
1169 return mem + offset_; | 1174 return mem + offset_; |
1170 } | 1175 } |
1171 | 1176 |
1172 } // namespace base | 1177 } // namespace base |
OLD | NEW |