Author: mturk Date: Wed Apr 9 00:50:52 2008 New Revision: 646212 URL: http://svn.apache.org/viewvc?rev=646212&view=rev Log: Add Buffer class for allocating ByteBuffers directly from the memory
Added: tomcat/connectors/trunk/jni/java/org/apache/tomcat/jni/Buffer.java (with props) tomcat/connectors/trunk/jni/native/src/bb.c (with props) Added: tomcat/connectors/trunk/jni/java/org/apache/tomcat/jni/Buffer.java URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jni/java/org/apache/tomcat/jni/Buffer.java?rev=646212&view=auto ============================================================================== --- tomcat/connectors/trunk/jni/java/org/apache/tomcat/jni/Buffer.java (added) +++ tomcat/connectors/trunk/jni/java/org/apache/tomcat/jni/Buffer.java Wed Apr 9 00:50:52 2008 @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.tomcat.jni; + +import java.nio.ByteBuffer; + +/** Buffer + * + * @author Mladen Turk + * @version $Revision: $, $Date: $ + */ + +public class Buffer { + + /** + * Allocate a new ByteBuffer from memory + * @param size The amount of memory to allocate + * @return The ByteBuffer with allocated memory + */ + public static native ByteBuffer alloc(int size); + + /** + * Allocate a new ByteBuffer from memory and set all of the memory to 0 + * @param num Number of elements. + * @param size Length in bytes of each element. + * @return The ByteBuffer with allocated memory + */ + public static native ByteBuffer calloc(int num, int size); + + /** + * Allocate a new ByteBuffer from a pool + * @param p The pool to allocate from + * @param size The amount of memory to allocate + * @return The ByteBuffer with allocated memory + */ + public static native ByteBuffer palloc(long p, int size); + + /** + * Allocate a new ByteBuffer from a pool and set all of the memory to 0 + * @param p The pool to allocate from + * @param size The amount of memory to allocate + * @return The ByteBuffer with allocated memory + */ + public static native ByteBuffer pcalloc(long p, int size); + + /** + * Allocate a new ByteBuffer from already allocated memory. + * <br />Allocated memory must be provided from call to the + * Stdlib.alloc or Stdlib.calloc methods. + * @param mem The memory to use + * @param size The amount of memory to use + * @return The ByteBuffer with attached memory + */ + public static native ByteBuffer create(long mem, int size); + + /** + * Deallocates or frees a memory block used by ByteBuffer + * <br /><b>Warning :</b> Call this method only on ByteBuffers + * that were created by calling Buffer.alloc or Buffer.calloc. + * @param buf Previously allocated ByteBuffer to be freed. + */ + public static native void free(ByteBuffer buf); + + /** + * Returns the memory address of the ByteBuffer. + * @param buf Previously allocated ByteBuffer. + */ + public static native long address(ByteBuffer buf); + + /** + * Returns the allocated memory size of the ByteBuffer. + * @param buf Previously allocated ByteBuffer. + */ + public static native int size(ByteBuffer buf); + +} Propchange: tomcat/connectors/trunk/jni/java/org/apache/tomcat/jni/Buffer.java ------------------------------------------------------------------------------ svn:eol-style = native Added: tomcat/connectors/trunk/jni/native/src/bb.c URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jni/native/src/bb.c?rev=646212&view=auto ============================================================================== --- tomcat/connectors/trunk/jni/native/src/bb.c (added) +++ tomcat/connectors/trunk/jni/native/src/bb.c Wed Apr 9 00:50:52 2008 @@ -0,0 +1,134 @@ +/* Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * + * @author Mladen Turk + * @version $Revision: $, $Date: $ + */ + +#include "tcn.h" + +/** + * DirectByteBuffer utilities + */ + +TCN_IMPLEMENT_CALL(jobject, Buffer, malloc)(TCN_STDARGS, jint size) +{ + void *mem; + size_t sz = (size_t)APR_ALIGN_DEFAULT(size); + + UNREFERENCED(o); + + if ((mem = malloc(sz)) != NULL) { + jobject rv = (*e)->NewDirectByteBuffer(e, mem, (jlong)sz); + if (rv == NULL) + free(mem); + return rv; + } + else { + return NULL; + } +} + +TCN_IMPLEMENT_CALL(jobject, Buffer, calloc)(TCN_STDARGS, jint num, jint size) +{ + size_t sz = (size_t)APR_ALIGN_DEFAULT((size * num)); + + UNREFERENCED(o); + + if ((mem = calloc(1, sz)) != NULL) { + jobject rv = (*e)->NewDirectByteBuffer(e, mem, (jlong)sz); + if (rv == NULL) + free(mem); + return rv; + } + else { + return NULL; + } +} + +TCN_IMPLEMENT_CALL(jobject, Buffer, palloc)(TCN_STDARGS, jlong pool, + jint size) +{ + apr_pool_t *p = J2P(pool, apr_pool_t *); + apr_size_t sz = (apr_size_t)APR_ALIGN_DEFAULT(size); + void *mem; + + UNREFERENCED(o); + TCN_ASSERT(pool != 0); + + if ((mem = apr_palloc(p, sz)) != NULL) + return (*e)->NewDirectByteBuffer(e, mem, (jlong)sz); + else + return NULL; +} + +TCN_IMPLEMENT_CALL(jobject, Buffer, pcalloc)(TCN_STDARGS, jlong pool, + jint size) +{ + apr_pool_t *p = J2P(pool, apr_pool_t *); + apr_size_t sz = (apr_size_t)APR_ALIGN_DEFAULT(size); + void *mem; + + UNREFERENCED(o); + TCN_ASSERT(pool != 0); + + if ((mem = apr_pcalloc(p, sz)) != NULL) + return (*e)->NewDirectByteBuffer(e, mem, (jlong)sz); + else + return NULL; +} + +TCN_IMPLEMENT_CALL(jobject, Buffer, create)(TCN_STDARGS, jlong addr, + jint size) +{ + void *mem = J2P(addr, void *); + + UNREFERENCED(o); + TCN_ASSERT(mem != 0); + TCN_ASSERT(size != 0); + + if (mem && size) + return (*e)->NewDirectByteBuffer(e, mem, (jlong)size); + else + return NULL; +} + +TCN_IMPLEMENT_CALL(void, Buffer, free)(TCN_STDARGS, jobject bb) +{ + void *mem; + + UNREFERENCED(o); + if ((mem = (*e)->GetDirectBufferAddress(e, bb)) != NULL) { + /* This can cause core dump if address was + * allocated from the APR pool. + */ + free(mem); + } +} + +TCN_IMPLEMENT_CALL(jlong, Buffer, address)(TCN_STDARGS, jobject bb) +{ + UNREFERENCED(o); + return P2J((*e)->GetDirectBufferAddress(e, bb)); +} + +TCN_IMPLEMENT_CALL(jlong, Buffer, size)(TCN_STDARGS, jobject bb) +{ + UNREFERENCED(o); + return (*e)->GetDirectBufferCapacity(e, bb); +} Propchange: tomcat/connectors/trunk/jni/native/src/bb.c ------------------------------------------------------------------------------ svn:eol-style = native --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]