This is an automated email from the git hooks/post-receive script. tpot-guest pushed a commit to tag 0.6.5 in repository jffi-next.
commit 5d09f619cbdacf10fd47b5b2ea3de743bda51762 Author: Wayne Meissner <[email protected]> Date: Thu Dec 31 13:14:51 2009 +1000 Add PageManager, a thin wrapper around mmap/munmap/mprotect, and the windows equivalents --- src/com/kenai/jffi/PageManager.java | 129 ++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/src/com/kenai/jffi/PageManager.java b/src/com/kenai/jffi/PageManager.java new file mode 100644 index 0000000..2ba61cf --- /dev/null +++ b/src/com/kenai/jffi/PageManager.java @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2009 Wayne Meissner + * + * This file is part of jffi. + * + * This code is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License version 3 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * version 3 for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with this work. If not, see <http://www.gnu.org/licenses/>. + */ + +package com.kenai.jffi; + +/** + * Manages allocation, disposal and protection of native memory pages + */ +abstract public class PageManager { + /** The memory should be executable */ + public static final int PROT_EXEC = Foreign.PROT_EXEC; + + /** The memory should be readable */ + public static final int PROT_READ = Foreign.PROT_READ; + + /** The memory should be writable */ + public static final int PROT_WRITE = Foreign.PROT_WRITE; + + private static final class SingletonHolder { + public static final PageManager INSTANCE = Platform.getPlatform().getOS() == Platform.OS.WINDOWS + ? new Windows() : new Unix(); + } + + /** + * Gets the page manager for the current platform. + * + * @return An instance of <tt>PageManager</tt> + */ + public static final PageManager getInstance() { + return SingletonHolder.INSTANCE; + } + + /** + * Gets the system page size. + * + * @return The size of a page on the current system, in bytes. + */ + public final long pageSize() { + return Foreign.getInstance().pageSize(); + } + + /** + * Allocates native memory pages. + * + * The memory allocated is aligned on a page boundary, and the size of the + * allocated memory is <tt>npages</tt> * {@link #pageSize}. + * + * @param npages The number of pages to allocate. + * @param protection The initial protection for the page. This must be a + * bitmask of {@link #PROT_READ}, {@link #PROT_WRITE} and {@link #PROT_EXEC}. + * + * @return The native address of the allocated memory. + */ + public abstract long allocatePages(int npages, int protection); + + /** + * Free pages allocated via {@link #allocatePages } + * + * @param address The memory address as returned from {@link #allocatePages} + * @param npages The number of pages to free. + */ + public abstract void freePages(long address, int npages); + + /** + * Sets the protection mask on a memory region. + * + * @param address The start of the memory region. + * @param npages The number of pages to protect. + * @param protection The protection mask. + */ + public abstract void protectPages(long address, int npages, int protection); + + static final class Unix extends PageManager { + + @Override + public long allocatePages(int npages, int protection) { + long sz = npages * pageSize(); + return Foreign.getInstance().mmap(0, sz, protection, + Foreign.MAP_ANON | Foreign.MAP_PRIVATE, 0, 0); + + } + + @Override + public void freePages(long address, int npages) { + Foreign.getInstance().munmap(address, npages * pageSize()); + } + + @Override + public void protectPages(long address, int npages, int protection) { + Foreign.getInstance().mprotect(address, npages * pageSize(), protection); + } + } + + static final class Windows extends PageManager { + + public Windows() { + } + + @Override + public long allocatePages(int npages, int protection) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void freePages(long address, int npages) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void protectPages(long address, int npages, int protection) { + throw new UnsupportedOperationException("Not supported yet."); + } + } +} -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/jffi-next.git _______________________________________________ pkg-java-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-java-commits

