Refactored CrashReportGenerator to avoid deadlocks and clarify code
This commit is contained in:
parent
d5723b9ae6
commit
0017ecc5a7
@ -57,30 +57,39 @@ public class CrashReportGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void appendContextProviders(StringBuilder output) {
|
private static void appendContextProviders(StringBuilder output) {
|
||||||
for (ContextProvider provider : PROVIDERS) {
|
|
||||||
if (provider != null) {
|
// Do a local copy to avoid deadlocks -OLEGSHA
|
||||||
|
ContextProvider[] localProvidersCopy =
|
||||||
|
PROVIDERS.toArray(new ContextProvider[PROVIDERS.size()]);
|
||||||
|
|
||||||
|
for (ContextProvider provider : localProvidersCopy) {
|
||||||
|
if (provider == null) continue;
|
||||||
|
|
||||||
|
addSeparator(output);
|
||||||
|
|
||||||
|
try {
|
||||||
Map<String, String> buf = new HashMap<>();
|
Map<String, String> buf = new HashMap<>();
|
||||||
|
provider.provideContext(buf);
|
||||||
|
|
||||||
|
if (!buf.isEmpty()) {
|
||||||
|
output.append("Provider name: ").append(provider.getName()).append("\n");
|
||||||
|
for (Map.Entry<String, String> entry : buf.entrySet()) {
|
||||||
|
output.append(entry.getKey()).append(": ").append(entry.getValue()).append("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Throwable t) {
|
||||||
|
output.append("\n");
|
||||||
|
|
||||||
|
String providerName;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
provider.provideContext(buf);
|
providerName = provider.getName();
|
||||||
|
} catch (Throwable t1) {
|
||||||
if (!buf.isEmpty()) {
|
providerName = provider.getClass().getName();
|
||||||
addSeparator(output);
|
|
||||||
output.append("Provider name: ").append(provider.getName()).append("\n");
|
|
||||||
for (Map.Entry<String, String> entry : buf.entrySet()) {
|
|
||||||
output.append(entry.getKey()).append(": ").append(entry.getValue()).append("\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Throwable t) {
|
|
||||||
output.append("\n");
|
|
||||||
try {
|
|
||||||
output.append(provider.getName()).append(" is broken").append("\n");
|
|
||||||
} catch (Throwable th) {
|
|
||||||
output.append(provider.getClass().getName()).append(" is broken").append("\n");
|
|
||||||
// You stupid
|
|
||||||
}
|
|
||||||
// Analyzer is broken
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
output.append(providerName).append(" is broken").append("\n");
|
||||||
|
// ContextProvider is broken
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -90,26 +99,37 @@ public class CrashReportGenerator {
|
|||||||
Throwable throwable, String messageFormat, Object[] args
|
Throwable throwable, String messageFormat, Object[] args
|
||||||
) {
|
) {
|
||||||
boolean analyzerResponsesExist = false;
|
boolean analyzerResponsesExist = false;
|
||||||
for (Analyzer analyzer : ANALYZERS) {
|
|
||||||
if (analyzer != null) {
|
|
||||||
|
|
||||||
String answer;
|
// Do a local copy to avoid deadlocks -OLEGSHA
|
||||||
try {
|
Analyzer[] localAnalyzersCopy =
|
||||||
answer = analyzer.analyze(throwable, messageFormat, args);
|
ANALYZERS.toArray(new Analyzer[ANALYZERS.size()]);
|
||||||
|
|
||||||
if (answer != null && !answer.isEmpty()) {
|
for (Analyzer analyzer : localAnalyzersCopy) {
|
||||||
analyzerResponsesExist = true;
|
if (analyzer == null) continue;
|
||||||
output.append(analyzer.getName()).append(": ").append(answer).append("\n");
|
|
||||||
}
|
String answer;
|
||||||
} catch (Throwable t) {
|
try {
|
||||||
try {
|
answer = analyzer.analyze(throwable, messageFormat, args);
|
||||||
analyzerResponsesExist = true;
|
|
||||||
output.append(analyzer.getName()).append(" is broken").append("\n");
|
if (answer != null && !answer.isEmpty()) {
|
||||||
} catch (Throwable th) {
|
analyzerResponsesExist = true;
|
||||||
// You stupid
|
output.append(analyzer.getName()).append(": ").append(answer).append("\n");
|
||||||
}
|
|
||||||
// Analyzer is broken
|
|
||||||
}
|
}
|
||||||
|
} catch (Throwable t) {
|
||||||
|
analyzerResponsesExist = true;
|
||||||
|
|
||||||
|
output.append("\n");
|
||||||
|
|
||||||
|
String analyzerName;
|
||||||
|
|
||||||
|
try {
|
||||||
|
analyzerName = analyzer.getName();
|
||||||
|
} catch (Throwable t1) {
|
||||||
|
analyzerName = analyzer.getClass().getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
output.append(analyzerName).append(" is broken").append("\n");
|
||||||
|
// Analyzer is broken
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,7 +137,7 @@ public class CrashReportGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void appendMessageFormat(StringBuilder output, String messageFormat, Object... arg) {
|
private static void appendMessageFormat(StringBuilder output, String messageFormat, Object... arg) {
|
||||||
output.append("Provided description: ").append(String.format(messageFormat, arg)).append("\n");
|
output.append("Provided description: \n").append(String.format(messageFormat, arg)).append("\n");
|
||||||
|
|
||||||
addSeparator(output);
|
addSeparator(output);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user