| Index: components/discardable_memory/service/discardable_shared_memory_manager.cc | 
| diff --git a/components/discardable_memory/service/discardable_shared_memory_manager.cc b/components/discardable_memory/service/discardable_shared_memory_manager.cc | 
| index 1036dc84d697ed5324d2f181a15b7b618cdddf46..6894c9300717f7a08d23f76e059ca8d53d7d10b4 100644 | 
| --- a/components/discardable_memory/service/discardable_shared_memory_manager.cc | 
| +++ b/components/discardable_memory/service/discardable_shared_memory_manager.cc | 
| @@ -29,6 +29,8 @@ | 
| #include "base/trace_event/trace_event.h" | 
| #include "build/build_config.h" | 
| #include "components/discardable_memory/common/discardable_shared_memory_heap.h" | 
| +#include "mojo/public/cpp/bindings/strong_binding.h" | 
| +#include "mojo/public/cpp/system/platform_handle.h" | 
|  | 
| #if defined(OS_LINUX) | 
| #include "base/files/file_path.h" | 
| @@ -57,6 +59,45 @@ uint64_t ClientProcessUniqueIdToTracingProcessId(int client_id) { | 
| 1; | 
| } | 
|  | 
| +class DiscardableSharedMemoryManagerProxy | 
| +    : public mojom::DiscardableSharedMemoryManager { | 
| + public: | 
| +  DiscardableSharedMemoryManagerProxy( | 
| +      int32_t client_id, | 
| +      ::discardable_memory::DiscardableSharedMemoryManager* manager) | 
| +      : client_id_(client_id), manager_(manager) {} | 
| + | 
| +  ~DiscardableSharedMemoryManagerProxy() override { | 
| +    manager_->ClientRemoved(client_id_); | 
| +  } | 
| + | 
| +  // mojom::DiscardableSharedMemoryManager overrides: | 
| +  void AllocateLockedDiscardableSharedMemory( | 
| +      uint32_t size, | 
| +      int32_t id, | 
| +      const AllocateLockedDiscardableSharedMemoryCallback& callback) override { | 
| +    base::SharedMemoryHandle handle; | 
| +    manager_->AllocateLockedDiscardableSharedMemoryForClient(client_id_, size, | 
| +                                                             id, &handle); | 
| +    mojo::ScopedSharedBufferHandle memory; | 
| +    if (handle != base::SharedMemory::NULLHandle()) { | 
| +      memory = | 
| +          mojo::WrapSharedMemoryHandle(handle, size, false /* ready_only */); | 
| +    } | 
| +    return callback.Run(std::move(memory)); | 
| +  } | 
| + | 
| +  void DeletedDiscardableSharedMemory(int32_t id) override { | 
| +    manager_->ClientRemoved(client_id_); | 
| +  } | 
| + | 
| + private: | 
| +  const int32_t client_id_; | 
| +  ::discardable_memory::DiscardableSharedMemoryManager* const manager_; | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(DiscardableSharedMemoryManagerProxy); | 
| +}; | 
| + | 
| class DiscardableMemoryImpl : public base::DiscardableMemory { | 
| public: | 
| DiscardableMemoryImpl( | 
| @@ -180,7 +221,8 @@ DiscardableSharedMemoryManager::MemorySegment::MemorySegment( | 
| DiscardableSharedMemoryManager::MemorySegment::~MemorySegment() {} | 
|  | 
| DiscardableSharedMemoryManager::DiscardableSharedMemoryManager() | 
| -    : default_memory_limit_(GetDefaultMemoryLimit()), | 
| +    : last_client_id_(0), | 
| +      default_memory_limit_(GetDefaultMemoryLimit()), | 
| memory_limit_(default_memory_limit_), | 
| bytes_allocated_(0), | 
| memory_pressure_listener_(new base::MemoryPressureListener( | 
| @@ -209,19 +251,23 @@ DiscardableSharedMemoryManager* DiscardableSharedMemoryManager::current() { | 
| return g_discardable_shared_memory_manager.Pointer(); | 
| } | 
|  | 
| +DiscardableSharedMemoryManager::BindCallback | 
| +DiscardableSharedMemoryManager::GetBindCallback() { | 
| +  return base::Bind(&DiscardableSharedMemoryManager::Bind, | 
| +                    weak_ptr_factory_.GetWeakPtr()); | 
| +} | 
| + | 
| std::unique_ptr<base::DiscardableMemory> | 
| DiscardableSharedMemoryManager::AllocateLockedDiscardableMemory(size_t size) { | 
| DCHECK_NE(size, 0u); | 
|  | 
| -  DiscardableSharedMemoryId new_id = | 
| -      g_next_discardable_shared_memory_id.GetNext(); | 
| -  base::ProcessHandle current_process_handle = base::GetCurrentProcessHandle(); | 
| +  int32_t new_id = g_next_discardable_shared_memory_id.GetNext(); | 
|  | 
| // Note: Use DiscardableSharedMemoryHeap for in-process allocation | 
| // of discardable memory if the cost of each allocation is too high. | 
| base::SharedMemoryHandle handle; | 
| -  AllocateLockedDiscardableSharedMemory( | 
| -      current_process_handle, kInvalidUniqueClientID, size, new_id, &handle); | 
| +  AllocateLockedDiscardableSharedMemory(kInvalidUniqueClientID, size, new_id, | 
| +                                        &handle); | 
| std::unique_ptr<base::DiscardableSharedMemory> memory( | 
| new base::DiscardableSharedMemory(handle)); | 
| if (!memory->Map(size)) | 
| @@ -308,17 +354,16 @@ bool DiscardableSharedMemoryManager::OnMemoryDump( | 
|  | 
| void DiscardableSharedMemoryManager:: | 
| AllocateLockedDiscardableSharedMemoryForClient( | 
| -        base::ProcessHandle process_handle, | 
| int client_id, | 
| size_t size, | 
| -        DiscardableSharedMemoryId id, | 
| +        int32_t id, | 
| base::SharedMemoryHandle* shared_memory_handle) { | 
| -  AllocateLockedDiscardableSharedMemory(process_handle, client_id, size, id, | 
| +  AllocateLockedDiscardableSharedMemory(client_id, size, id, | 
| shared_memory_handle); | 
| } | 
|  | 
| void DiscardableSharedMemoryManager::ClientDeletedDiscardableSharedMemory( | 
| -    DiscardableSharedMemoryId id, | 
| +    int32_t id, | 
| int client_id) { | 
| DeletedDiscardableSharedMemory(id, client_id); | 
| } | 
| @@ -361,6 +406,13 @@ size_t DiscardableSharedMemoryManager::GetBytesAllocated() { | 
| return bytes_allocated_; | 
| } | 
|  | 
| +void DiscardableSharedMemoryManager::Bind( | 
| +    mojom::DiscardableSharedMemoryManagerRequest request) { | 
| +  mojo::MakeStrongBinding(base::MakeUnique<DiscardableSharedMemoryManagerProxy>( | 
| +                              ++last_client_id_, this), | 
| +                          std::move(request)); | 
| +} | 
| + | 
| void DiscardableSharedMemoryManager::OnMemoryStateChange( | 
| base::MemoryState state) { | 
| switch (state) { | 
| @@ -380,10 +432,9 @@ void DiscardableSharedMemoryManager::OnMemoryStateChange( | 
| } | 
|  | 
| void DiscardableSharedMemoryManager::AllocateLockedDiscardableSharedMemory( | 
| -    base::ProcessHandle process_handle, | 
| int client_id, | 
| size_t size, | 
| -    DiscardableSharedMemoryId id, | 
| +    int32_t id, | 
| base::SharedMemoryHandle* shared_memory_handle) { | 
| base::AutoLock lock(lock_); | 
|  | 
| @@ -416,11 +467,7 @@ void DiscardableSharedMemoryManager::AllocateLockedDiscardableSharedMemory( | 
| return; | 
| } | 
|  | 
| -  if (!memory->ShareToProcess(process_handle, shared_memory_handle)) { | 
| -    LOG(ERROR) << "Cannot share discardable memory segment"; | 
| -    *shared_memory_handle = base::SharedMemory::NULLHandle(); | 
| -    return; | 
| -  } | 
| +  *shared_memory_handle = base::SharedMemory::DuplicateHandle(memory->handle()); | 
|  | 
| // Close file descriptor to avoid running out. | 
| memory->Close(); | 
| @@ -445,7 +492,7 @@ void DiscardableSharedMemoryManager::AllocateLockedDiscardableSharedMemory( | 
| } | 
|  | 
| void DiscardableSharedMemoryManager::DeletedDiscardableSharedMemory( | 
| -    DiscardableSharedMemoryId id, | 
| +    int32_t id, | 
| int client_id) { | 
| base::AutoLock lock(lock_); | 
|  | 
|  |