OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project 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 #ifndef V8_SLOT_SET_H | 5 #ifndef V8_SLOT_SET_H |
6 #define V8_SLOT_SET_H | 6 #define V8_SLOT_SET_H |
7 | 7 |
8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
9 #include "src/base/atomic-utils.h" | 9 #include "src/base/atomic-utils.h" |
10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
(...skipping 30 matching lines...) Expand all Loading... |
41 // This method should only be called on the main thread because concurrent | 41 // This method should only be called on the main thread because concurrent |
42 // allocation of the bucket is not thread-safe. | 42 // allocation of the bucket is not thread-safe. |
43 void Insert(int slot_offset) { | 43 void Insert(int slot_offset) { |
44 int bucket_index, cell_index, bit_index; | 44 int bucket_index, cell_index, bit_index; |
45 SlotToIndices(slot_offset, &bucket_index, &cell_index, &bit_index); | 45 SlotToIndices(slot_offset, &bucket_index, &cell_index, &bit_index); |
46 base::AtomicValue<uint32_t>* current_bucket = bucket[bucket_index].Value(); | 46 base::AtomicValue<uint32_t>* current_bucket = bucket[bucket_index].Value(); |
47 if (current_bucket == nullptr) { | 47 if (current_bucket == nullptr) { |
48 current_bucket = AllocateBucket(); | 48 current_bucket = AllocateBucket(); |
49 bucket[bucket_index].SetValue(current_bucket); | 49 bucket[bucket_index].SetValue(current_bucket); |
50 } | 50 } |
51 current_bucket[cell_index].SetBit(bit_index); | 51 if (!(current_bucket[cell_index].Value() & (1u << bit_index))) { |
| 52 current_bucket[cell_index].SetBit(bit_index); |
| 53 } |
52 } | 54 } |
53 | 55 |
54 // The slot offset specifies a slot at address page_start_ + slot_offset. | 56 // The slot offset specifies a slot at address page_start_ + slot_offset. |
55 void Remove(int slot_offset) { | 57 void Remove(int slot_offset) { |
56 int bucket_index, cell_index, bit_index; | 58 int bucket_index, cell_index, bit_index; |
57 SlotToIndices(slot_offset, &bucket_index, &cell_index, &bit_index); | 59 SlotToIndices(slot_offset, &bucket_index, &cell_index, &bit_index); |
58 base::AtomicValue<uint32_t>* current_bucket = bucket[bucket_index].Value(); | 60 base::AtomicValue<uint32_t>* current_bucket = bucket[bucket_index].Value(); |
59 if (current_bucket != nullptr) { | 61 if (current_bucket != nullptr) { |
60 uint32_t cell = current_bucket[cell_index].Value(); | 62 uint32_t cell = current_bucket[cell_index].Value(); |
61 if (cell) { | 63 if (cell) { |
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 }; | 412 }; |
411 | 413 |
412 Address page_start_; | 414 Address page_start_; |
413 base::AtomicValue<Chunk*> chunk_; | 415 base::AtomicValue<Chunk*> chunk_; |
414 }; | 416 }; |
415 | 417 |
416 } // namespace internal | 418 } // namespace internal |
417 } // namespace v8 | 419 } // namespace v8 |
418 | 420 |
419 #endif // V8_SLOT_SET_H | 421 #endif // V8_SLOT_SET_H |
OLD | NEW |