process_map.cc revision f2477e01787aa58f445919b809d89e252beef54f
1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/process_map.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Item
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ProcessMap::Item {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Item() : process_id(0), site_instance_id(0) {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Purposely implicit constructor needed on older gcc's. See:
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://codereview.chromium.org/8769022/
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit Item(const ProcessMap::Item& other)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : extension_id(other.extension_id),
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        process_id(other.process_id),
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        site_instance_id(other.site_instance_id) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Item(const std::string& extension_id, int process_id,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       int site_instance_id)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : extension_id(extension_id),
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        process_id(process_id),
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        site_instance_id(site_instance_id) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~Item() {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator<(const ProcessMap::Item& other) const {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_id < other.extension_id)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_id == other.extension_id &&
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        process_id < other.process_id) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_id == other.extension_id &&
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        process_id == other.process_id &&
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        site_instance_id < other.site_instance_id) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string extension_id;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int process_id;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int site_instance_id;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ProcessMap
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProcessMap::ProcessMap() {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProcessMap::~ProcessMap() {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProcessMap::Insert(const std::string& extension_id, int process_id,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        int site_instance_id) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return items_.insert(Item(extension_id, process_id, site_instance_id)).second;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProcessMap::Remove(const std::string& extension_id, int process_id,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        int site_instance_id) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return items_.erase(Item(extension_id, process_id, site_instance_id)) > 0;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ProcessMap::RemoveAllFromProcess(int process_id) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = 0;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ItemSet::iterator iter = items_.begin(); iter != items_.end(); ) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (iter->process_id == process_id) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      items_.erase(iter++);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++result;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++iter;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProcessMap::Contains(const std::string& extension_id,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          int process_id) const {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ItemSet::const_iterator iter = items_.begin(); iter != items_.end();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++iter) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (iter->process_id == process_id && iter->extension_id == extension_id)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProcessMap::Contains(int process_id) const {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ItemSet::const_iterator iter = items_.begin(); iter != items_.end();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++iter) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (iter->process_id == process_id)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::set<std::string> ProcessMap::GetExtensionsInProcess(int process_id) const {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> result;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ItemSet::const_iterator iter = items_.begin(); iter != items_.end();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++iter) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (iter->process_id == process_id)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result.insert(iter->extension_id);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // extensions
116