mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 07:14:30 +02:00
8284161: Implementation of Virtual Threads (Preview)
Co-authored-by: Ron Pressler <rpressler@openjdk.org> Co-authored-by: Alan Bateman <alanb@openjdk.org> Co-authored-by: Erik Österlund <eosterlund@openjdk.org> Co-authored-by: Andrew Haley <aph@openjdk.org> Co-authored-by: Rickard Bäckman <rbackman@openjdk.org> Co-authored-by: Markus Grönlund <mgronlun@openjdk.org> Co-authored-by: Leonid Mesnik <lmesnik@openjdk.org> Co-authored-by: Serguei Spitsyn <sspitsyn@openjdk.org> Co-authored-by: Chris Plummer <cjplummer@openjdk.org> Co-authored-by: Coleen Phillimore <coleenp@openjdk.org> Co-authored-by: Robbin Ehn <rehn@openjdk.org> Co-authored-by: Stefan Karlsson <stefank@openjdk.org> Co-authored-by: Thomas Schatzl <tschatzl@openjdk.org> Co-authored-by: Sergey Kuksenko <skuksenko@openjdk.org> Reviewed-by: lancea, eosterlund, rehn, sspitsyn, stefank, tschatzl, dfuchs, lmesnik, dcubed, kevinw, amenkov, dlong, mchung, psandoz, bpb, coleenp, smarks, egahlin, mseledtsov, coffeys, darcy
This commit is contained in:
parent
5212535a27
commit
9583e3657e
1133 changed files with 95935 additions and 8335 deletions
|
@ -32,6 +32,7 @@ import java.io.FileInputStream;
|
|||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.invoke.MethodHandle;
|
||||
|
@ -62,6 +63,7 @@ import java.util.PropertyPermission;
|
|||
import java.util.ResourceBundle;
|
||||
import java.util.Set;
|
||||
import java.util.WeakHashMap;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.function.Supplier;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.stream.Stream;
|
||||
|
@ -78,8 +80,13 @@ import jdk.internal.logger.LoggerFinderLoader;
|
|||
import jdk.internal.logger.LazyLoggers;
|
||||
import jdk.internal.logger.LocalizedLoggerWrapper;
|
||||
import jdk.internal.util.SystemProps;
|
||||
import jdk.internal.vm.Continuation;
|
||||
import jdk.internal.vm.ContinuationScope;
|
||||
import jdk.internal.vm.StackableScope;
|
||||
import jdk.internal.vm.ThreadContainer;
|
||||
import jdk.internal.vm.annotation.IntrinsicCandidate;
|
||||
import jdk.internal.vm.annotation.Stable;
|
||||
import jdk.internal.vm.annotation.ChangesCurrentThread;
|
||||
import sun.nio.fs.DefaultFileSystemProvider;
|
||||
import sun.reflect.annotation.AnnotationType;
|
||||
import sun.nio.ch.Interruptible;
|
||||
|
@ -2054,12 +2061,12 @@ public final class System {
|
|||
/**
|
||||
* Create PrintStream for stdout/err based on encoding.
|
||||
*/
|
||||
private static PrintStream newPrintStream(FileOutputStream fos, String enc) {
|
||||
private static PrintStream newPrintStream(OutputStream out, String enc) {
|
||||
if (enc != null) {
|
||||
return new PrintStream(new BufferedOutputStream(fos, 128), true,
|
||||
return new PrintStream(new BufferedOutputStream(out, 128), true,
|
||||
Charset.forName(enc, UTF_8.INSTANCE));
|
||||
}
|
||||
return new PrintStream(new BufferedOutputStream(fos, 128), true);
|
||||
return new PrintStream(new BufferedOutputStream(out, 128), true);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -2180,17 +2187,10 @@ public final class System {
|
|||
// classes are used.
|
||||
VM.initializeOSEnvironment();
|
||||
|
||||
// The main thread is not added to its thread group in the same
|
||||
// way as other threads; we must do it ourselves here.
|
||||
Thread current = Thread.currentThread();
|
||||
current.getThreadGroup().add(current);
|
||||
// start Finalizer and Reference Handler threads
|
||||
SharedSecrets.getJavaLangRefAccess().startThreads();
|
||||
|
||||
// Subsystems that are invoked during initialization can invoke
|
||||
// VM.isBooted() in order to avoid doing things that should
|
||||
// wait until the VM is fully initialized. The initialization level
|
||||
// is incremented from 0 to 1 here to indicate the first phase of
|
||||
// initialization has completed.
|
||||
// IMPORTANT: Ensure that this remains the last initialization action!
|
||||
// system properties, java.lang and other core classes are now initialized
|
||||
VM.initLevel(1);
|
||||
}
|
||||
|
||||
|
@ -2513,6 +2513,104 @@ public final class System {
|
|||
public void exit(int statusCode) {
|
||||
Shutdown.exit(statusCode);
|
||||
}
|
||||
|
||||
public Thread[] getAllThreads() {
|
||||
return Thread.getAllThreads();
|
||||
}
|
||||
|
||||
public ThreadContainer threadContainer(Thread thread) {
|
||||
return thread.threadContainer();
|
||||
}
|
||||
|
||||
public void start(Thread thread, ThreadContainer container) {
|
||||
thread.start(container);
|
||||
}
|
||||
|
||||
public StackableScope headStackableScope(Thread thread) {
|
||||
return thread.headStackableScopes();
|
||||
}
|
||||
|
||||
public void setHeadStackableScope(StackableScope scope) {
|
||||
Thread.setHeadStackableScope(scope);
|
||||
}
|
||||
|
||||
public Thread currentCarrierThread() {
|
||||
return Thread.currentCarrierThread();
|
||||
}
|
||||
|
||||
@ChangesCurrentThread
|
||||
public <V> V executeOnCarrierThread(Callable<V> task) throws Exception {
|
||||
Thread thread = Thread.currentThread();
|
||||
if (thread.isVirtual()) {
|
||||
Thread carrier = Thread.currentCarrierThread();
|
||||
carrier.setCurrentThread(carrier);
|
||||
try {
|
||||
return task.call();
|
||||
} finally {
|
||||
carrier.setCurrentThread(thread);
|
||||
}
|
||||
} else {
|
||||
return task.call();
|
||||
}
|
||||
}
|
||||
|
||||
public <T> T getCarrierThreadLocal(ThreadLocal<T> local) {
|
||||
return local.getCarrierThreadLocal();
|
||||
}
|
||||
|
||||
public <T> void setCarrierThreadLocal(ThreadLocal<T> local, T value) {
|
||||
local.setCarrierThreadLocal(value);
|
||||
}
|
||||
|
||||
public Object[] extentLocalCache() {
|
||||
return Thread.extentLocalCache();
|
||||
}
|
||||
|
||||
public void setExtentLocalCache(Object[] cache) {
|
||||
Thread.setExtentLocalCache(cache);
|
||||
}
|
||||
|
||||
public Object extentLocalBindings() {
|
||||
return Thread.extentLocalBindings();
|
||||
}
|
||||
|
||||
public void setExtentLocalBindings(Object bindings) {
|
||||
Thread.setExtentLocalBindings(bindings);
|
||||
}
|
||||
|
||||
public Continuation getContinuation(Thread thread) {
|
||||
return thread.getContinuation();
|
||||
}
|
||||
|
||||
public void setContinuation(Thread thread, Continuation continuation) {
|
||||
thread.setContinuation(continuation);
|
||||
}
|
||||
|
||||
public ContinuationScope virtualThreadContinuationScope() {
|
||||
return VirtualThread.continuationScope();
|
||||
}
|
||||
|
||||
public void parkVirtualThread() {
|
||||
VirtualThread.park();
|
||||
}
|
||||
|
||||
public void parkVirtualThread(long nanos) {
|
||||
VirtualThread.parkNanos(nanos);
|
||||
}
|
||||
|
||||
public void unparkVirtualThread(Thread thread) {
|
||||
if (thread instanceof VirtualThread vthread) {
|
||||
vthread.unpark();
|
||||
} else {
|
||||
throw new IllegalArgumentException("Not a virtual thread");
|
||||
}
|
||||
}
|
||||
|
||||
public StackWalker newStackWalkerInstance(Set<StackWalker.Option> options,
|
||||
ContinuationScope contScope,
|
||||
Continuation continuation) {
|
||||
return StackWalker.newInstance(options, null, contScope, continuation);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue