Andrew Zhang wrote:
> On 7/11/06, Tim Ellison <[EMAIL PROTECTED]> wrote:
>>
>> I hadn't appreciated that the read call is blocking...
>>
>> So how about you do the blocking read() in a new thread, then the main
>> thread can poll to wait until the reading thread's state is Blocked,
>> before closing the channel and forcing the exception?
>>
>> The problem is that the thread will be detached from the VM and blocking
>> in the OS for the read, so not officially Java Blocked.  You can only
>> determine OS blocked state via additional native code.
>>
>> Therefore, as Paulex wrote, if you are not writing additional native
>> code for your test you may have to actually synchronize on the reading
>> thread having passed begin(), not when it is actually read() blocked.
> 
> 
> Yes. As Paulex suggested,  we have to write implementation test rather than
> api test.

Yes, I think that's right.  I don't see any portable way to detect the
blocking call in progress, so I don't see how we can make this an API
test case.  Anyone else have any ideas?

> So is the orignal test valuable? In other words, shall we keep it in api
> tests?

No, the original delay() version is not going to work when the threads
are scheduled on different processors.

> Does that make sense?

Are you thinking of pursuing an impl test then?

Regards,
Tim


>> Andrew Zhang wrote:
>> > Hello Tim,
>> >
>> > Thank you for your suggestion. :)
>> >
>> > Of course, "fix" is the best choice. I also have tried to use
>> > "wait/notify",
>> > but found it didn't work for this case.
>> >
>> > Please note that "channel1.read(targetBuf); // Label 3" is a blocking
>> > operation. And we want code at label 1,2 to execute after label 3.
>> >
>> > There is the question:
>> >
>> > Where should I put "notify"?
>> >
>> > 1. before "read"? NO. If nofity is put before read, then we still can't
>> > guarantee "configureBlocking" is executed after read.
>> > 2. after "read"? NO. read is a blocking operatoin. It will never be
>> > executed
>> > if put notify after read.
>> > 3. in "read"?  Obviously NO.
>> >
>> > Please correct me if I'm wrong.
>> >
>> > Thanks!
>> >
>> >
>> > On 7/11/06, Tim Ellison <[EMAIL PROTECTED]> wrote:
>> >>
>> >> Andrew Zhang wrote:
>> >> > Hello everybody,
>> >> >
>> >> > I noticed such tests in DatagramChannel, which is useful, but
>> >> potentially
>> >> > unstable.  Consider:
>> >> >
>> >> > public void testReadWrite_configureBlock() throws Exception {
>> >> >        byte[] targetArray = new byte[2];
>> >> >        // bind and connect
>> >> >        this.channel1.socket().bind(localAddr2);
>> >> >        this.channel1.connect(localAddr1);
>> >> >        this.channel2.socket().bind(localAddr1);
>> >> >        this.channel2.connect(localAddr2);
>> >> >        ByteBuffer targetBuf = ByteBuffer.wrap(targetArray);
>> >> >
>> >> >        new Thread() {
>> >> >            public void run() {
>> >> >                try {
>> >> >                    Thread.sleep(TIME_UNIT);
>> >> >                    channel1.configureBlocking(false); // Label 1
>> >> >                    channel1.close(); // Label 2
>> >> >                } catch (Exception e) {
>> >> >                    //ignore
>> >> >                }
>> >> >            }
>> >> >        }.start();
>> >> >        try {
>> >> >            this.channel1.read(targetBuf); // Label 3
>> >> >            fail("should throw AsynchronousCloseException");
>> >> >        } catch (AsynchronousCloseException e) {
>> >> >            // ok
>> >> >        }
>> >> >    }
>> >> > This test assumes Label 3  code should execute before Label 1 and
>> Label
>> >> 2,
>> >> > which is right in most cases, because the code invokes "Thread.sleep
>> >> > (TIME_UNIT)".
>> >> >
>> >> > However, it's potentially unstable. It heavily depends on TIME_UNIT
>> >> value,
>> >> > test environment (Hardware, OS ...)
>> >>
>> >> Urgh.  There are *very* few occasions when you need to use
>> >> Thread.sleep(); and 'thread synchronization' is definitely not one of
>> >> them!
>> >>
>> >> If you have order dependencies between two or more threads then use
>> >> wait/notify, or synchronized, and make them explicit.
>> >>
>> >> There are any number of books on multi-threaded programming in Java.
>> >>
>> >> > Indubitably, the test is very useful for testing
>> >> > "AsynchronousCloseException" of DatagramChannel.read(ByteBuffer)
>> >> method.
>> >> >
>> >> > How shall we deal with such issue?  Deleting such valuable tests is
>> not
>> >> a
>> >> > wise decision, while keeping them may cause build system fail.
>> >> >
>> >> > One solution I could image is TestNG. :) i.e. Use "@dev" or
>> >> something to
>> >> > mark such tests, say, the tests are only for developing purpose.
>> >> >
>> >> > Any suggestions?
>> >>
>> >> Fix it!  :-)
>> >>
>> >> Regards,
>> >> Tim
>> >>
>> >> --
>> >>
>> >> Tim Ellison ([EMAIL PROTECTED])
>> >> IBM Java technology centre, UK.
>> >>
>> >> ---------------------------------------------------------------------
>> >> Terms of use : http://incubator.apache.org/harmony/mailing.html
>> >> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> >> For additional commands, e-mail: [EMAIL PROTECTED]
>> >>
>> >>
>> >
>> >
>>
>> -- 
>>
>> Tim Ellison ([EMAIL PROTECTED])
>> IBM Java technology centre, UK.
>>
>> ---------------------------------------------------------------------
>> Terms of use : http://incubator.apache.org/harmony/mailing.html
>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> For additional commands, e-mail: [EMAIL PROTECTED]
>>
>>
> 
> 

-- 

Tim Ellison ([EMAIL PROTECTED])
IBM Java technology centre, UK.

---------------------------------------------------------------------
Terms of use : http://incubator.apache.org/harmony/mailing.html
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to