package jdk.jfr.internal.instrument;
import java.io.IOException;
import java.nio.ByteBuffer;
import jdk.jfr.events.FileForceEvent;
import jdk.jfr.events.FileReadEvent;
import jdk.jfr.events.FileWriteEvent;
@JIInstrumentationTarget("sun.nio.ch.FileChannelImpl")
final class FileChannelImplInstrumentor {
private FileChannelImplInstrumentor() {
}
private String path;
@SuppressWarnings("deprecation")
@JIInstrumentationMethod
public void force(boolean metaData) throws IOException {
FileForceEvent event = FileForceEvent.EVENT.get();
if (!event.isEnabled()) {
force(metaData);
return;
}
try {
event.begin();
force(metaData);
} finally {
event.path = path;
event.metaData = metaData;
event.commit();
event.reset();
}
}
@SuppressWarnings("deprecation")
@JIInstrumentationMethod
public int read(ByteBuffer dst) throws IOException {
FileReadEvent event = FileReadEvent.EVENT.get();
if (!event.isEnabled()) {
return read(dst);
}
int bytesRead = 0;
try {
event.begin();
bytesRead = read(dst);
} finally {
if (bytesRead < 0) {
event.endOfFile = true;
} else {
event.bytesRead = bytesRead;
}
event.path = path;
event.commit();
event.reset();
}
return bytesRead;
}
@SuppressWarnings("deprecation")
@JIInstrumentationMethod
public int read(ByteBuffer dst, long position) throws IOException {
FileReadEvent event = FileReadEvent.EVENT.get();
if (!event.isEnabled()) {
return read(dst, position);
}
int bytesRead = 0;
try {
event.begin();
bytesRead = read(dst, position);
} finally {
if (bytesRead < 0) {
event.endOfFile = true;
} else {
event.bytesRead = bytesRead;
}
event.path = path;
event.commit();
event.reset();
}
return bytesRead;
}
@SuppressWarnings("deprecation")
@JIInstrumentationMethod
public long read(ByteBuffer[] dsts, int offset, int length) throws IOException {
FileReadEvent event = FileReadEvent.EVENT.get();
if (!event.isEnabled()) {
return read(dsts, offset, length);
}
long bytesRead = 0;
try {
event.begin();
bytesRead = read(dsts, offset, length);
} finally {
if (bytesRead < 0) {
event.endOfFile = true;
} else {
event.bytesRead = bytesRead;
}
event.path = path;
event.commit();
event.reset();
}
return bytesRead;
}
@SuppressWarnings("deprecation")
@JIInstrumentationMethod
public int write(ByteBuffer src) throws IOException {
FileWriteEvent event = FileWriteEvent.EVENT.get();
if (!event.isEnabled()) {
return write(src);
}
int bytesWritten = 0;
try {
event.begin();
bytesWritten = write(src);
} finally {
event.bytesWritten = bytesWritten > 0 ? bytesWritten : 0;
event.path = path;
event.commit();
event.reset();
}
return bytesWritten;
}
@SuppressWarnings("deprecation")
@JIInstrumentationMethod
public int write(ByteBuffer src, long position) throws IOException {
FileWriteEvent event = FileWriteEvent.EVENT.get();
if (!event.isEnabled()) {
return write(src, position);
}
int bytesWritten = 0;
try {
event.begin();
bytesWritten = write(src, position);
} finally {
event.bytesWritten = bytesWritten > 0 ? bytesWritten : 0;
event.path = path;
event.commit();
event.reset();
}
return bytesWritten;
}
@SuppressWarnings("deprecation")
@JIInstrumentationMethod
public long write(ByteBuffer[] srcs, int offset, int length) throws IOException {
FileWriteEvent event = FileWriteEvent.EVENT.get();
if (!event.isEnabled()) {
return write(srcs, offset, length);
}
long bytesWritten = 0;
try {
event.begin();
bytesWritten = write(srcs, offset, length);
} finally {
event.bytesWritten = bytesWritten > 0 ? bytesWritten : 0;
event.path = path;
event.commit();
event.reset();
}
return bytesWritten;
}
}