From f4b80bcc7190fe75023b983d56a795b440a0c515 Mon Sep 17 00:00:00 2001 From: Dave Allison Date: Wed, 14 May 2014 15:41:25 -0700 Subject: Make use of sigchainlib for signal chaining for implicit checks This adds a preload library that overrides sigaction and sigprocmask to implement signal chaining. Signal chaining allows us to chain any signal so that the ART runtime receives it before any signal handler registered in native code by an application. If the ART signal handler doesn't want it, it will pass it on to the user's handler. ART uses signals for null pointer checks, stack overflow checks and suspend points. Also adds an OAT test to test this in isolation. Change-Id: I9545f9f7343774c091410eb810504d9855fd399f --- test/SignalTest/SignalTest.java | 60 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 test/SignalTest/SignalTest.java (limited to 'test/SignalTest/SignalTest.java') diff --git a/test/SignalTest/SignalTest.java b/test/SignalTest/SignalTest.java new file mode 100644 index 0000000000..7f15aeae76 --- /dev/null +++ b/test/SignalTest/SignalTest.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +class SignalTest { + private static native void initSignalTest(); + private static native void terminateSignalTest(); + private static native int testSignal(); + + private static void stackOverflow() { + stackOverflow(); + } + + public static void main(String[] args) { + System.loadLibrary("arttest"); + + System.out.println("init signal test"); + initSignalTest(); + try { + Object o = null; + int hash = o.hashCode(); + + // Should never get here. + System.out.println("hash: " + hash); + throw new AssertionError(); + } catch (NullPointerException e) { + System.out.println("Caught NullPointerException"); + } + try { + stackOverflow(); + + // Should never get here. + throw new AssertionError(); + } catch (StackOverflowError e) { + System.out.println("Caught StackOverflowError"); + } + + // Test that a signal in native code works. This will return + // the value 1234 if the signal is caught. + int x = testSignal(); + if (x != 1234) { + throw new AssertionError(); + } + + terminateSignalTest(); + System.out.println("Signal test OK"); + } +} -- cgit v1.2.3-59-g8ed1b