[ http://issues.apache.org/jira/browse/HADOOP-538?page=comments#action_12444950 ] Sameer Paranjpye commented on HADOOP-538: -----------------------------------------
Some more comments on the native code: Makefiles etc. - We should compile with '-Wall'. - What about 64-bit vs 32-bit builds, this makefile will generate the OS default, which may be incompatible with the JVM used. For instance on a 64-bit machine with a 32-bit JVM this will generate a 64-bit library, which will be incompatible with the JVM. We should check the JVM version and compile with -m32 or -m64 as appropriate. ----------- Index: src/native/org/apache/hadoop/io/compress/zlib/ZlibCompressor.c +JNIEXPORT jlong JNICALL +Java_org_apache_hadoop_io_compress_zlib_ZlibCompressor_init( + JNIEnv *env, jclass class, jint level, jint strategy + ) { + // Create a z_stream + z_stream *stream = malloc(sizeof(z_stream)); + if (!stream) { + THROW(env, "java/lang/OutOfMemoryError", NULL); + return (jlong)0; + } + memset((void*)stream, 0, sizeof(z_stream)); ... ... ... + + return (jlong)((int)stream); +} + Is this the only way to return a void* to the JVM? This is a bad, unsafe cast, not 64-bit safe. If a cast like this is needed it should be '(jlong)(stream)'. +JNIEXPORT jint JNICALL +Java_org_apache_hadoop_io_compress_zlib_ZlibCompressor_deflateBytesDirect( + JNIEnv *env, jobject this + ) { + // Get members of ZlibCompressor + z_stream *stream = (z_stream *) + ((int)(*env)->GetLongField(env, this, ZlibCompressor_stream)); ... ... ... +} Cast to int is not 64-bit safe. ------------- Index: src/native/org/apache/hadoop/io/compress/zlib/ZlibDecompressor.c +JNIEXPORT jlong JNICALL +Java_org_apache_hadoop_io_compress_zlib_ZlibDecompressor_init( + JNIEnv *env, jclass cls + ) { + z_stream *stream = malloc(sizeof(z_stream)); + memset((void*)stream, 0, sizeof(z_stream)); + ... ... ... + return (jint)((int)stream); +} Cast is not 64-bit safe. ----------------- Index: src/native/org/apache/hadoop/io/compress/zlib/org_apache_hadoop_io_compress_zlib_util.h +// TODO: Fix the below macro for 64-bit systems +// Helpful macro to convert a jlong to z_stream* +#define ZSTREAM(stream) ((z_stream*)((int)stream)) Act on the comment, please. :) ----------------- Index: src/native/org_apache_hadoop.h + + #define THROW(env, exception_name, message) \ + { \ + jclass ecls = (*env)->FindClass(env, exception_name); \ + if (ecls) { \ + (*env)->ThrowNew(env, ecls, message); \ + } \ + } + This macro creates a local reference to a class in jclass and does not destroy it, causing a memory leak. Add a '(*env)->DestroyLocalReference(env, ecls)' statement. > Implement a nio's 'direct buffer' based wrapper over zlib to improve > performance of java.util.zip.{De|In}flater as a 'custom codec' > ----------------------------------------------------------------------------------------------------------------------------------- > > Key: HADOOP-538 > URL: http://issues.apache.org/jira/browse/HADOOP-538 > Project: Hadoop > Issue Type: Improvement > Affects Versions: 0.6.1 > Reporter: Arun C Murthy > Assigned To: Arun C Murthy > Fix For: 0.8.0 > > Attachments: HADOOP-538.patch, HADOOP-538_20061005.tgz, > HADOOP-538_20061011.tgz, HADOOP-538_20061026.tgz, HADOOP-538_benchmarks.tgz > > > There has been more than one instance where java.util.zip's {De|In}flater > classes perform unreliably, a simple wrapper over zlib-1.2.3 (latest stable) > using java.nio.ByteBuffer (i.e. direct buffers) should go a long way in > alleviating these woes. -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira