Looks good now.  Serialization logic is a little confusing but seems OK.

On Aug 11, 2010, at 4:53 PM, Mandy Chung wrote:

> On 08/11/10 12:35, Brian Goetz wrote:
>> This code has thread-safety issues.  There is no happens-before between the 
>> writes to suppressedExceptions (and its referenced state) and the places 
>> where it is iterated (e.g., line 576).
>> 
>> You could plug this hole by replacing the idiom at line 576 (and similar) 
>> with
>>   for (Throwable se : getSuppressedExceptions()).
>> 
> 
> Good point.  I fixed getSuppressedExceptions() be a synchronized method but 
> missed the unsynchronized reads.
> 
>> This would be needed for all unsynchronized reads of suppressedException.  
>> You could get away without it at the null check if you really were trying to 
>> squeeze some performance out and you didn't mind occasionally missing writes 
>> from other threads.
>> 
>> 
> 
> The updated webrev is at:
>   http://cr.openjdk.java.net/~mchung/6973831/webrev.01/
> 
> I leave the unsynchronized read in the readObject() method as the Throwable 
> object is still being deserialized and the suppressedExceptions is going to 
> be replaced with a new list.
> 
> Thanks
> Mandy
> 
>> On Aug 11, 2010, at 3:09 PM, Mandy Chung wrote:
>> 
>>> Fix for 6973831: NPE when printing stack trace of OOME
>>> 
>>> Webrev at:
>>>   http://cr.openjdk.java.net/~mchung/6973831/webrev.00/
>>> 
>>> The VM preallocates OutOfMemoryError objects to improve OOM diagnosability. 
>>> The constructor is not invoked since the OOME object allocation is done at 
>>> VM initialization time and thus the new suppressedExceptions field is null 
>>> which causes NPE when Throwable.printStackTrace() method is called on the 
>>> VM preallocated OOM object.
>>> 
>>> The fix is to initialize the suppressedExceptions field to null instead of 
>>> Collections.emptyList().  An alternative could be to initialize the 
>>> suppressedException field in the VM after VM initialization is finished.  
>>> It doesn't handle the case when any new field initialized to be non-null is 
>>> added in the OOM object in the future and it would require a VM 
>>> synchronized change.  The libraries fix is simpler and preferred.
>>> 
>>> Thanks
>>> Mandy
> 

Reply via email to