blob: 632fe1b1cf9a7d7b07ecd8ef4068a2959c657072 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
# HG changeset patch
# User coffeys
# Date 1360860659 0
# Node ID 828b93329939ec20530ed98f42b2966b2ea53048
# Parent cff0241d217f7b463d58ddcd0add8d41de9eb280
8007393: Possible race condition after JDK-6664509
Reviewed-by: mchung
--- jdk/src/share/classes/java/util/logging/LogManager.java Tue Feb 05 23:33:50 2013 +0000
+++ jdk/src/share/classes/java/util/logging/LogManager.java Thu Feb 14 16:50:59 2013 +0000
@@ -411,7 +411,40 @@ public class LogManager {
}
Logger demandSystemLogger(String name, String resourceBundleName) {
- return systemContext.demandLogger(name, resourceBundleName);
+ // Add a system logger in the system context's namespace
+ final Logger sysLogger = systemContext.demandLogger(name, resourceBundleName);
+
+ // Add the system logger to the LogManager's namespace if not exist
+ // so that there is only one single logger of the given name.
+ // System loggers are visible to applications unless a logger of
+ // the same name has been added.
+ Logger logger;
+ do {
+ // First attempt to call addLogger instead of getLogger
+ // This would avoid potential bug in custom LogManager.getLogger
+ // implementation that adds a logger if not exists
+ if (addLogger(sysLogger)) {
+ // successfully added the new system logger
+ logger = sysLogger;
+ } else {
+ logger = getLogger(name);
+ }
+ } while (logger == null);
+
+ // LogManager will set the sysLogger's handlers via LogManager.addLogger method.
+ if (logger != sysLogger && sysLogger.getHandlers().length == 0) {
+ // if logger already exists but handlers not set
+ final Logger l = logger;
+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
+ public Void run() {
+ for (Handler hdl : l.getHandlers()) {
+ sysLogger.addHandler(hdl);
+ }
+ return null;
+ }
+ });
+ }
+ return sysLogger;
}
// LoggerContext maintains the logger namespace per context.
@@ -619,22 +652,7 @@ public class LogManager {
}
} while (result == null);
}
- // Add the system logger to the LogManager's namespace if not exists
- // The LogManager will set its handlers via the LogManager.addLogger method.
- if (!manager.addLogger(result) && result.getHandlers().length == 0) {
- // if logger already exists but handlers not set
- final Logger l = manager.getLogger(name);
- final Logger logger = result;
- AccessController.doPrivileged(new PrivilegedAction<Void>() {
- public Void run() {
- for (Handler hdl : l.getHandlers()) {
- logger.addHandler(hdl);
- }
- return null;
- }
- });
- }
- return result;
+ return result;
}
}
|