OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 <dirent.h> | 5 #include <dirent.h> |
6 #include <errno.h> | 6 #include <errno.h> |
7 #include <fcntl.h> | 7 #include <fcntl.h> |
8 #include <signal.h> | 8 #include <signal.h> |
9 #include <stdlib.h> | 9 #include <stdlib.h> |
10 #include <sys/resource.h> | 10 #include <sys/resource.h> |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
110 }; | 110 }; |
111 typedef scoped_ptr_malloc<DIR, ScopedDIRClose> ScopedDIR; | 111 typedef scoped_ptr_malloc<DIR, ScopedDIRClose> ScopedDIR; |
112 | 112 |
113 void CloseSuperfluousFds(const base::InjectiveMultimap& saved_mapping) { | 113 void CloseSuperfluousFds(const base::InjectiveMultimap& saved_mapping) { |
114 #if defined(OS_LINUX) | 114 #if defined(OS_LINUX) |
115 static const rlim_t kSystemDefaultMaxFds = 8192; | 115 static const rlim_t kSystemDefaultMaxFds = 8192; |
116 static const char fd_dir[] = "/proc/self/fd"; | 116 static const char fd_dir[] = "/proc/self/fd"; |
117 #elif defined(OS_MACOSX) | 117 #elif defined(OS_MACOSX) |
118 static const rlim_t kSystemDefaultMaxFds = 256; | 118 static const rlim_t kSystemDefaultMaxFds = 256; |
119 static const char fd_dir[] = "/dev/fd"; | 119 static const char fd_dir[] = "/dev/fd"; |
| 120 #elif defined(OS_FREEBSD) |
| 121 static const rlim_t kSystemDefaultMaxFds = 8192; |
| 122 static const char fd_dir[] = "/dev/fd"; |
120 #endif | 123 #endif |
121 std::set<int> saved_fds; | 124 std::set<int> saved_fds; |
122 | 125 |
123 // Get the maximum number of FDs possible. | 126 // Get the maximum number of FDs possible. |
124 struct rlimit nofile; | 127 struct rlimit nofile; |
125 rlim_t max_fds; | 128 rlim_t max_fds; |
126 if (getrlimit(RLIMIT_NOFILE, &nofile)) { | 129 if (getrlimit(RLIMIT_NOFILE, &nofile)) { |
127 // getrlimit failed. Take a best guess. | 130 // getrlimit failed. Take a best guess. |
128 max_fds = kSystemDefaultMaxFds; | 131 max_fds = kSystemDefaultMaxFds; |
129 DLOG(ERROR) << "getrlimit(RLIMIT_NOFILE) failed: " << errno; | 132 DLOG(ERROR) << "getrlimit(RLIMIT_NOFILE) failed: " << errno; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 } | 189 } |
187 } | 190 } |
188 | 191 |
189 // Sets all file descriptors to close on exec except for stdin, stdout | 192 // Sets all file descriptors to close on exec except for stdin, stdout |
190 // and stderr. | 193 // and stderr. |
191 // TODO(agl): Remove this function. It's fundamentally broken for multithreaded | 194 // TODO(agl): Remove this function. It's fundamentally broken for multithreaded |
192 // apps. | 195 // apps. |
193 void SetAllFDsToCloseOnExec() { | 196 void SetAllFDsToCloseOnExec() { |
194 #if defined(OS_LINUX) | 197 #if defined(OS_LINUX) |
195 const char fd_dir[] = "/proc/self/fd"; | 198 const char fd_dir[] = "/proc/self/fd"; |
196 #elif defined(OS_MACOSX) | 199 #elif defined(OS_MACOSX) || defined(OS_FREEBSD) |
197 const char fd_dir[] = "/dev/fd"; | 200 const char fd_dir[] = "/dev/fd"; |
198 #endif | 201 #endif |
199 ScopedDIR dir_closer(opendir(fd_dir)); | 202 ScopedDIR dir_closer(opendir(fd_dir)); |
200 DIR *dir = dir_closer.get(); | 203 DIR *dir = dir_closer.get(); |
201 if (NULL == dir) { | 204 if (NULL == dir) { |
202 DLOG(ERROR) << "Unable to open " << fd_dir; | 205 DLOG(ERROR) << "Unable to open " << fd_dir; |
203 return; | 206 return; |
204 } | 207 } |
205 | 208 |
206 struct dirent *ent; | 209 struct dirent *ent; |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
624 const ProcessFilter* filter) { | 627 const ProcessFilter* filter) { |
625 bool exited_cleanly = | 628 bool exited_cleanly = |
626 WaitForProcessesToExit(executable_name, wait_milliseconds, | 629 WaitForProcessesToExit(executable_name, wait_milliseconds, |
627 filter); | 630 filter); |
628 if (!exited_cleanly) | 631 if (!exited_cleanly) |
629 KillProcesses(executable_name, exit_code, filter); | 632 KillProcesses(executable_name, exit_code, filter); |
630 return exited_cleanly; | 633 return exited_cleanly; |
631 } | 634 } |
632 | 635 |
633 } // namespace base | 636 } // namespace base |
OLD | NEW |