From 406b2a46629b4a5613bcfc640bfd2294b050be05 Mon Sep 17 00:00:00 2001 From: Dave Hoover Date: Thu, 17 Jan 2008 23:10:46 +0000 Subject: [PATCH] Break Unsafe apart into Unsafe and UnsafeGC, the latter having only the things to play with garbage collection. The gc stuff required JVMPI which the "server" jvm doesn't have, so poor saps like me with two processors and gobs of ram needed to hack things to run yohoho & force java to run with the "client" vm since it used stuff out of unsafe (but not the gc stuff) Still need to hit up people to build me the shared objects on other platforms, but the linux ones are there & working. git-svn-id: svn+ssh://src.earth.threerings.net/nenya/trunk@398 ed5b42cb-e716-0410-a449-f6a68f950b19 --- .../threerings/util/unsafe/FreeBSD/Makefile | 24 +++-- .../com_threerings_util_unsafe_Unsafe.c | 29 ------ .../com_threerings_util_unsafe_UnsafeGC.c | 49 ++++++++++ .../com/threerings/util/unsafe/Linux/Makefile | 24 +++-- .../com_threerings_util_unsafe_UnsafeGC.c | 1 + .../threerings/util/unsafe/Linux/libunsafe.so | Bin 8251 -> 6629 bytes .../util/unsafe/Linux/libunsafegc.so | Bin 0 -> 4907 bytes .../threerings/util/unsafe/Mac OS X/Makefile | 20 ++-- .../com_threerings_util_unsafe_UnsafeGC.c | 1 + .../com/threerings/util/unsafe/Unsafe.java | 22 +---- .../com/threerings/util/unsafe/UnsafeGC.java | 88 ++++++++++++++++++ .../com_threerings_util_unsafe_Unsafe.c | 31 ------ .../com_threerings_util_unsafe_UnsafeGC.c | 45 +++++++++ .../com_threerings_util_unsafe_Unsafe.h | 16 ---- .../com_threerings_util_unsafe_UnsafeGC.h | 29 ++++++ 15 files changed, 260 insertions(+), 119 deletions(-) create mode 100644 src/java/com/threerings/util/unsafe/FreeBSD/com_threerings_util_unsafe_UnsafeGC.c create mode 120000 src/java/com/threerings/util/unsafe/Linux/com_threerings_util_unsafe_UnsafeGC.c create mode 100755 src/java/com/threerings/util/unsafe/Linux/libunsafegc.so create mode 120000 src/java/com/threerings/util/unsafe/Mac OS X/com_threerings_util_unsafe_UnsafeGC.c create mode 100644 src/java/com/threerings/util/unsafe/UnsafeGC.java create mode 100644 src/java/com/threerings/util/unsafe/Windows/com_threerings_util_unsafe_UnsafeGC.c create mode 100644 src/java/com/threerings/util/unsafe/com_threerings_util_unsafe_UnsafeGC.h diff --git a/src/java/com/threerings/util/unsafe/FreeBSD/Makefile b/src/java/com/threerings/util/unsafe/FreeBSD/Makefile index d45b291b..cb6f5c42 100644 --- a/src/java/com/threerings/util/unsafe/FreeBSD/Makefile +++ b/src/java/com/threerings/util/unsafe/FreeBSD/Makefile @@ -22,24 +22,32 @@ INSTALL_PATH=${ROOT}/dist/lib/i386-FreeBSD INCLUDES=-I.. -I${JAVA_HOME}/include -I${JAVA_HOME}/include/${OSINCDIR} LIBRARIES= -TARGET=libunsafe.so +TARGETS=libunsafe.so libunsafegc.so # # Target definitions -all: ${TARGET} +all: ${TARGETS} install: @${MKDIR} -p ${INSTALL_PATH} - cp ${TARGET} ${INSTALL_PATH} + cp ${TARGETS} ${INSTALL_PATH} -${TARGET}: com_threerings_util_unsafe_Unsafe.c - @echo "Compiling Unsafe.c" +libunsafe.so: com_threerings_util_unsafe_Unsafe.c + @echo "Compiling $<" @${CC} ${INCLUDES} -c com_threerings_util_unsafe_Unsafe.c \ -o com_threerings_util_unsafe_Unsafe.o - @echo "Creating libunsafe.so" - @${CC} -o ${TARGET} com_threerings_util_unsafe_Unsafe.o \ + @echo "Creating $@" + @${CC} -o libunsafe.so com_threerings_util_unsafe_Unsafe.o \ + ${LIBRARIES} ${LIBRARIES_PATH} -shared + +libunsafegc.so: com_threerings_util_unsafe_UnsafeGC.c + @echo "Compiling $<" + @${CC} ${INCLUDES} -c com_threerings_util_unsafe_UnsafeGC.c \ + -o com_threerings_util_unsafe_Unsafe.o + @echo "Creating $@" + @${CC} -o libunsafegc.so com_threerings_util_unsafe_Unsafegc.o \ ${LIBRARIES} ${LIBRARIES_PATH} -shared clean: - -${RM} -f *.o ${TARGET} + -${RM} -f *.o ${TARGETS} diff --git a/src/java/com/threerings/util/unsafe/FreeBSD/com_threerings_util_unsafe_Unsafe.c b/src/java/com/threerings/util/unsafe/FreeBSD/com_threerings_util_unsafe_Unsafe.c index abe1fd3e..4f87315f 100644 --- a/src/java/com/threerings/util/unsafe/FreeBSD/com_threerings_util_unsafe_Unsafe.c +++ b/src/java/com/threerings/util/unsafe/FreeBSD/com_threerings_util_unsafe_Unsafe.c @@ -4,7 +4,6 @@ #include #include -#include #include #include @@ -13,9 +12,6 @@ #include "com_threerings_util_unsafe_Unsafe.h" -/* global jvmpi interface pointer */ -static JVMPI_Interface* jvmpi; - /** A sleep method that uses select(). This seems to have about 10ms * granularity where nanosleep() has about 20ms. Sigh. */ static int select_sleep (int millisecs) @@ -28,18 +24,6 @@ static int select_sleep (int millisecs) return select(0, &dummy, NULL, NULL, &toWait); } -JNIEXPORT void JNICALL -Java_com_threerings_util_unsafe_Unsafe_enableGC (JNIEnv* env, jclass clazz) -{ - jvmpi->EnableGC(); -} - -JNIEXPORT void JNICALL -Java_com_threerings_util_unsafe_Unsafe_disableGC (JNIEnv* env, jclass clazz) -{ - jvmpi->DisableGC(); -} - JNIEXPORT void JNICALL Java_com_threerings_util_unsafe_Unsafe_nativeSleep ( JNIEnv* env, jclass clazz, jint millis) @@ -100,18 +84,5 @@ JNIEXPORT jboolean JNICALL Java_com_threerings_util_unsafe_Unsafe_nativeSetegid JNIEXPORT jboolean JNICALL Java_com_threerings_util_unsafe_Unsafe_init (JNIEnv* env, jclass clazz) { - JavaVM* jvm; - - if ((*env)->GetJavaVM(env, &jvm) > 0) { - fprintf(stderr, "Failed to get JavaVM from env.\n"); - return JNI_FALSE; - } - - /* get jvmpi interface pointer */ - if (((*jvm)->GetEnv(jvm, (void**)&jvmpi, JVMPI_VERSION_1)) < 0) { - fprintf(stderr, "Failed to get JVMPI from JavaVM.\n"); - return JNI_FALSE; - } - return JNI_TRUE; } diff --git a/src/java/com/threerings/util/unsafe/FreeBSD/com_threerings_util_unsafe_UnsafeGC.c b/src/java/com/threerings/util/unsafe/FreeBSD/com_threerings_util_unsafe_UnsafeGC.c new file mode 100644 index 00000000..f278d11f --- /dev/null +++ b/src/java/com/threerings/util/unsafe/FreeBSD/com_threerings_util_unsafe_UnsafeGC.c @@ -0,0 +1,49 @@ +/* + * $Id$ + */ + +#include +#include +#include + +#include +#include +#include +#include + +#include "com_threerings_util_unsafe_UnsafeGC.h" + +/* global jvmpi interface pointer */ +static JVMPI_Interface* jvmpi; + +JNIEXPORT void JNICALL +Java_com_threerings_util_unsafe_UnsafeGC_enableGC (JNIEnv* env, jclass clazz) +{ + jvmpi->EnableGC(); +} + +JNIEXPORT void JNICALL +Java_com_threerings_util_unsafe_UnsafeGC_disableGC (JNIEnv* env, jclass clazz) +{ + jvmpi->DisableGC(); +} + + +JNIEXPORT jboolean JNICALL +Java_com_threerings_util_unsafe_UnsafeGC_init (JNIEnv* env, jclass clazz) +{ + JavaVM* jvm; + + if ((*env)->GetJavaVM(env, &jvm) > 0) { + fprintf(stderr, "Failed to get JavaVM from env.\n"); + return JNI_FALSE; + } + + /* get jvmpi interface pointer */ + if (((*jvm)->GetEnv(jvm, (void**)&jvmpi, JVMPI_VERSION_1)) < 0) { + fprintf(stderr, "Failed to get JVMPI from JavaVM.\n"); + return JNI_FALSE; + } + + return JNI_TRUE; +} diff --git a/src/java/com/threerings/util/unsafe/Linux/Makefile b/src/java/com/threerings/util/unsafe/Linux/Makefile index 7d593545..6d2f8fb0 100644 --- a/src/java/com/threerings/util/unsafe/Linux/Makefile +++ b/src/java/com/threerings/util/unsafe/Linux/Makefile @@ -21,24 +21,32 @@ INSTALL_PATH=${ROOT}/dist/lib/i686-Linux INCLUDES=-I.. -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux LIBRARIES=-lX11 -TARGET=libunsafe.so +TARGETS=libunsafe.so libunsafegc.so # # Target definitions -all: ${TARGET} +all: ${TARGETS} install: @${MKDIR} -p ${INSTALL_PATH} - cp ${TARGET} ${INSTALL_PATH} + cp ${TARGETS} ${INSTALL_PATH} -${TARGET}: com_threerings_util_unsafe_Unsafe.c - @echo Compiling Unsafe.c +libunsafe.so: com_threerings_util_unsafe_Unsafe.c + @echo "Compiling $<" @${CC} ${INCLUDES} -c com_threerings_util_unsafe_Unsafe.c \ -o com_threerings_util_unsafe_Unsafe.o - @echo Creating ${TARGET} - @${CC} -o ${TARGET} com_threerings_util_unsafe_Unsafe.o \ + @echo "Creating $@" + @${CC} -o libunsafe.so com_threerings_util_unsafe_Unsafe.o \ + ${LIBRARIES} ${LIBRARIES_PATH} -shared + +libunsafegc.so: com_threerings_util_unsafe_UnsafeGC.c + @echo "Compiling $<" + @${CC} ${INCLUDES} -c com_threerings_util_unsafe_UnsafeGC.c \ + -o com_threerings_util_unsafe_UnsafeGC.o + @echo "Creating $@" + @${CC} -o libunsafegc.so com_threerings_util_unsafe_UnsafeGC.o \ ${LIBRARIES} ${LIBRARIES_PATH} -shared clean: - -${RM} -f *.o ${TARGET} + -${RM} -f *.o ${TARGETS} diff --git a/src/java/com/threerings/util/unsafe/Linux/com_threerings_util_unsafe_UnsafeGC.c b/src/java/com/threerings/util/unsafe/Linux/com_threerings_util_unsafe_UnsafeGC.c new file mode 120000 index 00000000..766b3cf3 --- /dev/null +++ b/src/java/com/threerings/util/unsafe/Linux/com_threerings_util_unsafe_UnsafeGC.c @@ -0,0 +1 @@ +../FreeBSD/com_threerings_util_unsafe_UnsafeGC.c \ No newline at end of file diff --git a/src/java/com/threerings/util/unsafe/Linux/libunsafe.so b/src/java/com/threerings/util/unsafe/Linux/libunsafe.so index 59305842f9e3d2d14326b815e4292e7bc59064be..d9f3972e3f6aa55c1d4eaa47e126f195dd24a473 100755 GIT binary patch literal 6629 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 diff --git a/src/java/com/threerings/util/unsafe/Linux/libunsafegc.so b/src/java/com/threerings/util/unsafe/Linux/libunsafegc.so new file mode 100755 index 0000000000000000000000000000000000000000..583905f68933bd5a4bfc7fe6f1f77449ee172423 GIT binary patch literal 4907 zcmdT|Yiu0V6~6l*F-dTi)F~-V%N7|asmjO+jtQ-hZ11j(Bj;%+ghVhI?~c6#yF2dA ztZ~|uI^9H#wb{xgt%Ulc6-uQ_eMoI-5q+pK+9**Zez-s-RH;&=igclFAyNt!wb*{& zy?f2r5GnAlXLa_R@1AqdeayLc?wxO@2Kz#xkkAwn5kVA-3egGKd8@K?inxf1E#gjb zhqP;d%E?uVZy|^YX_sZ6Mme|z0o%ZEllCyg48RO*13|E_wibyMv5@|&-`)%xRwLG6?EDco}aOcMKSth(eZ7Ob4Ctt+h%yK(M3J2 zG}F#lzJ&pfc%B-xKo2vbe{i5TVQx3J8TT#e9hf6h7(ZtF@*ndzEUv=NIVX8{Iamb| zna3=PInHgY&73AhFz?K}jZJy1DZk#7&o$*)t_Ap|fJ1oJ&oreC8OF1Ip(&3cPgWsz zh7y^YrG#w~ay80NPy!#Ee!V>3QXfFb`gQ)Thx6r{XgtR(ZJcLYq{jJm_|H;(<4OZ` zo}GaF~E%jeRIeheTZDxt!e`u)w3wWQb z-3{mRd~E6un^?Q_aHYJ+inD%ewH${w9c`~qK~~F~_O639 z;?DAHXj+2C_saCpmM5=XEHiMZd?9x9u}5pw=h+JTTQ{JbtewYNK-VkhHlr50yRmX^ zL1}BNWtO4+#>?dk(W8&nDx2GDGiv^xJ%j12bRTZaU9K%F8D1*cQc1N`L}ez2hgMB3 zPAA)=D3Re#&pu^5%Z{LM-KAuE%U#eRqs)y<(e@6k**d4;Qfi)V|2$GjEh5%Kn_iIZ z9$aK4IL8=ux~;wO=hL&tmxuhq@{s#hhFp!hI zI=)!xUMw#({B`AjM;mjMRnSY!IST^oSdDB`)+*9_T$_v z4(*PQ7TtW@E=(9}#0vYN-TMZVS-HYP5jr9BPD_?@eQ+Fq1ygbjGIO~vV!_G%??3N1 z+}}V)`is}#gt-t4V8;DC@LEV_H@DIp9xOL{VrCcjZ4`;0!$>^|$^DZn1F0+5rryUf zT(=E&^v`8q-iCY!!QO*po1cXEuG91;V!sC#{fWev<6HXo9NZf3#4fcxzP+R4{*JEg zUGXgkFwqZLzAC?W+kIRAf4vRwc;2^0gyH!`C9_%^E0m0^OB@_9S%qvNMXVd?y%o)*LNbd0QB1-z|D*K#9lG2t*ed zt?0^@t-O;)Yc8VT&yb<Y)oOpH4~gR-{}!zMxCiIp$Ng86_WKhG7*~!Lep4S2k9BHb z#?wTLgYqwd*+1qCb2b?7RTMrPsHo$? z?L)-1PExliwWbwT0l0P*RxNOiD$Lf^T2z>CI<@8$=95xuOJPg~NZ%cBN|l&vg%pva zP-{YA^#*3{E6klo<+#Fpnin`}1%r~wO z%pX!jzIoNVT49wbQ%m-Z(og?IaMR+{agCG0c=M|k6prGq#Wl@)Cn+Ra#TOxUe?wxu z*a@ur8^V)L(T?^QG9)&NA;?p}Y=?LRvOCb;B=BqiuWbJm>?Z>4e;1g011W@)%#R?0 z?f(q;ih9g)JTKC*NgU5Vp!2Y(`}Z$kt}9X~e61nxn!3I4?IMPbpIXA}#pi(E)%^{x z5uL#LEW-K^0tfG!^1!3Qi#X&{uxpA#c^X*f5AUMSH0^AHbMaH);NA3ZO}oA;zXhzH zFYm_x1rFX_w_+^>@6HBr(0@mBt?0Yh$CbW+aBpwVpt-lN zZzwfv4)^p9rZ}*S=bBlokjdeiuSTg`bh>tS892S0<7r&-ONA$lkx5}DAKBBhd*EZ- z=9ljOE59^+#7717^+Da^ySw$ByyKI6I#6E$fWarning: you will - * be fucked if you leave it disabled for too long. Do not do this - * unless you are dang sure about what you're doing and are prepared - * to test your code on every platform this side of Nantucket. - * - *

