Hi,
This is a fix that upgrades the old HTTP and HTTPS legacy stack to use
virtual-thread friendly locking instead of
synchronized monitors.
Most of the changes are mechanical - but there are still a numbers of subtle
non-mechanical differences that are
outlined below:
1. src/java.base/share/classes/sun/net/www/MessageHeader.java:
`MessageHeader::print(PrintStream)` => synchronization modified to not
synchronize on this while printing
( a snapshot of the data is taken before printing instead)
2. src/java.base/share/classes/sun/net/www/MeteredStream.java:
`MeteredStream::close` was missing synchronization: it is now protected by
the lock
3. src/java.base/share/classes/sun/net/www/http/ChunkedOutputStream.java:
`ChunkedOutputStream` no longer extends `PrintStream` but extends
`OutputStream` directly.
Extending `PrintStream` is problematic for virtual thread. After careful
analysis, it appeared that
`ChunkedOutputStream` didn't really need to extend `PrintStream`.
`ChunkedOutputStream`
is already wrapping a `PrintStream`. `ChunkedOutputStream` is never
returned directly to user
code but is wrapped in another stream. `ChunkedOutputStream` completely
reimplement and
reverse the flush logic implemented by its old super class`PrintStream`
which leads me to believe
there was no real reason for it to extend `PrintStream` - except for being
able to call its `checkError`
method - which can be done by using `instanceof ChunkedOutputStream` in the
caller instead of
casting to PrintStream.
4. src/java.base/share/classes/sun/net/www/http/HttpClient.java:
Synchronization removed from `HttpClient::privilegedOpenServer` and
replaced by an `assert`.
There is no need for a synchronized here as the method is only called from
a method that already
holds the lock.
5. src/java.base/share/classes/sun/net/www/http/KeepAliveCache.java:
Synchronization removed from `KeepAliveCache::removeVector` and replaced by
an `assert`.
This method is only called from methods already protected by the lock.
Also the method has been made private.
6. src/java.base/share/classes/sun/net/www/http/KeepAliveStream.java
`queuedForCleanup` is made volatile as it is read and written directly from
outside the class
and without protection by the `KeepAliveCleanerEntry`.
Lock protection is also added to `close()`, which was missing it.
Some methods that have no lock protection and did not need it because only
called from
within code blocks protected by the lock have aquired an `assert
isLockHeldByCurrentThread();`
7. Concrete subclasses of `AuthenticationInfo` that provide an implementation
for
`AuthenticationInfo::setHeaders(HttpURLConnection conn, HeaderParser p,
String raw)` have
acquired an `assert conn.isLockheldByCurrentThread();` as the method should
only be called
from within a lock-protected block in `s.n.w.p.h.HttpURLConnection`
8. src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java
Several methods in this class have a acquired an `assert
isLockheldByCurrentThread();`
to help track the fact that AuthenticationInfo::setHeaders is only called
while
holding the lock.
Synchronization was also removed from some method that didn't need it
because only
called from within code blocks protected by the lock:
`getOutputStream0()`: synchronization removed and replaced by an `assert
isLockheldByCurrentThread();`
`setCookieHeader()`: synchronization removed and replaced by an `assert
isLockheldByCurrentThread();`
`getInputStream0()`: synchronization removed and replaced by an `assert
isLockheldByCurrentThread();`
`StreamingOutputStream`: small change to accomodate point 3. above (changes
in ChunkedOutputStream).
9.
src/java.base/share/classes/sun/net/www/protocol/http/NegotiateAuthentication.java.:
synchronization removed from `setHeaders` and replace by an assert. See
point 7. above.
10.
src/java.base/unix/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java:
synchronization removed from `setHeaders` and replace by an assert. See
point 7. above.
11.
src/java.base/windows/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java:
synchronization removed from `setHeaders` and replace by an assert. See
point 7. above.
-------------
Commit messages:
- 8229867: Re-examine synchronization usages in http and https protocol
handlers
Changes: https://git.openjdk.java.net/jdk/pull/558/files
Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=558&range=00
Issue: https://bugs.openjdk.java.net/browse/JDK-8229867
Stats: 1116 lines in 18 files changed: 551 ins; 149 del; 416 mod
Patch: https://git.openjdk.java.net/jdk/pull/558.diff
Fetch: git fetch https://git.openjdk.java.net/jdk pull/558/head:pull/558
PR: https://git.openjdk.java.net/jdk/pull/558