Home | History | Annotate | Download | only in process
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/process/process_iterator.h"
      6 
      7 namespace base {
      8 
      9 #if defined(OS_POSIX)
     10 ProcessEntry::ProcessEntry() : pid_(0), ppid_(0), gid_(0) {}
     11 ProcessEntry::~ProcessEntry() {}
     12 #endif
     13 
     14 const ProcessEntry* ProcessIterator::NextProcessEntry() {
     15   bool result = false;
     16   do {
     17     result = CheckForNextProcess();
     18   } while (result && !IncludeEntry());
     19   if (result)
     20     return &entry_;
     21   return NULL;
     22 }
     23 
     24 ProcessIterator::ProcessEntries ProcessIterator::Snapshot() {
     25   ProcessEntries found;
     26   while (const ProcessEntry* process_entry = NextProcessEntry()) {
     27     found.push_back(*process_entry);
     28   }
     29   return found;
     30 }
     31 
     32 bool ProcessIterator::IncludeEntry() {
     33   return !filter_ || filter_->Includes(entry_);
     34 }
     35 
     36 NamedProcessIterator::NamedProcessIterator(
     37     const FilePath::StringType& executable_name,
     38     const ProcessFilter* filter) : ProcessIterator(filter),
     39                                    executable_name_(executable_name) {
     40 #if defined(OS_ANDROID)
     41   // On Android, the process name contains only the last 15 characters, which
     42   // is in file /proc/<pid>/stat, the string between open parenthesis and close
     43   // parenthesis. Please See ProcessIterator::CheckForNextProcess for details.
     44   // Now if the length of input process name is greater than 15, only save the
     45   // last 15 characters.
     46   if (executable_name_.size() > 15) {
     47     executable_name_ = FilePath::StringType(executable_name_,
     48                                             executable_name_.size() - 15, 15);
     49   }
     50 #endif
     51 }
     52 
     53 NamedProcessIterator::~NamedProcessIterator() {
     54 }
     55 
     56 int GetProcessCount(const FilePath::StringType& executable_name,
     57                     const ProcessFilter* filter) {
     58   int count = 0;
     59   NamedProcessIterator iter(executable_name, filter);
     60   while (iter.NextProcessEntry())
     61     ++count;
     62   return count;
     63 }
     64 
     65 }  // namespace base
     66