Chromium Code Reviews| Index: runtime/vm/freelist.cc |
| =================================================================== |
| --- runtime/vm/freelist.cc (revision 39381) |
| +++ runtime/vm/freelist.cc (working copy) |
| @@ -5,11 +5,12 @@ |
| #include "vm/freelist.h" |
| #include <map> |
| -#include <utility> |
| #include "vm/bit_set.h" |
| +#include "vm/lockers.h" |
| #include "vm/object.h" |
| #include "vm/raw_object.h" |
| +#include "vm/thread.h" |
| namespace dart { |
| @@ -49,17 +50,24 @@ |
| } |
| -FreeList::FreeList() { |
| +FreeList::FreeList() : mutex_(new Mutex()) { |
| Reset(); |
| } |
| FreeList::~FreeList() { |
| - // Nothing to release. |
| + delete mutex_; |
| } |
| uword FreeList::TryAllocate(intptr_t size, bool is_protected) { |
| + MutexLocker ml(mutex_); |
| + return TryAllocateLocked(size, is_protected); |
| +} |
| + |
| + |
| +uword FreeList::TryAllocateLocked(intptr_t size, bool is_protected) { |
| + DEBUG_ASSERT(mutex_->Owner() == Isolate::Current()); |
| // Precondition: is_protected is false or else all free list elements are |
| // in non-writable pages. |
| @@ -166,6 +174,12 @@ |
| void FreeList::Free(uword addr, intptr_t size) { |
| + MutexLocker ml(mutex_); |
| + FreeLocked(addr, size); |
| +} |
| + |
| + |
| +void FreeList::FreeLocked(uword addr, intptr_t size) { |
|
koda
2014/08/20 00:10:21
Assert that it's actually locked.
Ivan Posva
2014/08/20 03:50:53
Done.
|
| // Precondition required by AsElement and EnqueueElement: the (page |
| // containing the) header of the freed block should be writable. This is |
| // the case when called for newly allocated pages because they are |
| @@ -179,6 +193,7 @@ |
| void FreeList::Reset() { |
| + MutexLocker ml(mutex_); |
| free_map_.Reset(); |
| for (int i = 0; i < (kNumLists + 1); i++) { |
| free_lists_[i] = NULL; |
| @@ -220,6 +235,7 @@ |
| intptr_t FreeList::Length(int index) const { |
| + MutexLocker ml(mutex_); |
| ASSERT(index >= 0); |
| ASSERT(index < kNumLists); |
| intptr_t result = 0; |
| @@ -290,6 +306,7 @@ |
| void FreeList::Print() const { |
| + MutexLocker ml(mutex_); |
| PrintSmall(); |
| PrintLarge(); |
| } |