Calls to this method do not nest. Regardless of how many times - * you disable GC, only one call is required to reenable it. - */ - public static void setGCEnabled (boolean enabled) - { - // we don't support nesting, NOOP if the state doesn't change - if (_loaded && enabled != _gcEnabled) { - if (_gcEnabled = enabled) { - enableGC(); - } else { - disableGC(); - } - } - } - /** * Causes the current thread to block for the specified number of * milliseconds. This exists primarily to work around the fact that on @@ -172,6 +151,7 @@ public class Unsafe static { try { + System.out.println("Tring to load unsafe"); System.loadLibrary("unsafe"); _loaded = init(); } catch (SecurityException se) { diff --git a/src/java/com/threerings/util/unsafe/UnsafeGC.java b/src/java/com/threerings/util/unsafe/UnsafeGC.java new file mode 100644 index 00000000..35a6b17c --- /dev/null +++ b/src/java/com/threerings/util/unsafe/UnsafeGC.java @@ -0,0 +1,88 @@ +// +// $Id$ +// +// Nenya library - tools for developing networked games +// Copyright (C) 2002-2007 Three Rings Design, Inc., All Rights Reserved +// http://www.threerings.net/code/nenya/ +// +// This library is free software; you can redistribute it and/or modify it +// under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation; either version 2.1 of the License, or +// (at your option) any later version. +// +// This library 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 for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +package com.threerings.util.unsafe; + +import com.samskivert.util.RunAnywhere; + +import static com.threerings.NenyaLog.log; + +/** + * A native library for doing unsafe things involving garbage collection. + * Don't use this library. If you must ignore that warning, then be sure you use it + * sparingly and only in very well considered cases. + */ +public class UnsafeGC +{ + /** + * Enables or disables garbage collection. Warning: you will + * be fucked if you leave it disabled for too long. Do not do this + * unless you are dang sure about what you're doing and are prepared + * to test your code on every platform this side of Nantucket. + * + *

Calls to this method do not nest. Regardless of how many times + * you disable GC, only one call is required to reenable it. + */ + public static void setGCEnabled (boolean enabled) + { + // we don't support nesting, NOOP if the state doesn't change + if (_loaded && enabled != _gcEnabled) { + if (_gcEnabled = enabled) { + enableGC(); + } else { + disableGC(); + } + } + } + + + /** + * Reenable garbage collection after a call to {@link #disableGC}. + */ + protected static native void enableGC (); + + /** + * Disables garbage collection. + */ + protected static native void disableGC (); + + /** + * Called to initialize our library. + */ + protected static native boolean init (); + + /** The current state of GC enablement. */ + protected static boolean _gcEnabled = true; + + /** Whether or not we were able to load and initialize our library. */ + protected static boolean _loaded; + + static { + try { + System.loadLibrary("unsafegc"); + _loaded = init(); + } catch (SecurityException se) { + log.warning("Failed to load 'unsafegc' library: " + se + "."); + } catch (UnsatisfiedLinkError e) { + log.warning("Failed to load 'unsafegc' library: " + e + "."); + } + } +} diff --git a/src/java/com/threerings/util/unsafe/Windows/com_threerings_util_unsafe_Unsafe.c b/src/java/com/threerings/util/unsafe/Windows/com_threerings_util_unsafe_Unsafe.c index 82622f94..8fdd77d1 100644 --- a/src/java/com/threerings/util/unsafe/Windows/com_threerings_util_unsafe_Unsafe.c +++ b/src/java/com/threerings/util/unsafe/Windows/com_threerings_util_unsafe_Unsafe.c @@ -4,27 +4,9 @@ #include #include -#include #include "com_threerings_util_unsafe_Unsafe.h" -/* global jvmpi interface pointer */ -static JVMPI_Interface* jvmpi; - -JNIEXPORT void JNICALL -Java_com_threerings_util_unsafe_Unsafe_enableGC (JNIEnv* env, jclass clazz) -{ - fprintf(stderr, "Reenabling GC.\n"); - jvmpi->EnableGC(); -} - -JNIEXPORT void JNICALL -Java_com_threerings_util_unsafe_Unsafe_disableGC (JNIEnv* env, jclass clazz) -{ - fprintf(stderr, "Disabling GC.\n"); - jvmpi->DisableGC(); -} - JNIEXPORT void JNICALL Java_com_threerings_util_unsafe_Unsafe_nativeSleep ( JNIEnv* env, jclass clazz, jint millis) @@ -63,18 +45,5 @@ JNIEXPORT jboolean JNICALL Java_com_threerings_util_unsafe_Unsafe_nativeSetegid JNIEXPORT jboolean JNICALL Java_com_threerings_util_unsafe_Unsafe_init (JNIEnv* env, jclass clazz) { - JavaVM* jvm; - - if ((*env)->GetJavaVM(env, &jvm) > 0) { - fprintf(stderr, "Failed to get JavaVM from env.\n"); - return JNI_FALSE; - } - - /* get jvmpi interface pointer */ - if (((*jvm)->GetEnv(jvm, (void**)&jvmpi, JVMPI_VERSION_1)) < 0) { - fprintf(stderr, "Failed to get JVMPI from JavaVM.\n"); - return JNI_FALSE; - } - return JNI_TRUE; } diff --git a/src/java/com/threerings/util/unsafe/Windows/com_threerings_util_unsafe_UnsafeGC.c b/src/java/com/threerings/util/unsafe/Windows/com_threerings_util_unsafe_UnsafeGC.c new file mode 100644 index 00000000..54c79c29 --- /dev/null +++ b/src/java/com/threerings/util/unsafe/Windows/com_threerings_util_unsafe_UnsafeGC.c @@ -0,0 +1,45 @@ +/* + * $Id: com_threerings_util_unsafe_Unsafe.c 3331 2005-02-03 01:25:21Z mdb $ + */ + +#include +#include +#include + +#include "com_threerings_util_unsafe_UnsafeGC.h" + +/* global jvmpi interface pointer */ +static JVMPI_Interface* jvmpi; + +JNIEXPORT void JNICALL +Java_com_threerings_util_unsafe_Unsafe_enableGC (JNIEnv* env, jclass clazz) +{ + fprintf(stderr, "Reenabling GC.\n"); + jvmpi->EnableGC(); +} + +JNIEXPORT void JNICALL +Java_com_threerings_util_unsafe_Unsafe_disableGC (JNIEnv* env, jclass clazz) +{ + fprintf(stderr, "Disabling GC.\n"); + jvmpi->DisableGC(); +} + +JNIEXPORT jboolean JNICALL +Java_com_threerings_util_unsafe_Unsafe_init (JNIEnv* env, jclass clazz) +{ + JavaVM* jvm; + + if ((*env)->GetJavaVM(env, &jvm) > 0) { + fprintf(stderr, "Failed to get JavaVM from env.\n"); + return JNI_FALSE; + } + + /* get jvmpi interface pointer */ + if (((*jvm)->GetEnv(jvm, (void**)&jvmpi, JVMPI_VERSION_1)) < 0) { + fprintf(stderr, "Failed to get JVMPI from JavaVM.\n"); + return JNI_FALSE; + } + + return JNI_TRUE; +} diff --git a/src/java/com/threerings/util/unsafe/com_threerings_util_unsafe_Unsafe.h b/src/java/com/threerings/util/unsafe/com_threerings_util_unsafe_Unsafe.h index bae9f5aa..cc94f17c 100644 --- a/src/java/com/threerings/util/unsafe/com_threerings_util_unsafe_Unsafe.h +++ b/src/java/com/threerings/util/unsafe/com_threerings_util_unsafe_Unsafe.h @@ -7,22 +7,6 @@ #ifdef __cplusplus extern "C" { #endif -/* - * Class: com_threerings_util_unsafe_Unsafe - * Method: enableGC - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_threerings_util_unsafe_Unsafe_enableGC - (JNIEnv *, jclass); - -/* - * Class: com_threerings_util_unsafe_Unsafe - * Method: disableGC - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_threerings_util_unsafe_Unsafe_disableGC - (JNIEnv *, jclass); - /* * Class: com_threerings_util_unsafe_Unsafe * Method: nativeSleep diff --git a/src/java/com/threerings/util/unsafe/com_threerings_util_unsafe_UnsafeGC.h b/src/java/com/threerings/util/unsafe/com_threerings_util_unsafe_UnsafeGC.h new file mode 100644 index 00000000..ff281c9a --- /dev/null +++ b/src/java/com/threerings/util/unsafe/com_threerings_util_unsafe_UnsafeGC.h @@ -0,0 +1,29 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_threerings_util_unsafe_Unsafe */ + +#ifndef _Included_com_threerings_util_unsafe_Unsafe +#define _Included_com_threerings_util_unsafe_Unsafe +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_threerings_util_unsafe_Unsafe + * Method: enableGC + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_threerings_util_unsafe_Unsafe_enableGC + (JNIEnv *, jclass); + +/* + * Class: com_threerings_util_unsafe_Unsafe + * Method: disableGC + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_threerings_util_unsafe_Unsafe_disableGC + (JNIEnv *, jclass); + +#ifdef __cplusplus +} +#endif +#endif