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

Side by Side Diff: native_client_sdk/src/libraries/nacl_io/kernel_object.cc

Issue 99203014: [NaCl SDK] Map active fds to absolute paths. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Map active fds to absolute paths. Created 6 years, 11 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "nacl_io/kernel_object.h" 5 #include "nacl_io/kernel_object.h"
6 6
7 #include <assert.h> 7 #include <assert.h>
8 #include <errno.h> 8 #include <errno.h>
9 #include <fcntl.h> 9 #include <fcntl.h>
10 #include <pthread.h> 10 #include <pthread.h>
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 145
146 Error KernelObject::GetFDFlags(int fd, int* out_flags) { 146 Error KernelObject::GetFDFlags(int fd, int* out_flags) {
147 AUTO_LOCK(handle_lock_); 147 AUTO_LOCK(handle_lock_);
148 if (fd < 0 || fd >= static_cast<int>(handle_map_.size())) 148 if (fd < 0 || fd >= static_cast<int>(handle_map_.size()))
149 return EBADF; 149 return EBADF;
150 150
151 *out_flags = handle_map_[fd].flags; 151 *out_flags = handle_map_[fd].flags;
152 return 0; 152 return 0;
153 } 153 }
154 154
155 std::string KernelObject::GetFDPath(int fd) {
156 AUTO_LOCK(handle_lock_);
157
158 FdPathMap_t::iterator iter = fd_paths_.find(fd);
159 if (iter == fd_paths_.end()) {
binji 2014/01/07 21:40:29 nit: no braces for single-line ifs
160 return "";
binji 2014/01/07 21:40:29 return std::string();
161 }
162
163 return iter->second;
164 }
165
155 Error KernelObject::SetFDFlags(int fd, int flags) { 166 Error KernelObject::SetFDFlags(int fd, int flags) {
156 AUTO_LOCK(handle_lock_); 167 AUTO_LOCK(handle_lock_);
157 if (fd < 0 || fd >= static_cast<int>(handle_map_.size())) 168 if (fd < 0 || fd >= static_cast<int>(handle_map_.size()))
158 return EBADF; 169 return EBADF;
159 170
160 // Only setting of FD_CLOEXEC is supported. 171 // Only setting of FD_CLOEXEC is supported.
161 if (flags & ~FD_CLOEXEC) 172 if (flags & ~FD_CLOEXEC)
162 return EINVAL; 173 return EINVAL;
163 174
164 handle_map_[fd].flags = flags; 175 handle_map_[fd].flags = flags;
165 return 0; 176 return 0;
166 } 177 }
167 178
168 Error KernelObject::AcquireHandle(int fd, ScopedKernelHandle* out_handle) { 179 Error KernelObject::AcquireHandle(int fd, ScopedKernelHandle* out_handle) {
169 out_handle->reset(NULL); 180 out_handle->reset(NULL);
170 181
171 AUTO_LOCK(handle_lock_); 182 AUTO_LOCK(handle_lock_);
172 if (fd < 0 || fd >= static_cast<int>(handle_map_.size())) 183 if (fd < 0 || fd >= static_cast<int>(handle_map_.size()))
173 return EBADF; 184 return EBADF;
174 185
175 *out_handle = handle_map_[fd].handle; 186 *out_handle = handle_map_[fd].handle;
176 if (out_handle) 187 if (out_handle)
177 return 0; 188 return 0;
178 189
179 return EBADF; 190 return EBADF;
180 } 191 }
181 192
182 int KernelObject::AllocateFD(const ScopedKernelHandle& handle) { 193 int KernelObject::AllocateFD(const ScopedKernelHandle& handle,
194 std::string path) {
183 AUTO_LOCK(handle_lock_); 195 AUTO_LOCK(handle_lock_);
184 int id; 196 int id;
185 197
186 Descriptor_t descriptor(handle); 198 Descriptor_t descriptor(handle);
187 199
188 // If we can recycle and FD, use that first 200 // If we can recycle and FD, use that first
189 if (free_fds_.size()) { 201 if (free_fds_.size()) {
190 id = free_fds_.front(); 202 id = free_fds_.front();
191 // Force lower numbered FD to be available first. 203 // Force lower numbered FD to be available first.
192 std::pop_heap(free_fds_.begin(), free_fds_.end(), std::greater<int>()); 204 std::pop_heap(free_fds_.begin(), free_fds_.end(), std::greater<int>());
193 free_fds_.pop_back(); 205 free_fds_.pop_back();
194 handle_map_[id] = descriptor; 206 handle_map_[id] = descriptor;
195 } else { 207 } else {
196 id = handle_map_.size(); 208 id = handle_map_.size();
197 handle_map_.push_back(descriptor); 209 handle_map_.push_back(descriptor);
198 } 210 }
211 // With our final fd identifier, we insert into our fd_paths_ mapping as long
212 // as path is non-NULL.
213 if (!path.empty()) {
214 std::string abs_path = GetAbsParts(path).Join();
215 fd_paths_[id] = abs_path;
binji 2014/01/07 21:40:29 nit: fs_paths_[id] = GetAbsParts(path).Join();
216 }
199 return id; 217 return id;
200 } 218 }
201 219
202 void KernelObject::FreeAndReassignFD(int fd, const ScopedKernelHandle& handle) { 220 void KernelObject::FreeAndReassignFD(int fd, const ScopedKernelHandle& handle) {
203 if (NULL == handle) { 221 if (NULL == handle) {
204 FreeFD(fd); 222 FreeFD(fd);
205 } else { 223 } else {
206 AUTO_LOCK(handle_lock_); 224 AUTO_LOCK(handle_lock_);
207 225
208 // If the required FD is larger than the current set, grow the set 226 // If the required FD is larger than the current set, grow the set
209 if (fd >= (int)handle_map_.size()) 227 if (fd >= (int)handle_map_.size())
210 handle_map_.resize(fd + 1); 228 handle_map_.resize(fd + 1);
211 229
212 handle_map_[fd] = Descriptor_t(handle); 230 handle_map_[fd] = Descriptor_t(handle);
binji 2014/01/07 21:40:29 assign to fd_paths_[fd] here too (used by dup2)
213 } 231 }
214 } 232 }
215 233
216 void KernelObject::FreeFD(int fd) { 234 void KernelObject::FreeFD(int fd) {
217 AUTO_LOCK(handle_lock_); 235 AUTO_LOCK(handle_lock_);
218 236
219 handle_map_[fd].handle.reset(NULL); 237 handle_map_[fd].handle.reset(NULL);
220 free_fds_.push_back(fd); 238 free_fds_.push_back(fd);
221 239
222 // Force lower numbered FD to be available first. 240 // Force lower numbered FD to be available first.
223 std::push_heap(free_fds_.begin(), free_fds_.end(), std::greater<int>()); 241 std::push_heap(free_fds_.begin(), free_fds_.end(), std::greater<int>());
242 //
243 // Remove the FD from the map of fd to absolute path
244 fd_paths_.erase(fd);
224 } 245 }
225 246
226 } // namespace nacl_io 247 } // namespace nacl_io
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698