From 924ab5c9e632c7421b6cc7a6abdf7945038ee0fc Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Thu, 3 Feb 2005 01:22:28 +0000 Subject: [PATCH] We've got crablegs! And a special Makefile for Linux and FreeBSD. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3329 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../threerings/util/signal/FreeBSD/Makefile | 12 +-- .../com/threerings/util/signal/Linux/Makefile | 40 ++++++++ ...com_threerings_util_signal_SignalManager.c | 96 ++++++++++++++++++ .../threerings/util/signal/Linux/libsignal.so | Bin 0 -> 9594 bytes 4 files changed, 138 insertions(+), 10 deletions(-) create mode 100644 src/java/com/threerings/util/signal/Linux/Makefile create mode 100644 src/java/com/threerings/util/signal/Linux/com_threerings_util_signal_SignalManager.c create mode 100755 src/java/com/threerings/util/signal/Linux/libsignal.so diff --git a/src/java/com/threerings/util/signal/FreeBSD/Makefile b/src/java/com/threerings/util/signal/FreeBSD/Makefile index 835281f52..1b72264d2 100644 --- a/src/java/com/threerings/util/signal/FreeBSD/Makefile +++ b/src/java/com/threerings/util/signal/FreeBSD/Makefile @@ -14,11 +14,7 @@ MKDIR=mkdir ROOT=../../../../../../.. LIBRARIES_PATH= -ARCH!=uname -p -OS!=uname -s OSINCDIR!=uname -s | tr 'A-Z' 'a-z' -OSDIR=${ARCH}-${OS} -INSTALL_PATH=${ROOT}/dist/lib/${OSDIR} # # Parameter and file definitions @@ -32,15 +28,11 @@ TARGET=libsignal.so all: ${TARGET} -install: ${TARGET} - @${MKDIR} -p ${INSTALL_PATH} - cp ${TARGET} ${INSTALL_PATH} - ${TARGET}: com_threerings_util_signal_SignalManager.c - @echo "Compiling SignalManager.c + @echo "Compiling SignalManager.c" @${CC} ${INCLUDES} -c com_threerings_util_signal_SignalManager.c \ -o com_threerings_util_signal_SignalManager.o - @echo Creating libsignal.so + @echo "Creating libsignal.so" @${CC} -o ${TARGET} com_threerings_util_signal_SignalManager.o \ ${LIBRARIES} ${LIBRARIES_PATH} -shared diff --git a/src/java/com/threerings/util/signal/Linux/Makefile b/src/java/com/threerings/util/signal/Linux/Makefile new file mode 100644 index 000000000..bb07eab94 --- /dev/null +++ b/src/java/com/threerings/util/signal/Linux/Makefile @@ -0,0 +1,40 @@ +# +# $Id: Makefile 3328 2005-02-03 01:16:12Z mdb $ + +# +# Executable definitions + +CC=gcc +RM=rm +CP=cp +MKDIR=mkdir + +# +# Directory definitions + +ROOT=../../../../../../.. +LIBRARIES_PATH= +OSINCDIR:=$(shell uname -s | tr 'A-Z' 'a-z') + +# +# Parameter and file definitions + +INCLUDES=-I.. -I${JAVA_HOME}/include -I${JAVA_HOME}/include/${OSINCDIR} +LIBRARIES= +TARGET=libsignal.so + +# +# Target definitions + +all: ${TARGET} + +${TARGET}: com_threerings_util_signal_SignalManager.c + @echo "Compiling SignalManager.c" + @${CC} ${INCLUDES} -c com_threerings_util_signal_SignalManager.c \ + -o com_threerings_util_signal_SignalManager.o + @echo "Creating libsignal.so" + @${CC} -o ${TARGET} com_threerings_util_signal_SignalManager.o \ + ${LIBRARIES} ${LIBRARIES_PATH} -shared + +clean: + -${RM} -f *.o ${TARGET} diff --git a/src/java/com/threerings/util/signal/Linux/com_threerings_util_signal_SignalManager.c b/src/java/com/threerings/util/signal/Linux/com_threerings_util_signal_SignalManager.c new file mode 100644 index 000000000..a0852ad66 --- /dev/null +++ b/src/java/com/threerings/util/signal/Linux/com_threerings_util_signal_SignalManager.c @@ -0,0 +1,96 @@ +/** + * $Id: com_threerings_util_signal_SignalManager.c 3327 2005-02-03 01:02:58Z mdb $ + */ + +#include +#include +#include +#include + +#include +#include "com_threerings_util_signal_SignalManager.h" + +static int writefd; + +typedef void (*sighandler_t)(int); +static sighandler_t old_handlers[64]; +static sighandler_t handlers[64]; + +static void +signal_handler (int signo) +{ + write(writefd, &signo, sizeof(signo)); + signal(SIGINT, signal_handler); +} + +/** + * Class: com_threerings_util_signal_SignalManager + * Method: activateHandler + * Signature: (I)V + */ +JNIEXPORT void JNICALL +Java_com_threerings_util_signal_SignalManager_activateHandler ( + JNIEnv* env, jclass clazz, jint signo) +{ + old_handlers[signo] = signal(signo, signal_handler); + if (old_handlers[signo] == SIG_ERR) { + fprintf(stderr, "Error setting signal handler (%d): %s\n", + signo, strerror(errno)); + old_handlers[signo] = 0; + } else { + handlers[signo] = signal_handler; + } +} + +/** + * Class: com_threerings_util_signal_SignalManager + * Method: deactivateHandler + * Signature: (I)V + */ +JNIEXPORT void JNICALL +Java_com_threerings_util_signal_SignalManager_deactivateHandler ( + JNIEnv* env, jclass clazz, jint signo) +{ + if (old_handlers[signo] != 0) { + signal(signo, old_handlers[signo]); + old_handlers[signo] = 0; + handlers[signo] = 0; + } +} + +/** + * Class: com_threerings_util_signal_SignalManager + * Method: dispatchSignals + * Signature: ()V + */ +JNIEXPORT void JNICALL +Java_com_threerings_util_signal_SignalManager_dispatchSignals ( + JNIEnv* env, jclass clazz) +{ + int filedes[2], readfd; + jint signo; + jmethodID mid = (*env)->GetStaticMethodID( + env, clazz, "signalReceived", "(I)V"); + + if (pipe(filedes) < 0) { + fprintf(stderr, "Failed to create signal pipe: %s\n", strerror(errno)); + return; + } + readfd = filedes[0]; + writefd = filedes[1]; + + while (1) { + int got = read(readfd, &signo, sizeof(int)); + if (got < 0) { + fprintf(stderr, "Signal pipe read failed: %s\n", strerror(errno)); + } else if (got == 0) { + fprintf(stderr, "Signal pipe read returned zero bytes.\n"); + } else { + if (signo < 0 || signo >= 64 || handlers[signo] == 0) { + fprintf(stderr, "Received bogus signal (%d).\n", signo); + } else { + (*env)->CallStaticVoidMethod(env, clazz, mid, signo); + } + } + } +} diff --git a/src/java/com/threerings/util/signal/Linux/libsignal.so b/src/java/com/threerings/util/signal/Linux/libsignal.so new file mode 100755 index 0000000000000000000000000000000000000000..769b3dbb5e363ad149cb062441467925ac450294 GIT binary patch literal 9594 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