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 <stack> | 8 #include <stack> |
9 | 9 |
10 #include "src/allocation.h" | 10 #include "src/allocation.h" |
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
394 Address addr = page_start_ + type_and_offset.second; | 394 Address addr = page_start_ + type_and_offset.second; |
395 if (callback(type, host_addr, addr) == KEEP_SLOT) { | 395 if (callback(type, host_addr, addr) == KEEP_SLOT) { |
396 new_count++; | 396 new_count++; |
397 empty = false; | 397 empty = false; |
398 } else { | 398 } else { |
399 buffer[i].Clear(); | 399 buffer[i].Clear(); |
400 } | 400 } |
401 } | 401 } |
402 } | 402 } |
403 | 403 |
| 404 Chunk* next = chunk->next.Value(); |
404 if (mode == PREFREE_EMPTY_CHUNKS && empty) { | 405 if (mode == PREFREE_EMPTY_CHUNKS && empty) { |
405 // We remove the chunk from the list but let it still point its next | 406 // We remove the chunk from the list but let it still point its next |
406 // chunk to allow concurrent iteration. | 407 // chunk to allow concurrent iteration. |
407 if (previous) { | 408 if (previous) { |
408 previous->next.SetValue(chunk->next.Value()); | 409 previous->next.SetValue(next); |
409 } else { | 410 } else { |
410 chunk_.SetValue(chunk->next.Value()); | 411 chunk_.SetValue(next); |
411 } | 412 } |
412 base::LockGuard<base::Mutex> guard(&to_be_freed_chunks_mutex_); | 413 base::LockGuard<base::Mutex> guard(&to_be_freed_chunks_mutex_); |
413 to_be_freed_chunks_.push(chunk); | 414 to_be_freed_chunks_.push(chunk); |
414 } else { | 415 } else { |
415 previous = chunk; | 416 previous = chunk; |
416 } | 417 } |
417 chunk = chunk->next.Value(); | 418 chunk = next; |
418 } | 419 } |
419 return new_count; | 420 return new_count; |
420 } | 421 } |
421 | 422 |
422 void FreeToBeFreedChunks() { | 423 void FreeToBeFreedChunks() { |
423 base::LockGuard<base::Mutex> guard(&to_be_freed_chunks_mutex_); | 424 base::LockGuard<base::Mutex> guard(&to_be_freed_chunks_mutex_); |
424 while (!to_be_freed_chunks_.empty()) { | 425 while (!to_be_freed_chunks_.empty()) { |
425 Chunk* top = to_be_freed_chunks_.top(); | 426 Chunk* top = to_be_freed_chunks_.top(); |
426 to_be_freed_chunks_.pop(); | 427 to_be_freed_chunks_.pop(); |
427 delete top; | 428 delete top; |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 Address page_start_; | 468 Address page_start_; |
468 base::AtomicValue<Chunk*> chunk_; | 469 base::AtomicValue<Chunk*> chunk_; |
469 base::Mutex to_be_freed_chunks_mutex_; | 470 base::Mutex to_be_freed_chunks_mutex_; |
470 std::stack<Chunk*> to_be_freed_chunks_; | 471 std::stack<Chunk*> to_be_freed_chunks_; |
471 }; | 472 }; |
472 | 473 |
473 } // namespace internal | 474 } // namespace internal |
474 } // namespace v8 | 475 } // namespace v8 |
475 | 476 |
476 #endif // V8_SLOT_SET_H | 477 #endif // V8_SLOT_SET_H |
OLD | NEW |