[
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