ART: Add support for special handlers in sigchainlib
Add support for a special managed handler in sigchainlib that
will be called as the first user handler.
Use this support for native bridge v2. Extend test 115-native-bridge
to test the functionality.
Bug: 20217701
Change-Id: I78cc01fbdabe169154ff6b94c9f3ddb95b5c7448
diff --git a/runtime/native_bridge_art_interface.cc b/runtime/native_bridge_art_interface.cc
index b7f31f2..0ad560e 100644
--- a/runtime/native_bridge_art_interface.cc
+++ b/runtime/native_bridge_art_interface.cc
@@ -16,6 +16,8 @@
#include "native_bridge_art_interface.h"
+#include <signal.h>
+
#include "nativebridge/native_bridge.h"
#include "base/logging.h"
@@ -24,6 +26,7 @@
#include "mirror/art_method-inl.h"
#include "mirror/class-inl.h"
#include "scoped_thread_state_change.h"
+#include "sigchain.h"
namespace art {
@@ -127,7 +130,19 @@
}
void InitializeNativeBridge(JNIEnv* env, const char* instruction_set) {
- android::InitializeNativeBridge(env, instruction_set);
+ if (android::InitializeNativeBridge(env, instruction_set)) {
+ if (android::NativeBridgeGetVersion() >= 2U) {
+#ifdef _NSIG // Undefined on Apple, but we don't support running on Mac, anyways.
+ // Managed signal handling support added in version 2.
+ for (int signal = 0; signal < _NSIG; ++signal) {
+ android::NativeBridgeSignalHandlerFn fn = android::NativeBridgeGetSignalHandler(signal);
+ if (fn != nullptr) {
+ SetSpecialSignalHandlerFn(signal, fn);
+ }
+ }
+#endif
+ }
+ }
}
void UnloadNativeBridge() {