Hi Peter!

Thank you for your review!

You are right, the patch changed the behavior of the code.
I've reverted back all the unnecessary changes. This should minimize the risk.

I've also made another correction: After decrementing the remaining timeOut, the startTime should be set to currTime.

Would you please help review the updated webrev:
http://cr.openjdk.java.net/~igerasim/6968459/2/webrev/

Sincerely yours,
Ivan


From quick look I notice a danger that Connection.readReply() pauses (for the timeOut time) in spite of the fact that a reply is ready and enqueued before waiting.

Imagine a situation where the 1st try of obtaining result returns null:

 450         // Get the reply if it is already available.
 451         BerDecoder rber = ldr.getReplyBer();


...after that, but before reaching the following lines:

 471                     synchronized (ldr) {
 472                         ldr.wait(timeOut);
 473                     }


The "other" thread enqueues a reply (LdapRequest.addReplyBer()) because the code in readReply() is executing without holding a lock on "ldr". When "this" thread (executing readReply()) finally enters synchronized block and waits, it will wait until wait() times out or another reply is enqueued which will issue another notify(). This can lead to unnecessary pauses. Old code does not exhibit this problem, because it re-checks the readiness of a reply immediately after entering the synchronized block.


Regards, Peter




Reply via email to