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

Side by Side Diff: base/process_util_posix.cc

Issue 10411047: Type profiler by intercepting 'new' and 'delete' expressions. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: stop interceptors in an entire child process Created 8 years, 4 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 | Annotate | Revision Log
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 <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 15 matching lines...) Expand all
26 #include "base/files/dir_reader_posix.h" 26 #include "base/files/dir_reader_posix.h"
27 #include "base/logging.h" 27 #include "base/logging.h"
28 #include "base/memory/scoped_ptr.h" 28 #include "base/memory/scoped_ptr.h"
29 #include "base/process_util.h" 29 #include "base/process_util.h"
30 #include "base/stringprintf.h" 30 #include "base/stringprintf.h"
31 #include "base/synchronization/waitable_event.h" 31 #include "base/synchronization/waitable_event.h"
32 #include "base/third_party/dynamic_annotations/dynamic_annotations.h" 32 #include "base/third_party/dynamic_annotations/dynamic_annotations.h"
33 #include "base/threading/platform_thread.h" 33 #include "base/threading/platform_thread.h"
34 #include "base/threading/thread_restrictions.h" 34 #include "base/threading/thread_restrictions.h"
35 35
36 #ifdef USE_ALLOCATED_TYPE
37 #include "base/allocator/allocated_type_tcmalloc.h"
38 #endif
39
36 #if defined(OS_CHROMEOS) 40 #if defined(OS_CHROMEOS)
37 #include <sys/ioctl.h> 41 #include <sys/ioctl.h>
38 #endif 42 #endif
39 43
40 #if defined(OS_FREEBSD) 44 #if defined(OS_FREEBSD)
41 #include <sys/event.h> 45 #include <sys/event.h>
42 #include <sys/ucontext.h> 46 #include <sys/ucontext.h>
43 #endif 47 #endif
44 48
45 #if defined(OS_MACOSX) 49 #if defined(OS_MACOSX)
(...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after
632 636
633 if (options.new_process_group) { 637 if (options.new_process_group) {
634 // Instead of inheriting the process group ID of the parent, the child 638 // Instead of inheriting the process group ID of the parent, the child
635 // starts off a new process group with pgid equal to its process ID. 639 // starts off a new process group with pgid equal to its process ID.
636 if (setpgid(0, 0) < 0) { 640 if (setpgid(0, 0) < 0) {
637 RAW_LOG(ERROR, "setpgid failed"); 641 RAW_LOG(ERROR, "setpgid failed");
638 _exit(127); 642 _exit(127);
639 } 643 }
640 } 644 }
641 645
646 #ifdef USE_ALLOCATED_TYPE
647 // Stop interceptors for allocated type to avoid using locks.
648 StopAllocatedTypeIntercept();
649 #endif
Dai Mikurube (NOT FULLTIME) 2012/08/07 11:35:55 Note: I kept #ifdef here since the file has just t
jar (doing other things) 2012/08/07 17:07:34 Readers can't skip the ifdef without trying to fig
Dai Mikurube (NOT FULLTIME) 2012/08/08 06:16:23 Ok, done in base/allocator/allocated_type_tcmalloc
642 if (options.maximize_rlimits) { 650 if (options.maximize_rlimits) {
643 // Some resource limits need to be maximal in this child. 651 // Some resource limits need to be maximal in this child.
644 std::set<int>::const_iterator resource; 652 std::set<int>::const_iterator resource;
645 for (resource = options.maximize_rlimits->begin(); 653 for (resource = options.maximize_rlimits->begin();
646 resource != options.maximize_rlimits->end(); 654 resource != options.maximize_rlimits->end();
647 ++resource) { 655 ++resource) {
648 struct rlimit limit; 656 struct rlimit limit;
649 if (getrlimit(*resource, &limit) < 0) { 657 if (getrlimit(*resource, &limit) < 0) {
650 RAW_LOG(WARNING, "getrlimit failed"); 658 RAW_LOG(WARNING, "getrlimit failed");
651 } else if (limit.rlim_cur < limit.rlim_max) { 659 } else if (limit.rlim_cur < limit.rlim_max) {
(...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after
1100 1108
1101 // Obscure fork() rule: in the child, if you don't end up doing exec*(), 1109 // Obscure fork() rule: in the child, if you don't end up doing exec*(),
1102 // you call _exit() instead of exit(). This is because _exit() does not 1110 // you call _exit() instead of exit(). This is because _exit() does not
1103 // call any previously-registered (in the parent) exit handlers, which 1111 // call any previously-registered (in the parent) exit handlers, which
1104 // might do things like block waiting for threads that don't even exist 1112 // might do things like block waiting for threads that don't even exist
1105 // in the child. 1113 // in the child.
1106 int dev_null = open("/dev/null", O_WRONLY); 1114 int dev_null = open("/dev/null", O_WRONLY);
1107 if (dev_null < 0) 1115 if (dev_null < 0)
1108 _exit(127); 1116 _exit(127);
1109 1117
1118 #ifdef USE_ALLOCATED_TYPE
1119 // Stop interceptors for allocated type to avoid using locks.
1120 StopAllocatedTypeIntercept();
1121 #endif
1110 fd_shuffle1.push_back(InjectionArc(pipe_fd[1], STDOUT_FILENO, true)); 1122 fd_shuffle1.push_back(InjectionArc(pipe_fd[1], STDOUT_FILENO, true));
1111 fd_shuffle1.push_back(InjectionArc(dev_null, STDERR_FILENO, true)); 1123 fd_shuffle1.push_back(InjectionArc(dev_null, STDERR_FILENO, true));
1112 fd_shuffle1.push_back(InjectionArc(dev_null, STDIN_FILENO, true)); 1124 fd_shuffle1.push_back(InjectionArc(dev_null, STDIN_FILENO, true));
1113 // Adding another element here? Remeber to increase the argument to 1125 // Adding another element here? Remeber to increase the argument to
1114 // reserve(), above. 1126 // reserve(), above.
1115 1127
1116 std::copy(fd_shuffle1.begin(), fd_shuffle1.end(), 1128 std::copy(fd_shuffle1.begin(), fd_shuffle1.end(),
1117 std::back_inserter(fd_shuffle2)); 1129 std::back_inserter(fd_shuffle2));
1118 1130
1119 if (!ShuffleFileDescriptors(&fd_shuffle1)) 1131 if (!ShuffleFileDescriptors(&fd_shuffle1))
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
1327 if (IsChildDead(process)) 1339 if (IsChildDead(process))
1328 return; 1340 return;
1329 1341
1330 BackgroundReaper* reaper = new BackgroundReaper(process, 0); 1342 BackgroundReaper* reaper = new BackgroundReaper(process, 0);
1331 PlatformThread::CreateNonJoinable(0, reaper); 1343 PlatformThread::CreateNonJoinable(0, reaper);
1332 } 1344 }
1333 1345
1334 #endif // !defined(OS_MACOSX) 1346 #endif // !defined(OS_MACOSX)
1335 1347
1336 } // namespace base 1348 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698