Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(36)

Side by Side Diff: services/file/file_service.cc

Issue 2722293002: Fix lifetime of leveldb::MojoEnv instances. (Closed)
Patch Set: annotate leaks Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium 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 #include "services/file/file_service.h" 5 #include "services/file/file_service.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/memory/ptr_util.h" 8 #include "base/memory/ptr_util.h"
9 #include "base/memory/weak_ptr.h" 9 #include "base/memory/weak_ptr.h"
10 #include "components/filesystem/lock_table.h" 10 #include "components/filesystem/lock_table.h"
11 #include "components/leveldb/env_mojo.h"
11 #include "components/leveldb/leveldb_service_impl.h" 12 #include "components/leveldb/leveldb_service_impl.h"
12 #include "mojo/public/cpp/bindings/strong_binding.h" 13 #include "mojo/public/cpp/bindings/strong_binding.h"
13 #include "services/file/file_system.h" 14 #include "services/file/file_system.h"
14 #include "services/file/user_id_map.h" 15 #include "services/file/user_id_map.h"
15 #include "services/service_manager/public/cpp/connection.h" 16 #include "services/service_manager/public/cpp/connection.h"
16 #include "services/service_manager/public/cpp/service_context.h" 17 #include "services/service_manager/public/cpp/service_context.h"
17 18
18 namespace file { 19 namespace file {
19 20
20 class FileService::FileSystemObjects 21 class FileService::FileSystemObjects
(...skipping 19 matching lines...) Expand all
40 scoped_refptr<filesystem::LockTable> lock_table_; 41 scoped_refptr<filesystem::LockTable> lock_table_;
41 base::FilePath user_dir_; 42 base::FilePath user_dir_;
42 43
43 DISALLOW_COPY_AND_ASSIGN(FileSystemObjects); 44 DISALLOW_COPY_AND_ASSIGN(FileSystemObjects);
44 }; 45 };
45 46
46 class FileService::LevelDBServiceObjects 47 class FileService::LevelDBServiceObjects
47 : public base::SupportsWeakPtr<LevelDBServiceObjects> { 48 : public base::SupportsWeakPtr<LevelDBServiceObjects> {
48 public: 49 public:
49 // Created on the main thread. 50 // Created on the main thread.
50 LevelDBServiceObjects( 51 LevelDBServiceObjects(leveldb::MojoEnv* env) : env_(env) {}
51 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner)
52 : file_task_runner_(std::move(file_task_runner)) {}
53 52
54 // Destroyed on the |leveldb_service_runner_|. 53 // Destroyed on the |leveldb_service_runner_|.
55 ~LevelDBServiceObjects() {} 54 ~LevelDBServiceObjects() {}
56 55
57 // Called on the |leveldb_service_runner_|. 56 // Called on the |leveldb_service_runner_|.
58 void OnLevelDBServiceRequest(const service_manager::Identity& remote_identity, 57 void OnLevelDBServiceRequest(const service_manager::Identity& remote_identity,
59 leveldb::mojom::LevelDBServiceRequest request) { 58 leveldb::mojom::LevelDBServiceRequest request) {
60 if (!leveldb_service_) 59 if (!leveldb_service_)
61 leveldb_service_.reset( 60 leveldb_service_.reset(new leveldb::LevelDBServiceImpl(env_));
62 new leveldb::LevelDBServiceImpl(file_task_runner_));
63 leveldb_bindings_.AddBinding(leveldb_service_.get(), std::move(request)); 61 leveldb_bindings_.AddBinding(leveldb_service_.get(), std::move(request));
64 } 62 }
65 63
66 private: 64 private:
67 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_;
68
69 // Variables that are only accessible on the |leveldb_service_runner_| thread. 65 // Variables that are only accessible on the |leveldb_service_runner_| thread.
70 std::unique_ptr<leveldb::mojom::LevelDBService> leveldb_service_; 66 std::unique_ptr<leveldb::mojom::LevelDBService> leveldb_service_;
71 mojo::BindingSet<leveldb::mojom::LevelDBService> leveldb_bindings_; 67 mojo::BindingSet<leveldb::mojom::LevelDBService> leveldb_bindings_;
72 68
69 leveldb::MojoEnv* env_;
70
73 DISALLOW_COPY_AND_ASSIGN(LevelDBServiceObjects); 71 DISALLOW_COPY_AND_ASSIGN(LevelDBServiceObjects);
74 }; 72 };
75 73
76 std::unique_ptr<service_manager::Service> CreateFileService( 74 std::unique_ptr<service_manager::Service> CreateFileService(
77 scoped_refptr<base::SingleThreadTaskRunner> file_service_runner, 75 leveldb::MojoEnv* leveldb_env,
78 scoped_refptr<base::SingleThreadTaskRunner> leveldb_service_runner) { 76 scoped_refptr<base::SingleThreadTaskRunner> leveldb_service_runner) {
79 return base::MakeUnique<FileService>(std::move(file_service_runner), 77 return base::MakeUnique<FileService>(leveldb_env,
80 std::move(leveldb_service_runner)); 78 std::move(leveldb_service_runner));
81 } 79 }
82 80
83 FileService::FileService( 81 FileService::FileService(
84 scoped_refptr<base::SingleThreadTaskRunner> file_service_runner, 82 leveldb::MojoEnv* leveldb_env,
85 scoped_refptr<base::SingleThreadTaskRunner> leveldb_service_runner) 83 scoped_refptr<base::SingleThreadTaskRunner> leveldb_service_runner)
86 : file_service_runner_(std::move(file_service_runner)), 84 : leveldb_env_(leveldb_env),
87 leveldb_service_runner_(std::move(leveldb_service_runner)) { 85 leveldb_service_runner_(std::move(leveldb_service_runner)) {
88 registry_.AddInterface<leveldb::mojom::LevelDBService>(this); 86 registry_.AddInterface<leveldb::mojom::LevelDBService>(this);
89 registry_.AddInterface<mojom::FileSystem>(this); 87 registry_.AddInterface<mojom::FileSystem>(this);
90 } 88 }
91 89
92 FileService::~FileService() { 90 FileService::~FileService() {
93 file_service_runner_->DeleteSoon(FROM_HERE, file_system_objects_.release()); 91 leveldb_env_->file_task_runner()->DeleteSoon(FROM_HERE,
92 file_system_objects_.release());
94 leveldb_service_runner_->DeleteSoon(FROM_HERE, leveldb_objects_.release()); 93 leveldb_service_runner_->DeleteSoon(FROM_HERE, leveldb_objects_.release());
95 } 94 }
96 95
97 void FileService::OnStart() { 96 void FileService::OnStart() {
98 file_system_objects_.reset(new FileService::FileSystemObjects( 97 file_system_objects_.reset(new FileService::FileSystemObjects(
99 GetUserDirForUserId(context()->identity().user_id()))); 98 GetUserDirForUserId(context()->identity().user_id())));
100 leveldb_objects_.reset( 99 leveldb_objects_.reset(new FileService::LevelDBServiceObjects(leveldb_env_));
101 new FileService::LevelDBServiceObjects(file_service_runner_));
102 } 100 }
103 101
104 void FileService::OnBindInterface( 102 void FileService::OnBindInterface(
105 const service_manager::ServiceInfo& source_info, 103 const service_manager::ServiceInfo& source_info,
106 const std::string& interface_name, 104 const std::string& interface_name,
107 mojo::ScopedMessagePipeHandle interface_pipe) { 105 mojo::ScopedMessagePipeHandle interface_pipe) {
108 registry_.BindInterface(source_info.identity, interface_name, 106 registry_.BindInterface(source_info.identity, interface_name,
109 std::move(interface_pipe)); 107 std::move(interface_pipe));
110 } 108 }
111 109
112 void FileService::Create(const service_manager::Identity& remote_identity, 110 void FileService::Create(const service_manager::Identity& remote_identity,
113 mojom::FileSystemRequest request) { 111 mojom::FileSystemRequest request) {
114 file_service_runner_->PostTask( 112 leveldb_env_->file_task_runner()->PostTask(
115 FROM_HERE, 113 FROM_HERE,
116 base::Bind(&FileService::FileSystemObjects::OnFileSystemRequest, 114 base::Bind(&FileService::FileSystemObjects::OnFileSystemRequest,
117 file_system_objects_->AsWeakPtr(), remote_identity, 115 file_system_objects_->AsWeakPtr(), remote_identity,
118 base::Passed(&request))); 116 base::Passed(&request)));
119 } 117 }
120 118
121 void FileService::Create(const service_manager::Identity& remote_identity, 119 void FileService::Create(const service_manager::Identity& remote_identity,
122 leveldb::mojom::LevelDBServiceRequest request) { 120 leveldb::mojom::LevelDBServiceRequest request) {
123 leveldb_service_runner_->PostTask( 121 leveldb_service_runner_->PostTask(
124 FROM_HERE, 122 FROM_HERE,
125 base::Bind( 123 base::Bind(
126 &FileService::LevelDBServiceObjects::OnLevelDBServiceRequest, 124 &FileService::LevelDBServiceObjects::OnLevelDBServiceRequest,
127 leveldb_objects_->AsWeakPtr(), remote_identity, 125 leveldb_objects_->AsWeakPtr(), remote_identity,
128 base::Passed(&request))); 126 base::Passed(&request)));
129 } 127 }
130 128
131 } // namespace user_service 129 } // namespace user_service
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698