Re: JDK 16 RFR of JDK-8250240: Address use of default constructors in the java.util.concurrent

2020-07-23 Thread Joe Darcy

Hi Martin,

Okay; I'll push with "public", but would be fine if the 166-alpha crew 
want to revisit for "protected".


Thanks for the review,

-Joe

On 7/23/2020 7:49 PM, Martin Buchholz wrote:

I'm happy with this change whether or not the slightly more evocative
"protected" is used.

On Thu, Jul 23, 2020 at 5:43 PM Joe Darcy  wrote:




Re: JDK 16 RFR of JDK-8250240: Address use of default constructors in the java.util.concurrent

2020-07-23 Thread Martin Buchholz
I'm happy with this change whether or not the slightly more evocative
"protected" is used.

On Thu, Jul 23, 2020 at 5:43 PM Joe Darcy  wrote:
>
> Hi Martin,
>
> On 7/23/2020 5:24 PM, Martin Buchholz wrote:
> > So these are all abstract classes where the constructor can only be
> > called via super() ?
>
> Yep.
>
> > In which case one would expect the constructors to be protected, not public.
> > But I'm probably missing some reason why "protected" would not be 100%
> > compatible.
>
> It would be compatible (AFAICT), but the current (implicit) default
> constructors are public, since the classes are public, so I made the new
> explicit constructors public.
>
> On the assumption the upstream JDK 166-alpha repo would want to take in
> this change for as many releases as possible, the public constructors
> could be used for earlier release trains too.
>
> > Historically, we've preferred to put changes in via CVS, but in 2020,
> > we might prefer you make the change directly in openjdk.
> > Doug?
> >
> I'm happy to make the changes in OpenJDK for JDK 16.
>
> Thanks,
>
> -Joe
>


Re: JDK 16 RFR of JDK-8250240: Address use of default constructors in the java.util.concurrent

2020-07-23 Thread Joe Darcy

Hi Martin,

On 7/23/2020 5:24 PM, Martin Buchholz wrote:

So these are all abstract classes where the constructor can only be
called via super() ?


Yep.


In which case one would expect the constructors to be protected, not public.
But I'm probably missing some reason why "protected" would not be 100%
compatible.


It would be compatible (AFAICT), but the current (implicit) default 
constructors are public, since the classes are public, so I made the new 
explicit constructors public.


On the assumption the upstream JDK 166-alpha repo would want to take in 
this change for as many releases as possible, the public constructors 
could be used for earlier release trains too.



Historically, we've preferred to put changes in via CVS, but in 2020,
we might prefer you make the change directly in openjdk.
Doug?


I'm happy to make the changes in OpenJDK for JDK 16.

Thanks,

-Joe



Re: JDK 16 RFR of JDK-8250240: Address use of default constructors in the java.util.concurrent

2020-07-23 Thread Martin Buchholz
So these are all abstract classes where the constructor can only be
called via super() ?
In which case one would expect the constructors to be protected, not public.
But I'm probably missing some reason why "protected" would not be 100%
compatible.

Historically, we've preferred to put changes in via CVS, but in 2020,
we might prefer you make the change directly in openjdk.
Doug?

