On 15/09/2015 22:34, Caldarale, Charles R wrote:
>> From: Mark Thomas [mailto:ma...@apache.org] 
>> Subject: Re: RV-Predict bugs
> 
>> st_200 is non-volatile
> 
>> L1 if (st_200 == null ) {
>> L2    st_200 = sm.getString("sc.200");
>> L3 }
>> L4 return st_200;
> 
>> Ln=Line n
>> Tx=Thread x
>> Rn=Read at line n
>> Wn=Write at line n
> 
>> So T2 has two reads, T2R1 and T2R4.
> 
>> Depending on the value read for T2R1 there may be a write at T2W2.
>> If there is a write there is a happens before relationship between T2R1
>> and T2R4.
> 
> There is also a happens-before relationship between T2R1 and T2R4 due to JLS 
> Section 14.2 (Blocks), not Section 17.4 (Memory Model).  The JMM cannot be 
> considered in a vacuum.
> 
>> Consider the following sequence
>> T2R4 (out of order read returns null)
>> T1R1 (returns null)
>> T1W2 (writes non-null value)
>> T1R4 (reads new non-null value)
>> T2R1 (reads new non-null value)
> 
> The above is not permitted due to Section 14.2 (although it would be by 
> 17.4).  The compiler must not move T2R4 in front of T2R1 because of the 
> potential of T2W2 occurring.  Correct operation is dependent on the CPU 
> observing the same value for T2R1 and T2R4, which is implemented in all 
> current hardware I'm aware of by not permitting reordering of accesses to the 
> same memory location (e.g., see Chapter 8 of the Intel 64 Architecture SDM, 
> Volume 3 - System Programming Guide).  Such accesses are usually just 
> combined when they occur.
> 
>> Because T2R1 reads a non-null value there is no write in T2.
> 
>> Therefore there is no happens-before relationship between T2R1 and T2R4
>> because there is no intervening write in that thread (the write happens
>> in T1).
>> Therefore the re-ordering is allowed to happen.
>> And we get the unexpected result.
> 
> If the JMM were the only controlling specification, that would be true.  
> Since the JVM must also conform to Section 14, the happens-before order 
> exists, and we don't have a problem.
> 
>> The write at T1W2 is sufficient to enforce the happens before
>> relationship between T2R1 and T2R4.
> 
> Yes, the potential of the write occurring is enough.

To make sure I understand this it is the possibility of the write T2W2
that is sufficient to ensure T2R1 and T2R4 are not re-ordered not the
possibility of a write in some other thread?

Mark


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to