package voldemort.store.readonly.io.jna;
import java.io.IOException;
import org.apache.log4j.Logger;
import com.sun.jna.Native;
public class fcntl {
public static final int POSIX_FADV_NORMAL = 0; /* fadvise.h */
public static final int POSIX_FADV_RANDOM = 1; /* fadvise.h */
public static final int POSIX_FADV_SEQUENTIAL = 2; /* fadvise.h */
public static final int POSIX_FADV_WILLNEED = 3; /* fadvise.h */
public static final int POSIX_FADV_DONTNEED = 4; /* fadvise.h */
public static final int POSIX_FADV_NOREUSE = 5; /* fadvise.h */
private static final Logger logger = Logger.getLogger(fcntl.class);
/**
* <b>posix documentation</b>
*
* Actual Linux implementation resides here:
*
* http://lxr.linux.no/linux+v3.0.3/mm/fadvise.c#L77
*
* <p>
* posix_fadvise - predeclare an access pattern for file data
*
* <p>
* Synopsis
*
* <p>
* #include <fcntl.h>
*
* <p>
* int posix_fadvise(int fd, off_t offset, off_t len, int advice);
*
* <p>
* Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
* posix_fadvise(): _XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L
*
* <p>
* Description
*
* <p>
* Programs can use posix_fadvise() to announce an intention to access file
* data in a specific pattern in the future, thus allowing the kernel to
* perform appropriate optimizations. The advice applies to a (not
* necessarily existent) region starting at offset and extending for len
* bytes (or until the end of the file if len is 0) within the file referred
* to by fd. The advice is not binding; it merely constitutes an expectation
* on behalf of the application.
*
* <p>
* Permissible values for advice include:
*
* <p>
* POSIX_FADV_NORMAL
*
* <p>
* Indicates that the application has no advice to give about its access
* pattern for the specified data. If no advice is given for an open file,
* this is the default assumption.
*
* <p>
* POSIX_FADV_SEQUENTIAL
*
* <p>
* The application expects to access the specified data sequentially (with
* lower offsets read before higher ones).
*
* <p>
* POSIX_FADV_RANDOM
*
* <p>
* The specified data will be accessed in random order.
*
* <p>
* POSIX_FADV_NOREUSE
*
* <p>
* The specified data will be accessed only once.
*
* <p>
* POSIX_FADV_WILLNEED
*
* <p>
* The specified data will be accessed in the near future.
*
* <p>
* POSIX_FADV_DONTNEED
*
* <p>
* The specified data will not be accessed in the near future.
*
* <p>
* Return Value
*
* On success, zero is returned. On error, an error number is returned.
*
* <b>java documentation</b>
*
* We do not return -1 if we fail but instead throw an IOException
*
* @throws IOException if this call fails.
*/
public static int posix_fadvise(int fd, long offset, long len, int advice) throws IOException {
int result = Delegate.posix_fadvise(fd, offset, len, advice);
if(result != 0)
throw new IOException(errno.strerror(result));
return result;
}
/**
* <b>posix documentation</b>
*
* <p>
* The function posix_fallocate() ensures that disk space is allocated for
* the file referred to by the descriptor fd for the bytes in the range
* starting at offset and continuing for len bytes. After a successful call
* to posix_fallocate(), subsequent writes to bytes in the specified range
* are guaranteed not to fail because of lack of disk space.
*
* <p>
* If the size of the file is less than offset+len, then the file is
* increased to this size; otherwise the file size is left unchanged.
*
* <p>
* Return Value
*
* <p>
* posix_fallocate() returns zero on success, or an error number on failure.
* Note that errno is not set.
*
* <b>java documentation</b>
*
* We do not return -1 if we fail but instead throw an IOException
*
* @throws IOException if this call fails.
*
*/
public static int posix_fallocate(int fd, long offset, long len) throws IOException {
int result = Delegate.posix_fallocate(fd, offset, len);
if(result != 0) {
logger.warn(errno.strerror(result));
}
return result;
}
static class Delegate {
public static native int posix_fadvise(int fd, long offset, long len, int advice);
public static native int posix_fallocate(int fd, long offset, long len);
static {
Native.register("c");
}
}
}