Hi Rémi,

Thanks for your suggestions, they made the code much simpler - and more correct!

/Staffan

On 15 nov 2012, at 09:04, Remi Forax <fo...@univ-mlv.fr> wrote:

> Hi Staffan,
> in IOTraceAgent,
> ASM provides a method named Type.getOpcode(baseOpcode) that allows you
> to emit load/store or return depending on the type
> (type specialized opcode like ILOAD, ALOAD, etc are in the same order).
> 
> // by example for load
> mv.visitVarInsn(type.getOpcode(ILOAD), slot);
> 
> // and for return
> mv.visitVarInsn(type.getOpcode(IRETURN), slot);
> 
> also I think your empty private constructor is not valid
> because it doesn't call (invokespecial) the constructor of Object.
> (I think you haven't a verify error because IOTrace is not
> verified because loaded by the bootclassloader).
> 
> I also believe that because there is no jump in your code,
> there is no need to generate the stack frames
> (there is no stack frame).
> 
> Rémi
> 
> On 11/14/2012 06:35 PM, Staffan Larsen wrote:
>> Thanks for the detailed review, Alan. Comments inline.
>> 
>> On 14 nov 2012, at 13:50, Alan Bateman <alan.bate...@oracle.com> wrote:
>> 
>>> On 13/11/2012 10:16, Staffan Larsen wrote:
>>>> This is a request for review for adding tracing to I/O calls. For now, 
>>>> this is an empty infrastructure intended to enable diagnosing/tracing of 
>>>> i/o calls. A user of the API can register a callback for read and write 
>>>> operations on sockets and files. It does not (yet) cover asynchronous i/o 
>>>> calls. When not used, the implementation should add a minimum of overhead. 
>>>> To provide useful information to the user, FileInputStream, 
>>>> FileOutputStream and RandomAccessFile have been modified to keep track of 
>>>> the path they operate on (when available).
>>>> 
>>>> Webrev: http://cr.openjdk.java.net/~sla/8003322/webrev.00/
>>> Thanks for the update. Do you have any updated performance data to share 
>>> (just to confirm that the updated implementation doesn't have any real 
>>> impact)?
>> While I haven't been able to measure an impact myself, I want to confirm 
>> this with runs from the performance team. I'll get back as soon as I have 
>> something to share.
>> 
>>> Anyway, I took a pass over the new webrev.
>>> 
>>> I'm not sure that passing a value of 0 for errors to xxEnd is the best 
>>> approach, particularly if this is ever extended to non-blocking I/O. Also I 
>>> think there are a few inconsistencies with respect to EOF -- eg: in 
>>> FileInputStream then read() will call the hook with 0 at EOF whereas the 
>>> other read methods will call the hook with -1 at EOF.  In FileChannelImpl 
>>> then some places use normalize, some not.
>> Thanks for catching these inconsistencies, I have fixed them.
>> 
>>> I guess the main question is whether the agent needs to distinguish I/O 
>>> errors from EOF and 0 bytes (the latter is assuming this may be extended to 
>>> non-blocking I/O). It may be that you need to use -2 or anything < -1 to 
>>> distinguish all cases.
>> This one is hard. As you say, it would be great to differentiate between 0 
>> bytes, EOF and Exceptions. The first two are quite easy as I could make -1 
>> mean EOF. Exceptions are harder since I don't really know if there was an 
>> exception from where the xxEnd() method is called now (typically a finally 
>> clause). Adding a catch clause and calling xxEnd() from there would solve 
>> it, but make the code more complicated. Hard to tell if the extra code 
>> complexity is worth it.
>> 
>>> Minor nit but there is a bit of inconsistency with the variables names, 
>>> usage of "v" in RandomAccessFile for example whereas FIS/FOS have bytesRead 
>>> and bytesWritten.
>> I change v to bytesRead or bytesWritten as appropriate.
>> 
>>> Thanks for adding javadoc to IoTrace. One suggestion is to include a big 
>>> warning that the hooks may be called while holding low-level locks in the 
>>> implementation and so great care must be taken, any synchronization or 
>>> interaction with other threads could easily deadlock the VM.
>> I have added this.
>> 
>>> I skimmed over the tests (not a detailed review) and they look reasonable. 
>>> You might need to check the copyright headers as it looks like at least one 
>>> of the tests has the GPL+Classpath exception whereas we normally use just 
>>> the GPL header on tests.
>> Fixed.
>> 
>>> Also good to ensure that there is @bug tag on the tests to link it to 
>>> 8003322.
>> Added.
>> 
>>> In ioTraceTest.sh I see "cd ${PWD}" that I didn't quite get.
>> I do a few "cd" to different places to compile and create the jar, I then 
>> wanted to go back to the original directory to execute the test.
>> 
>>> Do you think these tests will be reliable when running without an images 
>>> build (meaning raw classes files on the system)? Just wondering if 
>>> expectFileRead might fail due to I/O caused by class loading.
>> I have been running them without an image build with no problem, but I see 
>> what you mean. If this turns out to be a problem, then some classes may have 
>> to be pre-loaded (such as FileInputStream, FileOutputStream, FileChannel*, 
>> ByteBuffer).
>> 
>>> That's all I have on the detailed review.
>> Thanks!
>> /Staffan
>> 
>>> As you mentioned there is still have the substantive issue as to whether 
>>> it's open season on sun.misc.IoTrace*. Ignoring Unsafe (we know this needs 
>>> to be standardized or a standard alternative introduced), then nothing 
>>> outside of the JDK should be using sun.* classes directly.
>>> 
>>> -Alan
>>> 
>>> 
>>> 
>>> 
> 

Reply via email to