mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-23 04:24:49 +02:00
6278014: java.util.logging.LogRecord.getThreadID() should provide real thread id
Make j.u.l. thread id a copy of Thread's id, for small values of thread id. Reviewed-by: alanb
This commit is contained in:
parent
4910f50ea2
commit
c0b32f4e3c
2 changed files with 42 additions and 13 deletions
|
@ -25,6 +25,8 @@
|
||||||
|
|
||||||
package java.util.logging;
|
package java.util.logging;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -64,9 +66,24 @@ import java.io.*;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class LogRecord implements java.io.Serializable {
|
public class LogRecord implements java.io.Serializable {
|
||||||
private static long globalSequenceNumber;
|
private static final AtomicLong globalSequenceNumber
|
||||||
private static int nextThreadId=10;
|
= new AtomicLong(0);
|
||||||
private static ThreadLocal<Integer> threadIds = new ThreadLocal<Integer>();
|
|
||||||
|
/**
|
||||||
|
* The default value of threadID will be the current thread's
|
||||||
|
* thread id, for ease of correlation, unless it is greater than
|
||||||
|
* MIN_SEQUENTIAL_THREAD_ID, in which case we try harder to keep
|
||||||
|
* our promise to keep threadIDs unique by avoiding collisions due
|
||||||
|
* to 32-bit wraparound. Unfortunately, LogRecord.getThreadID()
|
||||||
|
* returns int, while Thread.getId() returns long.
|
||||||
|
*/
|
||||||
|
private static final int MIN_SEQUENTIAL_THREAD_ID = Integer.MAX_VALUE / 2;
|
||||||
|
|
||||||
|
private static final AtomicInteger nextThreadId
|
||||||
|
= new AtomicInteger(MIN_SEQUENTIAL_THREAD_ID);
|
||||||
|
|
||||||
|
private static final ThreadLocal<Integer> threadIds
|
||||||
|
= new ThreadLocal<Integer>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @serial Logging message level
|
* @serial Logging message level
|
||||||
|
@ -122,6 +139,23 @@ public class LogRecord implements java.io.Serializable {
|
||||||
private transient Object parameters[];
|
private transient Object parameters[];
|
||||||
private transient ResourceBundle resourceBundle;
|
private transient ResourceBundle resourceBundle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the default value for a new LogRecord's threadID.
|
||||||
|
*/
|
||||||
|
private int defaultThreadID() {
|
||||||
|
long tid = Thread.currentThread().getId();
|
||||||
|
if (tid < MIN_SEQUENTIAL_THREAD_ID) {
|
||||||
|
return (int) tid;
|
||||||
|
} else {
|
||||||
|
Integer id = threadIds.get();
|
||||||
|
if (id == null) {
|
||||||
|
id = nextThreadId.getAndIncrement();
|
||||||
|
threadIds.set(id);
|
||||||
|
}
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a LogRecord with the given level and message values.
|
* Construct a LogRecord with the given level and message values.
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -144,15 +178,8 @@ public class LogRecord implements java.io.Serializable {
|
||||||
this.level = level;
|
this.level = level;
|
||||||
message = msg;
|
message = msg;
|
||||||
// Assign a thread ID and a unique sequence number.
|
// Assign a thread ID and a unique sequence number.
|
||||||
synchronized (LogRecord.class) {
|
sequenceNumber = globalSequenceNumber.getAndIncrement();
|
||||||
sequenceNumber = globalSequenceNumber++;
|
threadID = defaultThreadID();
|
||||||
Integer id = threadIds.get();
|
|
||||||
if (id == null) {
|
|
||||||
id = new Integer(nextThreadId++);
|
|
||||||
threadIds.set(id);
|
|
||||||
}
|
|
||||||
threadID = id.intValue();
|
|
||||||
}
|
|
||||||
millis = System.currentTimeMillis();
|
millis = System.currentTimeMillis();
|
||||||
needToInferCaller = true;
|
needToInferCaller = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @test
|
* @test
|
||||||
* @bug 6830220
|
* @bug 6830220 6278014
|
||||||
* @summary Test Logger subclasses
|
* @summary Test Logger subclasses
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -68,6 +68,8 @@ public class LoggerSubclass {
|
||||||
l.getSequenceNumber());
|
l.getSequenceNumber());
|
||||||
equal(lastThreadID.get(),
|
equal(lastThreadID.get(),
|
||||||
l.getThreadID());
|
l.getThreadID());
|
||||||
|
equal((int) Thread.currentThread().getId(),
|
||||||
|
l.getThreadID());
|
||||||
}
|
}
|
||||||
lastSequenceNumber.set(l.getSequenceNumber());
|
lastSequenceNumber.set(l.getSequenceNumber());
|
||||||
lastThreadID.set(l.getThreadID());
|
lastThreadID.set(l.getThreadID());
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue