IDEADEV-18231
authorEugene Vigdorchik <no_reply@jetbrains.com>
Thu, 21 Jun 2007 17:17:11 +0000 (21:17 +0400)
committerEugene Vigdorchik <no_reply@jetbrains.com>
Thu, 21 Jun 2007 17:17:11 +0000 (21:17 +0400)
bin/libbreakgen.so
tools/DumpThreads/AppMain.c [new file with mode: 0644]

index 3144625a0645bf8a38a37c3615b19c96af65ed34..938db35440b74224c65124c372560cfd000f0d8a 100644 (file)
Binary files a/bin/libbreakgen.so and b/bin/libbreakgen.so differ
diff --git a/tools/DumpThreads/AppMain.c b/tools/DumpThreads/AppMain.c
new file mode 100644 (file)
index 0000000..ee55c00
--- /dev/null
@@ -0,0 +1,59 @@
+
+#if defined(WIN32)
+#include <windows.h>
+#else
+#include <jni.h>
+#include <signal.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+int isKernel26OrHigher();
+#endif
+
+JNIEXPORT void JNICALL Java_com_intellij_rt_execution_application_AppMain_triggerControlBreak
+  (JNIEnv *env, jclass clazz) {
+#if defined(WIN32)
+  GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, 0);
+#else
+  if (isKernel26OrHigher()) {
+    kill (getpid(), SIGQUIT);
+  } else {
+    int ppid = getppid();
+    char buffer[1024];
+    sprintf(buffer, "/proc/%d/status", ppid);
+    FILE * fp;
+    if ( (fp = fopen(buffer, "r")) != NULL )
+    {
+      char s[124];
+      char * ppid_name = "PPid:";
+      while (fscanf (fp, "%s\n", s) > 0) {
+        if (strcmp(s, ppid_name) == 0) {
+          int pppid;
+          fscanf(fp, "%d", &pppid);
+          kill (pppid, SIGQUIT);
+          break;
+        }
+      }
+
+      fclose (fp);
+    }
+  }
+#endif
+}
+
+
+int isKernel26OrHigher() {
+  char buffer[1024];
+  FILE * fp;
+  if ( (fp = fopen("/proc/version", "r")) != NULL )
+  {
+     int major;
+     int minor;
+     fscanf(fp, "Linux version %d.%d", &major, &minor);
+     return major >=2 && minor >= 6;
+  }
+
+  return 0;
+}