| Index: gpu/command_buffer/client/mapped_memory.cc | 
| diff --git a/gpu/command_buffer/client/mapped_memory.cc b/gpu/command_buffer/client/mapped_memory.cc | 
| index 82829d48ec1cda6fd7534f596b95acbce03b8522..c367e696c50ef6dc01e4234a3273c40e513ec753 100644 | 
| --- a/gpu/command_buffer/client/mapped_memory.cc | 
| +++ b/gpu/command_buffer/client/mapped_memory.cc | 
| @@ -7,6 +7,7 @@ | 
| #include <algorithm> | 
| #include <functional> | 
|  | 
| +#include "base/debug/trace_event.h" | 
| #include "gpu/command_buffer/client/cmd_buffer_helper.h" | 
|  | 
| namespace gpu { | 
| @@ -18,9 +19,12 @@ MemoryChunk::MemoryChunk( | 
| allocator_(shm.size, helper, shm.ptr) { | 
| } | 
|  | 
| -MappedMemoryManager::MappedMemoryManager(CommandBufferHelper* helper) | 
| +MappedMemoryManager::MappedMemoryManager(CommandBufferHelper* helper, | 
| +                                         size_t unused_memory_reclaim_limit) | 
| : chunk_size_multiple_(1), | 
| -      helper_(helper) { | 
| +      helper_(helper), | 
| +      allocated_memory_(0), | 
| +      max_free_bytes_(unused_memory_reclaim_limit) { | 
| } | 
|  | 
| MappedMemoryManager::~MappedMemoryManager() { | 
| @@ -36,16 +40,38 @@ void* MappedMemoryManager::Alloc( | 
| unsigned int size, int32* shm_id, unsigned int* shm_offset) { | 
| GPU_DCHECK(shm_id); | 
| GPU_DCHECK(shm_offset); | 
| -  // See if any of the chucks can satisfy this request. | 
| -  for (size_t ii = 0; ii < chunks_.size(); ++ii) { | 
| -    MemoryChunk* chunk = chunks_[ii]; | 
| -    chunk->FreeUnused(); | 
| -    if (chunk->GetLargestFreeSizeWithoutWaiting() >= size) { | 
| -      void* mem = chunk->Alloc(size); | 
| -      GPU_DCHECK(mem); | 
| -      *shm_id = chunk->shm_id(); | 
| -      *shm_offset = chunk->GetOffset(mem); | 
| -      return mem; | 
| +  if (size <= allocated_memory_) { | 
| +    size_t total_bytes_in_use = 0; | 
| +    // See if any of the chunks can satisfy this request. | 
| +    for (size_t ii = 0; ii < chunks_.size(); ++ii) { | 
| +      MemoryChunk* chunk = chunks_[ii]; | 
| +      chunk->FreeUnused(); | 
| +      total_bytes_in_use += chunk->bytes_in_use(); | 
| +      if (chunk->GetLargestFreeSizeWithoutWaiting() >= size) { | 
| +        void* mem = chunk->Alloc(size); | 
| +        GPU_DCHECK(mem); | 
| +        *shm_id = chunk->shm_id(); | 
| +        *shm_offset = chunk->GetOffset(mem); | 
| +        return mem; | 
| +      } | 
| +    } | 
| + | 
| +    // If there is a memory limit being enforced and total free | 
| +    // memory (allocated_memory_ - total_bytes_in_use) is larger than | 
| +    // the limit try waiting. | 
| +    if (max_free_bytes_ != kNoLimit && | 
| +        (allocated_memory_ - total_bytes_in_use) >= max_free_bytes_) { | 
| +      TRACE_EVENT0("gpu", "MappedMemoryManager::Alloc::wait"); | 
| +      for (size_t ii = 0; ii < chunks_.size(); ++ii) { | 
| +        MemoryChunk* chunk = chunks_[ii]; | 
| +        if (chunk->GetLargestFreeSizeWithWaiting() >= size) { | 
| +          void* mem = chunk->Alloc(size); | 
| +          GPU_DCHECK(mem); | 
| +          *shm_id = chunk->shm_id(); | 
| +          *shm_offset = chunk->GetOffset(mem); | 
| +          return mem; | 
| +        } | 
| +      } | 
| } | 
| } | 
|  | 
| @@ -59,6 +85,7 @@ void* MappedMemoryManager::Alloc( | 
| if (id  < 0) | 
| return NULL; | 
| MemoryChunk* mc = new MemoryChunk(id, shm, helper_); | 
| +  allocated_memory_ += mc->GetSize(); | 
| chunks_.push_back(mc); | 
| void* mem = mc->Alloc(size); | 
| GPU_DCHECK(mem); | 
| @@ -97,6 +124,7 @@ void MappedMemoryManager::FreeUnused() { | 
| chunk->FreeUnused(); | 
| if (!chunk->InUse()) { | 
| cmd_buf->DestroyTransferBuffer(chunk->shm_id()); | 
| +      allocated_memory_ -= chunk->GetSize(); | 
| iter = chunks_.erase(iter); | 
| } else { | 
| ++iter; | 
| @@ -105,6 +133,3 @@ void MappedMemoryManager::FreeUnused() { | 
| } | 
|  | 
| }  // namespace gpu | 
| - | 
| - | 
| - | 
|  |