OLD | NEW |
1 /* | 1 /* |
2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
3 * Copyright (C) 2006-2016 Eyeo GmbH | 3 * Copyright (C) 2006-2016 Eyeo GmbH |
4 * | 4 * |
5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
8 * | 8 * |
9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 * GNU General Public License for more details. | 12 * GNU General Public License for more details. |
13 * | 13 * |
14 * You should have received a copy of the GNU General Public License | 14 * You should have received a copy of the GNU General Public License |
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
16 */ | 16 */ |
17 | 17 |
18 #ifndef _PLUGIN_DEBUG_H_ | 18 #ifndef _PLUGIN_DEBUG_H_ |
19 #define _PLUGIN_DEBUG_H_ | 19 #define _PLUGIN_DEBUG_H_ |
20 | 20 |
| 21 #include <memory> |
| 22 #include <mutex> |
21 #include <string> | 23 #include <string> |
22 | 24 |
| 25 namespace Trace |
| 26 { |
| 27 /** |
| 28 */ |
| 29 struct Location |
| 30 { |
| 31 std::string prefixText; |
| 32 std::string postfixText; |
| 33 |
| 34 Location() // = default |
| 35 : prefixText(), postfixText() |
| 36 {}; |
| 37 |
| 38 Location(int id, int subId); |
| 39 |
| 40 Location(std::string postfixText) |
| 41 : prefixText(), postfixText(postfixText) |
| 42 {} |
| 43 |
| 44 Location(std::string prefixText, std::string postfixText) |
| 45 : prefixText(prefixText), postfixText(postfixText) |
| 46 {} |
| 47 }; |
| 48 |
| 49 void TextFixed(const std::string& description, Trace::Location location); |
| 50 void ErrorCode(DWORD errorCode, const std::string& description, Trace::Locatio
n location); |
| 51 void SystemException(const std::system_error& ex, const std::string& descripti
on, Trace::Location location); |
| 52 } |
| 53 |
| 54 // Cope with insufficient support on old toolsets |
| 55 #if !defined(__func__) && defined(_MSC_VER) |
| 56 #define __func__ __FUNCTION__ |
| 57 #endif |
| 58 |
| 59 // __LINE__ expands to an integer literal, not a string literal |
| 60 // The stringify operator "#" applies only to arguments, not macro definitions |
| 61 #define STRING_EXPAND(x) STRINGIFY(x) |
| 62 #define STRINGIFY(x) #x |
| 63 #define __LINE_STRING__ STRING_EXPAND(__LINE__) |
| 64 #define HERE Trace::Location(__FILE__ ":" __LINE_STRING__) |
| 65 #define HERE_F Trace::Location(__func__, __FILE__ ":" __LINE_STRING__) |
| 66 |
| 67 #ifdef _DEBUG |
| 68 #define TRACE(description, location) Trace::TextFixed(description, location) |
| 69 #else |
| 70 #define TRACE(a,b) |
| 71 #endif |
| 72 |
23 class CPluginDebug | 73 class CPluginDebug |
24 { | 74 { |
25 | |
26 public: | 75 public: |
27 static void DebugSystemException(const std::system_error& ex, int errorId, int
errorSubid, const std::string& description); | |
28 | |
29 #if (defined ENABLE_DEBUG_INFO) | 76 #if (defined ENABLE_DEBUG_INFO) |
30 static void Debug(const std::string& text); | 77 static void Debug(const std::string& text); |
31 static void Debug(const std::wstring& text); | 78 static void Debug(const std::wstring& text); |
32 static void DebugException(const std::exception& ex); | 79 static void DebugException(const std::exception& ex, Trace::Location location)
; |
33 static void DebugErrorCode(DWORD errorCode, const std::string& error, DWORD pr
ocessId=0, DWORD threadId=0); | 80 static void DebugErrorCode(DWORD errorCode, const std::string& error, Trace::L
ocation location); |
34 #endif | 81 #endif |
35 | 82 |
36 #if (defined ENABLE_DEBUG_RESULT) | 83 #if (defined ENABLE_DEBUG_RESULT) |
37 static void DebugResult(const std::wstring& text); | 84 static void DebugResult(const std::wstring& text); |
38 static void DebugResultDomain(const std::wstring& domain); | 85 static void DebugResultDomain(const std::wstring& domain); |
39 static void DebugResultBlocking(const std::wstring& type, const std::wstring&
src, const std::wstring& domain); | 86 static void DebugResultBlocking(const std::wstring& type, const std::wstring&
src, const std::wstring& domain); |
40 static void DebugResultHiding(const std::wstring& tag, const std::wstring& id,
const std::wstring& filter); | 87 static void DebugResultHiding(const std::wstring& tag, const std::wstring& id,
const std::wstring& filter); |
41 #endif | 88 #endif |
42 | 89 |
43 #if (defined ENABLE_DEBUG_RESULT_IGNORED) | 90 #if (defined ENABLE_DEBUG_RESULT_IGNORED) |
44 static void DebugResultIgnoring(const std::wstring& type, const std::wstring&
src, const std::wstring& domain); | 91 static void DebugResultIgnoring(const std::wstring& type, const std::wstring&
src, const std::wstring& domain); |
45 #endif | 92 #endif |
46 }; | 93 }; |
47 | 94 |
48 /** | 95 /** |
49 * Convert a pointer to a hexadecimal literal (0x...) | 96 * Convert a pointer to a hexadecimal literal (0x...) |
50 * | 97 * |
51 * The length of the literal varies with pointer size: | 98 * The length of the literal varies with pointer size: |
52 * 10 characters for WIN32, and 18 for WIN64. | 99 * 10 characters for WIN32, and 18 for WIN64. |
53 */ | 100 */ |
54 std::wstring ToHexLiteral(const void*); | 101 std::wstring ToHexLiteral(const void*); |
55 | 102 |
| 103 /* |
| 104 * Forward declaration. |
| 105 */ |
| 106 class LogQueue; |
| 107 |
| 108 /** |
| 109 * This class maintains a singleton LogQueue in existence. |
| 110 * |
| 111 * This class exists because it's not possible to use a static declaration for |
| 112 * 'std::thread' or any class that contains one, such as 'ActiveQueue'. |
| 113 * To appreciate of the origin of restriction, see |
| 114 * http://stackoverflow.com/questions/28746016/thread-join-does-not-return-whe
n-called-in-global-var-destructor |
| 115 * In addition, we have no main() function to use for initialization, |
| 116 * since we're packaged as a COM class provider. |
| 117 * |
| 118 * As a substitute, we maintain a reference to the queue in each instance of |
| 119 * 'CPluginClass', the sole visible COM class, the one that implements the |
| 120 * BHO interface. |
| 121 * This class has the responsibility for managing the life cycle of the queue, |
| 122 * ensuring it exists whenever there's a reference to it. |
| 123 * The lifespan of instances of 'CPluginClass' encompasses the lifespans of any |
| 124 * other objects that the BHO uses, so it's sufficient to maintain a LogQueue |
| 125 * in existence with a reference in that class. |
| 126 * |
| 127 * The queue itself is accessible only to the logging functions; |
| 128 * it need not be visible externally. |
| 129 * Hence all this class requires is an opaque, forward declaration. |
| 130 * Mere instantiation of this class is sufficient to ensure we have a log queue. |
| 131 */ |
| 132 class LogQueueReference |
| 133 { |
| 134 friend LogQueue; |
| 135 |
| 136 typedef std::shared_ptr<LogQueue> pointer; |
| 137 |
| 138 /** |
| 139 * The class-wide reference to the debug queue. |
| 140 */ |
| 141 static pointer queueMasterReference; |
| 142 |
| 143 /** |
| 144 * The instance reference to the debug queue. |
| 145 */ |
| 146 pointer queueReference; |
| 147 |
| 148 /** |
| 149 * Mutex to allow joint serialization of constructor/destructor calls. |
| 150 */ |
| 151 static std::mutex mutex; |
| 152 |
| 153 public: |
| 154 LogQueueReference(); |
| 155 ~LogQueueReference(); |
| 156 }; |
| 157 |
56 #endif // _PLUGIN_DEBUG_H_ | 158 #endif // _PLUGIN_DEBUG_H_ |
OLD | NEW |