8199462: Use Reference.reachabilityFence in direct ByteBuffer methods

Reviewed-by: psandoz, vlivanov, plevart
This commit is contained in:
Ben Walsh 2018-03-12 16:09:18 -07:00 committed by Paul Sandoz
parent f439f2166b
commit de3604ea0c
6 changed files with 113 additions and 67 deletions

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -32,24 +32,40 @@ class XXX {
#if[rw]
private $type$ get$Type$(long a) {
$memtype$ x = UNSAFE.get$Memtype$Unaligned(null, a, bigEndian);
return $fromBits$(x);
try {
$memtype$ x = UNSAFE.get$Memtype$Unaligned(null, a, bigEndian);
return $fromBits$(x);
} finally {
Reference.reachabilityFence(this);
}
}
public $type$ get$Type$() {
return get$Type$(ix(nextGetIndex($BYTES_PER_VALUE$)));
try {
return get$Type$(ix(nextGetIndex($BYTES_PER_VALUE$)));
} finally {
Reference.reachabilityFence(this);
}
}
public $type$ get$Type$(int i) {
return get$Type$(ix(checkIndex(i, $BYTES_PER_VALUE$)));
try {
return get$Type$(ix(checkIndex(i, $BYTES_PER_VALUE$)));
} finally {
Reference.reachabilityFence(this);
}
}
#end[rw]
private ByteBuffer put$Type$(long a, $type$ x) {
#if[rw]
$memtype$ y = $toBits$(x);
UNSAFE.put$Memtype$Unaligned(null, a, y, bigEndian);
try {
$memtype$ y = $toBits$(x);
UNSAFE.put$Memtype$Unaligned(null, a, y, bigEndian);
} finally {
Reference.reachabilityFence(this);
}
return this;
#else[rw]
throw new ReadOnlyBufferException();