Tue, 06 Jan 2015 21:39:09 +0100
Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set ts=2 sw=2 sts=2 et cindent: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #ifndef SHARED_LIBRARIES_H_
8 #define SHARED_LIBRARIES_H_
10 #ifndef MOZ_ENABLE_PROFILER_SPS
11 #error This header does not have a useful implementation on your platform!
12 #endif
14 #include <algorithm>
15 #include <vector>
16 #include <string>
17 #include <stdlib.h>
18 #include <stdint.h>
19 #include <nsID.h>
21 class SharedLibrary {
22 public:
24 SharedLibrary(uintptr_t aStart,
25 uintptr_t aEnd,
26 uintptr_t aOffset,
27 const std::string& aBreakpadId,
28 const std::string& aName)
29 : mStart(aStart)
30 , mEnd(aEnd)
31 , mOffset(aOffset)
32 , mBreakpadId(aBreakpadId)
33 , mName(aName)
34 {}
36 SharedLibrary(const SharedLibrary& aEntry)
37 : mStart(aEntry.mStart)
38 , mEnd(aEntry.mEnd)
39 , mOffset(aEntry.mOffset)
40 , mBreakpadId(aEntry.mBreakpadId)
41 , mName(aEntry.mName)
42 {}
44 SharedLibrary& operator=(const SharedLibrary& aEntry)
45 {
46 // Gracefully handle self assignment
47 if (this == &aEntry) return *this;
49 mStart = aEntry.mStart;
50 mEnd = aEntry.mEnd;
51 mOffset = aEntry.mOffset;
52 mBreakpadId = aEntry.mBreakpadId;
53 mName = aEntry.mName;
54 return *this;
55 }
57 bool operator==(const SharedLibrary& other) const
58 {
59 return (mStart == other.mStart) &&
60 (mEnd == other.mEnd) &&
61 (mOffset == other.mOffset) &&
62 (mName == other.mName) &&
63 (mBreakpadId == other.mBreakpadId);
64 }
66 uintptr_t GetStart() const { return mStart; }
67 uintptr_t GetEnd() const { return mEnd; }
68 uintptr_t GetOffset() const { return mOffset; }
69 const std::string &GetBreakpadId() const { return mBreakpadId; }
70 const std::string &GetName() const { return mName; }
72 private:
73 SharedLibrary() {}
75 uintptr_t mStart;
76 uintptr_t mEnd;
77 uintptr_t mOffset;
78 std::string mBreakpadId;
79 std::string mName;
80 };
82 static bool
83 CompareAddresses(const SharedLibrary& first, const SharedLibrary& second)
84 {
85 return first.GetStart() < second.GetStart();
86 }
88 class SharedLibraryInfo {
89 public:
90 static SharedLibraryInfo GetInfoForSelf();
91 SharedLibraryInfo() {}
93 void AddSharedLibrary(SharedLibrary entry)
94 {
95 mEntries.push_back(entry);
96 }
98 const SharedLibrary& GetEntry(size_t i) const
99 {
100 return mEntries[i];
101 }
103 // Removes items in the range [first, last)
104 // i.e. element at the "last" index is not removed
105 void RemoveEntries(size_t first, size_t last)
106 {
107 mEntries.erase(mEntries.begin() + first, mEntries.begin() + last);
108 }
110 bool Contains(const SharedLibrary& searchItem) const
111 {
112 return (mEntries.end() !=
113 std::find(mEntries.begin(), mEntries.end(), searchItem));
114 }
116 size_t GetSize() const
117 {
118 return mEntries.size();
119 }
121 void SortByAddress()
122 {
123 std::sort(mEntries.begin(), mEntries.end(), CompareAddresses);
124 }
126 void Clear()
127 {
128 mEntries.clear();
129 }
131 private:
132 std::vector<SharedLibrary> mEntries;
133 };
135 #endif