On Thu, Jul 23, 2020 at 3:04 PM Joe Darcy  wrote:
>
> Hello,
>
> Martin, how would you prefer these changes, or equivalent ones, to get
> into the java.util.concurrent upstream sources?
>
> Several classes in java.util.concurrent rely on default constructors,
> which is not recommended.  Please review the patch below which removes
> them along with the corresponding CSR
> (https://bugs.openjdk.java.net/browse/JDK-8250241); webrev at
> http://cr.openjdk.java.net/~darcy/8250240.0/.
>
> Thanks,
>
> -Joe
>
> diff -r d62da6fc4074
> src/java.base/share/classes/java/util/concurrent/AbstractExecutorService.java
> ---
> a/src/java.base/share/classes/java/util/concurrent/AbstractExecutorService.java
> Thu Jul 23 20:25:41 2020 +0100
> +++
> b/src/java.base/share/classes/java/util/concurrent/AbstractExecutorService.java
> Thu Jul 23 15:01:27 2020 -0700
> @@ -77,6 +77,11 @@
>   public abstract class AbstractExecutorService implements ExecutorService {
>
>   /**
> + * Constructor for subclasses to call.
> + */
> +public AbstractExecutorService() {}
> +
> +/**
>* Returns a {@code RunnableFuture} for the given runnable and default
>* value.
>*
> diff -r d62da6fc4074
> src/java.base/share/classes/java/util/concurrent/ForkJoinTask.java
> --- a/src/java.base/share/classes/java/util/concurrent/ForkJoinTask.java
> Thu Jul 23 20:25:41 2020 +0100
> +++ b/src/java.base/share/classes/java/util/concurrent/ForkJoinTask.java
> Thu Jul 23 15:01:27 2020 -0700
> @@ -242,6 +242,11 @@
>   private static final int SIGNAL   = 1 << 16; // true if joiner waiting
>   private static final int SMASK= 0x;  // short bits for tags
>
> +/**
> + * Constructor for subclasses to call.
> + */
> +public ForkJoinTask() {}
> +
>   static boolean isExceptionalStatus(int s) {  // needed by subclasses
>   return (s & THROWN) != 0;
>   }
> diff -r d62da6fc4074
> src/java.base/share/classes/java/util/concurrent/RecursiveAction.java
> ---
> a/src/java.base/share/classes/java/util/concurrent/RecursiveAction.java
> Thu Jul 23 20:25:41 2020 +0100
> +++
> b/src/java.base/share/classes/java/util/concurrent/RecursiveAction.java
> Thu Jul 23 15:01:27 2020 -0700
> @@ -166,6 +166,11 @@
>   private static final long serialVersionUID = 5232453952276485070L;
>
>   /**
> + * Constructor for subclasses to call.
> + */
> +public RecursiveAction() {}
> +
> +/**
>* The main computation performed by this task.
>*/
>   protected abstract void compute();
> diff -r d62da6fc4074
> src/java.base/share/classes/java/util/concurrent/RecursiveTask.java
> ---
> a/src/java.base/share/classes/java/util/concurrent/RecursiveTask.java
> Thu Jul 23 20:25:41 2020 +0100
> +++
> b/src/java.base/share/classes/java/util/concurrent/RecursiveTask.java
> Thu Jul 23 15:01:27 2020 -0700
> @@ -69,6 +69,11 @@
>   private static final long serialVersionUID = 5232453952276485270L;
>
>   /**
> + * Constructor for subclasses to call.
> + */
> +public RecursiveTask() {}
> +
> +/**
>* The result of the computation.
>*/
>   @SuppressWarnings("serial") // Conditionally serializable
> diff -r d62da6fc4074
> src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java
> ---
> a/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java
> Thu Jul 23 20:25:41 2020 +0100
> +++
> b/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java
> Thu Jul 23 15:01:27 2020 -0700
> @@ -65,6 +65,11 @@
>
>   private static final long serialVersionUID = 7373984972572414692L;
>
> +/**
> + * Constructor for subclasses to call.
> + */
> +public AbstractQueuedLongSynchronizer() {}
> +
>   /*
>* To keep sources in sync, the remainder of this source file is
>* exactly cloned from AbstractQueuedSynchronizer, replacing class
>


Re: JDK 16 RFR of JDK-8250240: Address use of default constructors in the java.util.concurrent

2020-07-23 Thread Lance Andersen
+1

--

Lance Andersen| Principal Member of Technical Staff | +1.781.442.2037
Oracle Java Engineering 
1 Network Drive
Burlington, MA 01803
lance.ander...@oracle.com

Sent from my iPhone

> On Jul 23, 2020, at 6:04 PM, Joe Darcy  wrote:
> 
> Hello,
> 
> Martin, how would you prefer these changes, or equivalent ones, to get into 
> the java.util.concurrent upstream sources?
> 
> Several classes in java.util.concurrent rely on default constructors, which 
> is not recommended.  Please review the patch below which removes them along 
> with the corresponding CSR 
> (https://bugs.openjdk.java.net/browse/JDK-8250241); webrev at 
> http://cr.openjdk.java.net/~darcy/8250240.0/.
> 
> Thanks,
> 
> -Joe
> 
> diff -r d62da6fc4074 
> src/java.base/share/classes/java/util/concurrent/AbstractExecutorService.java
> --- 
> a/src/java.base/share/classes/java/util/concurrent/AbstractExecutorService.java
>  Thu Jul 23 20:25:41 2020 +0100
> +++ 
> b/src/java.base/share/classes/java/util/concurrent/AbstractExecutorService.java
>  Thu Jul 23 15:01:27 2020 -0700
> @@ -77,6 +77,11 @@
>  public abstract class AbstractExecutorService implements ExecutorService {
> 
>  /**
> + * Constructor for subclasses to call.
> + */
> +public AbstractExecutorService() {}
> +
> +/**
>   * Returns a {@code RunnableFuture} for the given runnable and default
>   * value.
>   *
> diff -r d62da6fc4074 
> src/java.base/share/classes/java/util/concurrent/ForkJoinTask.java
> --- a/src/java.base/share/classes/java/util/concurrent/ForkJoinTask.java Thu 
> Jul 23 20:25:41 2020 +0100
> +++ b/src/java.base/share/classes/java/util/concurrent/ForkJoinTask.java Thu 
> Jul 23 15:01:27 2020 -0700
> @@ -242,6 +242,11 @@
>  private static final int SIGNAL   = 1 << 16; // true if joiner waiting
>  private static final int SMASK= 0x;  // short bits for tags
> 
> +/**
> + * Constructor for subclasses to call.
> + */
> +public ForkJoinTask() {}
> +
>  static boolean isExceptionalStatus(int s) {  // needed by subclasses
>  return (s & THROWN) != 0;
>  }
> diff -r d62da6fc4074 
> src/java.base/share/classes/java/util/concurrent/RecursiveAction.java
> --- a/src/java.base/share/classes/java/util/concurrent/RecursiveAction.java 
> Thu Jul 23 20:25:41 2020 +0100
> +++ b/src/java.base/share/classes/java/util/concurrent/RecursiveAction.java 
> Thu Jul 23 15:01:27 2020 -0700
> @@ -166,6 +166,11 @@
>  private static final long serialVersionUID = 5232453952276485070L;
> 
>  /**
> + * Constructor for subclasses to call.
> + */
> +public RecursiveAction() {}
> +
> +/**
>   * The main computation performed by this task.
>   */
>  protected abstract void compute();
> diff -r d62da6fc4074 
> src/java.base/share/classes/java/util/concurrent/RecursiveTask.java
> --- a/src/java.base/share/classes/java/util/concurrent/RecursiveTask.java Thu 
> Jul 23 20:25:41 2020 +0100
> +++ b/src/java.base/share/classes/java/util/concurrent/RecursiveTask.java Thu 
> Jul 23 15:01:27 2020 -0700
> @@ -69,6 +69,11 @@
>  private static final long serialVersionUID = 5232453952276485270L;
> 
>  /**
> + * Constructor for subclasses to call.
> + */
> +public RecursiveTask() {}
> +
> +/**
>   * The result of the computation.
>   */
>  @SuppressWarnings("serial") // Conditionally serializable
> diff -r d62da6fc4074 
> src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java
> --- 
> a/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java
>  Thu Jul 23 20:25:41 2020 +0100
> +++ 
> b/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java
>  Thu Jul 23 15:01:27 2020 -0700
> @@ -65,6 +65,11 @@
> 
>  private static final long serialVersionUID = 7373984972572414692L;
> 
> +/**
> + * Constructor for subclasses to call.
> + */
> +public AbstractQueuedLongSynchronizer() {}
> +
>  /*
>   * To keep sources in sync, the remainder of this source file is
>   * exactly cloned from AbstractQueuedSynchronizer, replacing class
> 


JDK 16 RFR of JDK-8250240: Address use of default constructors in the java.util.concurrent

2020-07-23 Thread Joe Darcy

Hello,

Martin, how would you prefer these changes, or equivalent ones, to get 
into the java.util.concurrent upstream sources?


Several classes in java.util.concurrent rely on default constructors, 
which is not recommended.  Please review the patch below which removes 
them along with the corresponding CSR 
(https://bugs.openjdk.java.net/browse/JDK-8250241); webrev at 
http://cr.openjdk.java.net/~darcy/8250240.0/.


Thanks,

-Joe

diff -r d62da6fc4074 
src/java.base/share/classes/java/util/concurrent/AbstractExecutorService.java
--- 
a/src/java.base/share/classes/java/util/concurrent/AbstractExecutorService.java 
Thu Jul 23 20:25:41 2020 +0100
+++ 
b/src/java.base/share/classes/java/util/concurrent/AbstractExecutorService.java 
Thu Jul 23 15:01:27 2020 -0700

@@ -77,6 +77,11 @@
 public abstract class AbstractExecutorService implements ExecutorService {

 /**
+ * Constructor for subclasses to call.
+ */
+    public AbstractExecutorService() {}
+
+    /**
  * Returns a {@code RunnableFuture} for the given runnable and default
  * value.
  *
diff -r d62da6fc4074 
src/java.base/share/classes/java/util/concurrent/ForkJoinTask.java
--- a/src/java.base/share/classes/java/util/concurrent/ForkJoinTask.java 
Thu Jul 23 20:25:41 2020 +0100
+++ b/src/java.base/share/classes/java/util/concurrent/ForkJoinTask.java 
Thu Jul 23 15:01:27 2020 -0700

@@ -242,6 +242,11 @@
 private static final int SIGNAL   = 1 << 16; // true if joiner waiting
 private static final int SMASK    = 0x;  // short bits for tags

+    /**
+ * Constructor for subclasses to call.
+ */
+    public ForkJoinTask() {}
+
 static boolean isExceptionalStatus(int s) {  // needed by subclasses
 return (s & THROWN) != 0;
 }
diff -r d62da6fc4074 
src/java.base/share/classes/java/util/concurrent/RecursiveAction.java
--- 
a/src/java.base/share/classes/java/util/concurrent/RecursiveAction.java 
Thu Jul 23 20:25:41 2020 +0100
+++ 
b/src/java.base/share/classes/java/util/concurrent/RecursiveAction.java 
Thu Jul 23 15:01:27 2020 -0700

@@ -166,6 +166,11 @@
 private static final long serialVersionUID = 5232453952276485070L;

 /**
+ * Constructor for subclasses to call.
+ */
+    public RecursiveAction() {}
+
+    /**
  * The main computation performed by this task.
  */
 protected abstract void compute();
diff -r d62da6fc4074 
src/java.base/share/classes/java/util/concurrent/RecursiveTask.java
--- 
a/src/java.base/share/classes/java/util/concurrent/RecursiveTask.java 
Thu Jul 23 20:25:41 2020 +0100
+++ 
b/src/java.base/share/classes/java/util/concurrent/RecursiveTask.java 
Thu Jul 23 15:01:27 2020 -0700

@@ -69,6 +69,11 @@
 private static final long serialVersionUID = 5232453952276485270L;

 /**
+ * Constructor for subclasses to call.
+ */
+    public RecursiveTask() {}
+
+    /**
  * The result of the computation.
  */
 @SuppressWarnings("serial") // Conditionally serializable
diff -r d62da6fc4074 
src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java
--- 
a/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java 
Thu Jul 23 20:25:41 2020 +0100
+++ 
b/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java 
Thu Jul 23 15:01:27 2020 -0700

@@ -65,6 +65,11 @@

 private static final long serialVersionUID = 7373984972572414692L;

+    /**
+ * Constructor for subclasses to call.
+ */
+    public AbstractQueuedLongSynchronizer() {}
+
 /*
  * To keep sources in sync, the remainder of this source file is
  * exactly cloned from AbstractQueuedSynchronizer, replacing class