From 1c46977e6773c8843eec74b4117483ca76183498 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Wed, 6 Jul 2011 10:46:47 +0900 Subject: [PATCH] Add a target for generationg SnappyNativeLoader bytecode --- Makefile | 179 +++++++++--------- pom.xml | 7 - .../org/xerial/snappy/SnappyInputStream.java | 10 +- .../xerial/snappy/SnappyNativeLoader.bytecode | Bin 560 -> 1179 bytes .../org/xerial/snappy/SnappyNativeLoader.java | 59 ++++++ .../org/xerial/snappy/SnappyLoaderTest.java | 51 ----- 6 files changed, 160 insertions(+), 146 deletions(-) create mode 100755 src/main/resources/org/xerial/snappy/SnappyNativeLoader.java diff --git a/Makefile b/Makefile index 816f5bd..668ca8f 100644 --- a/Makefile +++ b/Makefile @@ -1,86 +1,93 @@ - -include Makefile.common - -MVN:=mvn - -all: snappy - -SNAPPY_OUT:=$(TARGET)/$(snappy)-$(os_arch) -SNAPPY_ARCHIVE:=$(TARGET)/snappy-$(VERSION).tar.gz -SNAPPY_CC:=snappy-sinksource.cc snappy-stubs-internal.cc snappy.cc -SNAPPY_SRC_DIR:=$(TARGET)/snappy-$(VERSION) -SNAPPY_SRC:=$(addprefix $(SNAPPY_SRC_DIR)/,$(SNAPPY_CC)) -SNAPPY_OBJ:=$(addprefix $(SNAPPY_OUT)/,$(patsubst %.cc,%.o,$(SNAPPY_CC)) SnappyNative.o) - -SNAPPY_UNPACKED:=$(TARGET)/snappy-extracted.log - -CXXFLAGS:=$(CXXFLAGS) -I$(SNAPPY_SRC_DIR) - -$(SNAPPY_ARCHIVE): - @mkdir -p $(@D) - curl -o$@ http://snappy.googlecode.com/files/snappy-$(VERSION).tar.gz - -$(SNAPPY_UNPACKED): $(SNAPPY_ARCHIVE) - tar xvfz $< -C $(TARGET) - touch $@ - -jni-header: $(SRC)/org/xerial/snappy/SnappyNative.h - - -$(SRC)/org/xerial/snappy/SnappyNative.h: $(SRC)/org/xerial/snappy/SnappyNative.java - $(JAVAH) -classpath $(TARGET)/classes -o $@ org.xerial.snappy.SnappyNative - -$(SNAPPY_SRC): $(SNAPPY_UNPACKED) - -$(SNAPPY_OUT)/%.o : $(SNAPPY_SRC_DIR)/%.cc - @mkdir -p $(@D) - $(CXX) $(CXXFLAGS) -c $< -o $@ - -$(SNAPPY_OUT)/SnappyNative.o : $(SRC)/org/xerial/snappy/SnappyNative.cpp $(SRC)/org/xerial/snappy/SnappyNative.h - @mkdir -p $(@D) - $(CXX) $(CXXFLAGS) -c $< -o $@ - - -$(SNAPPY_OUT)/$(LIBNAME): $(SNAPPY_OBJ) - $(CXX) $(CXXFLAGS) -o $@ $+ $(LINKFLAGS) - $(STRIP) $@ - -clean-native: - rm -rf $(SNAPPY_OUT) - -clean: - rm -rf $(TARGET) - -NATIVE_DIR:=src/main/resources/org/xerial/snappy/native/$(OS_NAME)/$(OS_ARCH) -NATIVE_TARGET_DIR:=$(TARGET)/classes/org/xerial/snappy/native/$(OS_NAME)/$(OS_ARCH) -NATIVE_DLL:=$(NATIVE_DIR)/$(LIBNAME) - -snappy-jar-version:=snappy-java-$(shell $(JAVA) -jar lib/silk-weaver.jar find 'project(artifactId, version)' pom.xml | grep snappy-java | awk '{ print $$2; }') - -native: $(SNAPPY_UNPACKED) $(NATIVE_DLL) -snappy: native $(TARGET)/$(snappy-jar-version).jar - -$(NATIVE_DLL): $(SNAPPY_OUT)/$(LIBNAME) - @mkdir -p $(@D) - cp $< $@ - @mkdir -p $(NATIVE_TARGET_DIR) - cp $< $(NATIVE_TARGET_DIR)/$(LIBNAME) - - -$(TARGET)/$(snappy-jar-version).jar: native $(NATIVE_DLL) - $(MVN) package -Dmaven.test.skip=true - -test: $(NATIVE_DLL) - $(MVN) test - -win32: - $(MAKE) native CXX=mingw32-g++ OS_NAME=Windows OS_ARCH=x86 - -mac32: - $(MAKE) native OS_NAME=Mac OS_ARCH=i386 - -linux32: - $(MAKE) native OS_NAME=Linux OS_ARCH=i386 - -clean-native-linux32: - $(MAKE) clean-native OS_NAME=Linux OS_ARCH=i386 + +include Makefile.common + +MVN:=mvn + +all: snappy + +SNAPPY_OUT:=$(TARGET)/$(snappy)-$(os_arch) +SNAPPY_ARCHIVE:=$(TARGET)/snappy-$(VERSION).tar.gz +SNAPPY_CC:=snappy-sinksource.cc snappy-stubs-internal.cc snappy.cc +SNAPPY_SRC_DIR:=$(TARGET)/snappy-$(VERSION) +SNAPPY_SRC:=$(addprefix $(SNAPPY_SRC_DIR)/,$(SNAPPY_CC)) +SNAPPY_OBJ:=$(addprefix $(SNAPPY_OUT)/,$(patsubst %.cc,%.o,$(SNAPPY_CC)) SnappyNative.o) + +SNAPPY_UNPACKED:=$(TARGET)/snappy-extracted.log + +CXXFLAGS:=$(CXXFLAGS) -I$(SNAPPY_SRC_DIR) + +$(SNAPPY_ARCHIVE): + @mkdir -p $(@D) + curl -o$@ http://snappy.googlecode.com/files/snappy-$(VERSION).tar.gz + +$(SNAPPY_UNPACKED): $(SNAPPY_ARCHIVE) + tar xvfz $< -C $(TARGET) + touch $@ + +jni-header: $(SRC)/org/xerial/snappy/SnappyNative.h + + +$(SRC)/org/xerial/snappy/SnappyNative.h: $(SRC)/org/xerial/snappy/SnappyNative.java + $(JAVAH) -classpath $(TARGET)/classes -o $@ org.xerial.snappy.SnappyNative + +bytecode: src/main/resources/org/xerial/snappy/SnappyNativeLoader.bytecode + +src/main/resources/org/xerial/snappy/SnappyNativeLoader.bytecode: src/main/resources/org/xerial/snappy/SnappyNativeLoader.java + @mkdir -p $(TARGET)/temp + $(JAVAC) -source 1.5 -target 1.5 -d $(TARGET)/temp $< + cp $(TARGET)/temp/org/xerial/snappy/SnappyNativeLoader.class $@ + +$(SNAPPY_SRC): $(SNAPPY_UNPACKED) + +$(SNAPPY_OUT)/%.o : $(SNAPPY_SRC_DIR)/%.cc + @mkdir -p $(@D) + $(CXX) $(CXXFLAGS) -c $< -o $@ + +$(SNAPPY_OUT)/SnappyNative.o : $(SRC)/org/xerial/snappy/SnappyNative.cpp $(SRC)/org/xerial/snappy/SnappyNative.h + @mkdir -p $(@D) + $(CXX) $(CXXFLAGS) -c $< -o $@ + + +$(SNAPPY_OUT)/$(LIBNAME): $(SNAPPY_OBJ) + $(CXX) $(CXXFLAGS) -o $@ $+ $(LINKFLAGS) + $(STRIP) $@ + +clean-native: + rm -rf $(SNAPPY_OUT) + +clean: + rm -rf $(TARGET) + +NATIVE_DIR:=src/main/resources/org/xerial/snappy/native/$(OS_NAME)/$(OS_ARCH) +NATIVE_TARGET_DIR:=$(TARGET)/classes/org/xerial/snappy/native/$(OS_NAME)/$(OS_ARCH) +NATIVE_DLL:=$(NATIVE_DIR)/$(LIBNAME) + +snappy-jar-version:=snappy-java-$(shell $(JAVA) -jar lib/silk-weaver.jar find 'project(artifactId, version)' pom.xml | grep snappy-java | awk '{ print $$2; }') + +native: $(SNAPPY_UNPACKED) $(NATIVE_DLL) +snappy: native $(TARGET)/$(snappy-jar-version).jar + +$(NATIVE_DLL): $(SNAPPY_OUT)/$(LIBNAME) + @mkdir -p $(@D) + cp $< $@ + @mkdir -p $(NATIVE_TARGET_DIR) + cp $< $(NATIVE_TARGET_DIR)/$(LIBNAME) + + +$(TARGET)/$(snappy-jar-version).jar: native $(NATIVE_DLL) + $(MVN) package -Dmaven.test.skip=true + +test: $(NATIVE_DLL) + $(MVN) test + +win32: + $(MAKE) native CXX=mingw32-g++ OS_NAME=Windows OS_ARCH=x86 + +mac32: + $(MAKE) native OS_NAME=Mac OS_ARCH=i386 + +linux32: + $(MAKE) native OS_NAME=Linux OS_ARCH=i386 + +clean-native-linux32: + $(MAKE) clean-native OS_NAME=Linux OS_ARCH=i386 diff --git a/pom.xml b/pom.xml index f72344a..42ba6e0 100755 --- a/pom.xml +++ b/pom.xml @@ -232,12 +232,5 @@ jar test - - org.javassist - javassist - 3.14.0-GA - jar - test - diff --git a/src/main/java/org/xerial/snappy/SnappyInputStream.java b/src/main/java/org/xerial/snappy/SnappyInputStream.java index a99672e..c1a8e0a 100755 --- a/src/main/java/org/xerial/snappy/SnappyInputStream.java +++ b/src/main/java/org/xerial/snappy/SnappyInputStream.java @@ -61,10 +61,16 @@ public class SnappyInputStream extends InputStream protected void readHeader() throws IOException { byte[] header = new byte[SnappyCodec.headerSize()]; - int readBytes = in.read(header, 0, header.length); + int readBytes = 0; + while (readBytes < header.length) { + int ret = in.read(header, readBytes, header.length - readBytes); + if (ret == -1) + break; + readBytes += ret; + } // Quick test of the header - if (header[0] != SnappyCodec.MAGIC_HEADER[0]) { + if (readBytes < header.length || header[0] != SnappyCodec.MAGIC_HEADER[0]) { // do the default uncompression readFully(header, readBytes); return; diff --git a/src/main/resources/org/xerial/snappy/SnappyNativeLoader.bytecode b/src/main/resources/org/xerial/snappy/SnappyNativeLoader.bytecode index 1fdc27eda14e8f6d945b071e497dc31387ab73bf..93bdcce8b0286ef2e383d5243a2659c44f6b49fe 100755 GIT binary patch literal 1179 zcma)4TTc@~6#k|xY`ctH#DW))TZOhvl`vr}*ZZ z&tOuBCdOxfl<~~AlvRxJW#-H|-+bS>{rLIi8-N@(3=Cp2fdNbz=)<%+QabJ#=*EnJ zS)`SfQSPjcIRggf6?#F%7Il~^GO1%pM~gX}_6m8cIHW<3n znH>i0iML1e{UzI#n~j5t^tVODA&;j1FeK9v&bEsB*Q>%*fG_-GhIr9(+O$U5YxtH_ zg)xkjT~VtYZ;HS^lqFTPzo;tZ7{N`B>los=j|UvfSYa3pn-JF1&Yt5TR(0e#?qHN- z4eJ~Q6scjC(5FY1tOd5`ay(L`!-{kaqZfS9rZS{FziJ*y-xiKp50f*m=EyK`$-h&T+pWKlRPk?pX+a8^UFvF85_TrqwToz^k!=?Pue8RrBb)~Hi)KO`5%KbI zJ&*?s`k?}BymX1tDPg>MB>#a#7lEc^qvsODCS{OJ}rqU#EER01X2{4 z#RSq6SBNZ@Fh^^)K=QO4SLJy}URi(0Upoc=Z}}yX&ymD3$*++38p*Gce4ae(l;GV? kqjF*GK=Ld4UZ0`=Gh!W!UpCGNVdGTg1m!(W6~-{}3mrE9BLDyZ literal 560 zcmbV|&rZTX5XQfy#X_k9BBJ6y5)X)pjc17$qbH(=5)a;%vcbjLHcLf#6rX@IlBn_E z1NczJDH;j!X7(_%-^@4j+x_@_dk1iY3d3HYI`%*)$vwO0^DrFR&NN)`NcKe|;BBD{ zFos;0_qpwHzhhsvy26bNXbh$k+$&d{OHVMA{#p-X7eh++rlZ;n?3zLMXf8vs+L#S> zA|?IK@&1(s1F19;$jmKuhP_DK8CbNChG}96S%$*Qe>QMM7|Fmlke@3wZ&dKWTb?jb zV918FCUPR~-Zm9?iCU}1JBwH~v4Rr8od#`^GcjXBwiH)GhK0KHWprYp9QWzi{H5Hc z*VSEbT1JJib^2S<;#W|n6D{$QvQ9UfVuE7%3DzU@aqSg3eFAHQOyl4gYa?i5YB7+- sG98e0 loadedLibFiles = new HashMap(); + private static HashMap loadedLib = new HashMap(); + + public static void load(String lib) { + if (loadedLibFiles.containsKey(lib) && loadedLibFiles.get(lib) == true) + return; + + try { + System.load(lib); + loadedLibFiles.put(lib, true); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + public static void loadLibrary(String libname) { + if (loadedLib.containsKey(libname) && loadedLib.get(libname) == true) + return; + + try { + System.loadLibrary(libname); + loadedLib.put(libname, true); + } + catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/test/java/org/xerial/snappy/SnappyLoaderTest.java b/src/test/java/org/xerial/snappy/SnappyLoaderTest.java index 24e71d5..87663b6 100755 --- a/src/test/java/org/xerial/snappy/SnappyLoaderTest.java +++ b/src/test/java/org/xerial/snappy/SnappyLoaderTest.java @@ -30,21 +30,13 @@ import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; -import java.security.ProtectionDomain; - -import javassist.ClassPool; -import javassist.CtClass; -import javassist.CtField; -import javassist.CtNewMethod; import org.codehaus.plexus.classworlds.ClassWorld; import org.codehaus.plexus.classworlds.realm.ClassRealm; -import org.junit.Ignore; import org.junit.Test; import org.xerial.util.FileResource; import org.xerial.util.log.Logger; @@ -110,49 +102,6 @@ public class SnappyLoaderTest } - @Ignore - @Test - public void createByteCodeOfSnappyLoader() throws Exception { - - ClassLoader parent = this.getClass().getClassLoader().getParent(); - ClassWorld cw = new ClassWorld(); - ClassRealm L1 = cw.newRealm("l1", parent); - ClassRealm L2 = cw.newRealm("l2", parent); - - File nativeLib = SnappyLoader.findNativeLibrary(); - assertNotNull(nativeLib); - - ClassPool pool = ClassPool.getDefault(); - CtClass cl = pool.makeClass("org.xerial.snappy.SnappyNativeLoader"); - cl.addField(CtField.make("static boolean isLoaded = false;", cl)); - String m1 = loadIntoString(SnappyLoaderTest.class, "load.code"); - String m2 = loadIntoString(SnappyLoaderTest.class, "loadLibrary.code"); - cl.addMethod(CtNewMethod.make(m1, cl)); - cl.addMethod(CtNewMethod.make(m2, cl)); - - ProtectionDomain systemPD = System.class.getProtectionDomain(); - byte[] bytecode = cl.toBytecode(); - FileOutputStream f = new FileOutputStream("target/SnappyNativeLoader.bytecode"); - f.write(bytecode); - f.close(); - - //Class< ? > loaderClass = cl.toClass(parent, System.class.getProtectionDomain()); - //_logger.info(cl.getName()); - //Class< ? > loaderClass = cl.toClass(); - - // Class< ? > classLoader = Class.forName("java.lang.ClassLoader"); - // java.lang.reflect.Method defineClass = classLoader.getDeclaredMethod("defineClass", new Class[] { String.class, - // byte[].class, int.class, int.class, ProtectionDomain.class }); - // - // defineClass.setAccessible(true); - // defineClass.invoke(parent, cl.getName(), bytecode, 0, bytecode.length, System.class.getProtectionDomain()); - // - // Class< ? > forName = parent.loadClass("org.xerial.snappy.SnappyNativeLoader"); - - //Class< ? > snappyClass = L1.loadClass("org.xerial.snappy.Snappy"); // not found - //_logger.info(snappyClass.getName()); - } - @Test public void load() throws Exception { SnappyLoader.load();