ThreadPoolExecutor keepAliveTime != 0 || allowCoreThreadTimeOut (2)

Pavel Rappo pavel.rappo at oracle.com
Tue May 6 09:42:48 UTC 2014


The previous email I sent appeared to have no patch attached to it. I will add it inlined this time. Sorry for that.

Thanks
-Pavel

diff -r b7cb13e9f459 tests-custom/src/main/java/org/openjdk/jcstress/tests/executors/ThreadPoolExecutorKeepAliveTest.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests-custom/src/main/java/org/openjdk/jcstress/tests/executors/ThreadPoolExecutorKeepAliveTest.java	Tue May 06 10:24:30 2014 +0100
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package org.openjdk.jcstress.tests.executors;
+
+import org.openjdk.jcstress.annotations.Actor;
+import org.openjdk.jcstress.annotations.Arbiter;
+import org.openjdk.jcstress.annotations.JCStressTest;
+import org.openjdk.jcstress.annotations.State;
+import org.openjdk.jcstress.infra.results.LongResult2;
+
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+ at JCStressTest
+ at State
+public class ThreadPoolExecutorKeepAliveTest {
+
+    public final ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 2, 1L,
+            TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(2));
+
+    @Actor
+    public void actor1() {
+        try {
+            pool.allowCoreThreadTimeOut(true);
+        } catch (IllegalArgumentException ignored) {}
+    }
+
+    @Actor
+    public void actor2() {
+        try {
+            pool.setKeepAliveTime(0, TimeUnit.MILLISECONDS);
+        } catch (IllegalArgumentException ignored) {}
+    }
+
+    @Arbiter
+    public void actor3(LongResult2 r) {
+        r.r1 = pool.allowsCoreThreadTimeOut() ? 1 : 0;
+        r.r2 = pool.getKeepAliveTime(TimeUnit.MILLISECONDS);
+    }
+}
diff -r b7cb13e9f459 tests-custom/src/main/resources/org/openjdk/jcstress/desc/executors.xml
--- a/tests-custom/src/main/resources/org/openjdk/jcstress/desc/executors.xml	Mon May 05 23:05:17 2014 +0400
+++ b/tests-custom/src/main/resources/org/openjdk/jcstress/desc/executors.xml	Tue May 06 10:24:30 2014 +0100
@@ -1,6 +1,6 @@
 <!--
 
-    Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+    Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
     DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 
     This code is free software; you can redistribute it and/or modify it
@@ -54,5 +54,40 @@
         </unmatched>
     </test>
 
+    <test name="org.openjdk.jcstress.tests.executors.ThreadPoolExecutorKeepAliveTest">
+        <contributed-by>Pavel Rappo (pavel.rappo at oracle.com)</contributed-by>
+        <description>
+            Tests if ThreadPoolExecutor invariant can be violated:
+            keepAliveTime == 0 ⇒ !allowCoreThreadTimeOut
+        </description>
+        <case>
+            <match>[1, 1]</match>
+            <expect>ACCEPTABLE</expect>
+            <description>
+                allowCoreThreadTimeOut had changed, and keepAliveTime failed to change.
+            </description>
+        </case>
+        <case>
+            <match>[0, 0]</match>
+            <expect>ACCEPTABLE</expect>
+            <description>
+                keepAliveTime had changed, and allowCoreThreadTimeOut failed to change.
+            </description>
+        </case>
+        <case>
+            <match>[1, 0]</match>
+            <expect>ACCEPTABLE_INTERESTING</expect>
+            <description>
+                The update under race can break the
+                (keepAliveTime == 0 ⇒ !allowCoreThreadTimeOut) invariant.
+            </description>
+        </case>
+        <unmatched>
+            <expect>FORBIDDEN</expect>
+            <description>
+                This case is not expected.
+            </description>
+        </unmatched>
+    </test>
 
-</testsuite>
\ No newline at end of file
+</testsuite>






More information about the jcstress-dev mailing list