jdk/test/java/util/concurrent/BlockingQueue/OfferDrainToLoops.java
author martin
Tue, 15 Sep 2015 21:56:04 -0700
changeset 32649 2ee9017c7597
parent 9242 ef138d47df58
child 34347 4a17f9e90a0f
permissions -rw-r--r--
8136583: Core libraries should use blessed modifier order Summary: Run blessed-modifier-order script (see bug) Reviewed-by: psandoz, chegar, alanb, plevart
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3415
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
     1
/*
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
     2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
     3
 *
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
     4
 * This code is free software; you can redistribute it and/or modify it
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
     5
 * under the terms of the GNU General Public License version 2 only, as
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
     6
 * published by the Free Software Foundation.
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
     7
 *
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
     8
 * This code is distributed in the hope that it will be useful, but WITHOUT
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
     9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    10
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    11
 * version 2 for more details (a copy is included in the LICENSE file that
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    12
 * accompanied this code).
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    13
 *
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License version
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    15
 * 2 along with this work; if not, write to the Free Software Foundation,
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    16
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    17
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4110
diff changeset
    18
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4110
diff changeset
    19
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4110
diff changeset
    20
 * questions.
3415
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    21
 */
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    22
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    23
/*
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    24
 * This file is available under and governed by the GNU General Public
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    25
 * License version 2 only, as published by the Free Software Foundation.
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    26
 * However, the following notice accompanied the original version of this
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    27
 * file:
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    28
 *
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    29
 * Written by Doug Lea with assistance from members of JCP JSR-166
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    30
 * Expert Group and released to the public domain, as explained at
9242
ef138d47df58 7034657: Update Creative Commons license URL in legal notices
dl
parents: 5506
diff changeset
    31
 * http://creativecommons.org/publicdomain/zero/1.0/
3415
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    32
 */
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    33
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    34
/*
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    35
 * @test
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    36
 * @bug 6805775 6815766
3708
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    37
 * @run main OfferDrainToLoops 300
3415
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    38
 * @summary Test concurrent offer vs. drainTo
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    39
 */
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    40
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    41
import java.util.*;
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    42
import java.util.concurrent.*;
3708
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    43
import java.util.concurrent.atomic.*;
3415
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    44
3708
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    45
@SuppressWarnings({"unchecked", "rawtypes", "deprecation"})
3415
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    46
public class OfferDrainToLoops {
3708
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    47
    final long testDurationMillisDefault = 10L * 1000L;
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    48
    final long testDurationMillis;
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    49
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    50
    OfferDrainToLoops(String[] args) {
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    51
        testDurationMillis = (args.length > 0) ?
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    52
            Long.valueOf(args[0]) : testDurationMillisDefault;
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    53
    }
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    54
3415
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    55
    void checkNotContainsNull(Iterable it) {
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    56
        for (Object x : it)
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    57
            check(x != null);
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    58
    }
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    59
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    60
    void test(String[] args) throws Throwable {
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    61
        test(new LinkedBlockingQueue());
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    62
        test(new LinkedBlockingQueue(2000));
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    63
        test(new LinkedBlockingDeque());
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    64
        test(new LinkedBlockingDeque(2000));
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    65
        test(new ArrayBlockingQueue(2000));
4110
ac033ba6ede4 6865582: jsr166y - jsr166 maintenance update
dl
parents: 3708
diff changeset
    66
        test(new LinkedTransferQueue());
3708
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    67
    }
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    68
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    69
    Random getRandom() {
4110
ac033ba6ede4 6865582: jsr166y - jsr166 maintenance update
dl
parents: 3708
diff changeset
    70
        return ThreadLocalRandom.current();
3415
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    71
    }
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    72
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    73
    void test(final BlockingQueue q) throws Throwable {
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    74
        System.out.println(q.getClass().getSimpleName());
3708
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    75
        final long testDurationNanos = testDurationMillis * 1000L * 1000L;
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    76
        final long quittingTimeNanos = System.nanoTime() + testDurationNanos;
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    77
        final long timeoutMillis = 10L * 1000L;
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    78
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    79
        /** Poor man's bounded buffer. */
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    80
        final AtomicLong approximateCount = new AtomicLong(0L);
3415
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
    81
3708
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    82
        abstract class CheckedThread extends Thread {
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    83
            CheckedThread(String name) {
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    84
                super(name);
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    85
                setDaemon(true);
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    86
                start();
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    87
            }
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    88
            /** Polls for quitting time. */
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    89
            protected boolean quittingTime() {
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    90
                return System.nanoTime() - quittingTimeNanos > 0;
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    91
            }
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    92
            /** Polls occasionally for quitting time. */
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    93
            protected boolean quittingTime(long i) {
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    94
                return (i % 1024) == 0 && quittingTime();
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    95
            }
32649
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 9242
diff changeset
    96
            protected abstract void realRun();
3708
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    97
            public void run() {
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    98
                try { realRun(); } catch (Throwable t) { unexpected(t); }
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
    99
            }
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   100
        }
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   101
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   102
        Thread offerer = new CheckedThread("offerer") {
3415
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   103
            protected void realRun() {
3708
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   104
                long c = 0;
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   105
                for (long i = 0; ! quittingTime(i); i++) {
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   106
                    if (q.offer(c)) {
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   107
                        if ((++c % 1024) == 0) {
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   108
                            approximateCount.getAndAdd(1024);
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   109
                            while (approximateCount.get() > 10000)
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   110
                                Thread.yield();
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   111
                        }
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   112
                    } else {
3415
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   113
                        Thread.yield();
3708
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   114
                    }}}};
3415
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   115
3708
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   116
        Thread drainer = new CheckedThread("drainer") {
3415
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   117
            protected void realRun() {
3708
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   118
                final Random rnd = getRandom();
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   119
                while (! quittingTime()) {
3415
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   120
                    List list = new ArrayList();
3708
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   121
                    int n = rnd.nextBoolean() ?
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   122
                        q.drainTo(list) :
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   123
                        q.drainTo(list, 100);
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   124
                    approximateCount.getAndAdd(-n);
3415
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   125
                    equal(list.size(), n);
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   126
                    for (int j = 0; j < n - 1; j++)
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   127
                        equal((Long) list.get(j) + 1L, list.get(j + 1));
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   128
                    Thread.yield();
3708
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   129
                }
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   130
                q.clear();
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   131
                approximateCount.set(0); // Releases waiting offerer thread
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   132
            }};
3415
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   133
3708
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   134
        Thread scanner = new CheckedThread("scanner") {
3415
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   135
            protected void realRun() {
3708
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   136
                final Random rnd = getRandom();
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   137
                while (! quittingTime()) {
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   138
                    switch (rnd.nextInt(3)) {
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   139
                    case 0: checkNotContainsNull(q); break;
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   140
                    case 1: q.size(); break;
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   141
                    case 2:
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   142
                        Long[] a = (Long[]) q.toArray(new Long[0]);
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   143
                        int n = a.length;
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   144
                        for (int j = 0; j < n - 1; j++) {
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   145
                            check(a[j] < a[j+1]);
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   146
                            check(a[j] != null);
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   147
                        }
3415
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   148
                        break;
3708
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   149
                    }
3415
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   150
                    Thread.yield();
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   151
                }}};
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   152
3708
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   153
        for (Thread thread : new Thread[] { offerer, drainer, scanner }) {
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   154
            thread.join(timeoutMillis + testDurationMillis);
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   155
            if (thread.isAlive()) {
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   156
                System.err.printf("Hung thread: %s%n", thread.getName());
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   157
                failed++;
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   158
                for (StackTraceElement e : thread.getStackTrace())
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   159
                    System.err.println(e);
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   160
                // Kludge alert
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   161
                thread.stop();
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   162
                thread.join(timeoutMillis);
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   163
            }
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   164
        }
3415
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   165
    }
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   166
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   167
    //--------------------- Infrastructure ---------------------------
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   168
    volatile int passed = 0, failed = 0;
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   169
    void pass() {passed++;}
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   170
    void fail() {failed++; Thread.dumpStack();}
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   171
    void fail(String msg) {System.err.println(msg); fail();}
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   172
    void unexpected(Throwable t) {failed++; t.printStackTrace();}
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   173
    void check(boolean cond) {if (cond) pass(); else fail();}
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   174
    void equal(Object x, Object y) {
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   175
        if (x == null ? y == null : x.equals(y)) pass();
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   176
        else fail(x + " not equal to " + y);}
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   177
    public static void main(String[] args) throws Throwable {
3708
f838f712922e 6868712: Improve concurrent queue tests
dl
parents: 3415
diff changeset
   178
        new OfferDrainToLoops(args).instanceMain(args);}
3415
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   179
    public void instanceMain(String[] args) throws Throwable {
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   180
        try {test(args);} catch (Throwable t) {unexpected(t);}
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   181
        System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   182
        if (failed > 0) throw new AssertionError("Some tests failed");}
79309d6eab38 6805775: LinkedBlockingQueue Nodes should unlink themselves before becoming garbage
dl
parents:
diff changeset
   183
}