Martin, 

May I add you to the list of people who reviewed this change? I mean the 
concurrency-related portion of the change, specifically in the test. Not the 
LDAP part.

> On 12 Sep 2019, at 16:21, Martin Buchholz <marti...@google.com> wrote:
> 
> 
> 
> On Thu, Sep 12, 2019 at 4:36 AM Pavel Rappo <pavel.ra...@oracle.com> wrote:
> 
> I should have expressed myself more clear. I meant that the main thread and 
> the thread created (and started) by `newStartedThread` (the test tread) do 
> not wait for *each other* before they begin. This might be needed to make 
> sure that they start at the same time (loosely speaking, of course). One 
> might argue that the importance of this diminishes with the increase of the 
> timeout that the main thread uses to wait for the test thread to die and the 
> accuracy of measurements one agrees to tolerate.
> 
> 
> You want coordination?  We got coordination.
> 
> Here's some infrastructure that uses a threadsStarted latch:
> 
>     void assertThrowInterruptedExceptionWhenInterrupted(Action[] actions) {
>         int n = actions.length;
>         Future<?>[] futures = new Future<?>[n];
>         CountDownLatch threadsStarted = new CountDownLatch(n);
>         CountDownLatch done = new CountDownLatch(n);
> 
>         for (int i = 0; i < n; i++) {
>             Action action = actions[i];
>             futures[i] = cachedThreadPool.submit(new CheckedRunnable() {
>                 public void realRun() throws Throwable {
>                     threadsStarted.countDown();
>                     try {
>                         action.run();
>                         shouldThrow();
>                     }
>                     catch (InterruptedException success) {}
>                     catch (Throwable fail) { threadUnexpectedException(fail); 
> }
>                     assertFalse(Thread.interrupted());
>                     done.countDown();
>                 }});
>         }
> 
>         await(threadsStarted);
>         assertEquals(n, done.getCount());
>         for (Future<?> future : futures) // Interrupt all the tasks
>             future.cancel(true);
>         await(done);
>     }
> 
> When communicating a request, just like in real life, you can't force others 
> to do anything, so be politely Canadian and use "please" in the name of your 
> latch
> 
>     /**
>      * await throws InterruptedException if interrupted before counted down
>      */
>     public void testAwait_Interruptible() {
>         final CountDownLatch l = new CountDownLatch(1);
>         final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
>         Thread t = newStartedThread(new CheckedRunnable() {
>             public void realRun() throws InterruptedException {
>                 Thread.currentThread().interrupt();
>                 try {
>                     l.await();
>                     shouldThrow();
>                 } catch (InterruptedException success) {}
>                 assertFalse(Thread.interrupted());
> 
>                 pleaseInterrupt.countDown();
>                 try {
>                     l.await();
>                     shouldThrow();
>                 } catch (InterruptedException success) {}
>                 assertFalse(Thread.interrupted());
> 
>                 assertEquals(1, l.getCount());
>             }});
> 
>         await(pleaseInterrupt);
>         if (randomBoolean()) assertThreadBlocks(t, Thread.State.WAITING);
>         t.interrupt();
>         awaitTermination(t);
>     }
>  

Reply via email to