+2004-08-02 Not Zed <NotZed@Ximian.com>
+
+ * src/server.c (gnome_segv_handler): deadlock in non-main threads
+ so we only run once, and increment our recursive-call code
+ properly, and actually exit anyway. should fix infinite crash
+ loop crap.
+
2004-07-29 Rodney Dawes <dobey@novell.com>
* configure.in: Check for libgnomeui_serverdir with pkgconfig, and
#include <stdlib.h>
#include <sys/signal.h>
+#include <unistd.h>
+#include <pthread.h>
#include <glib.h>
#include <libgnome/gnome-init.h>
static GStaticMutex termination_lock = G_STATIC_MUTEX_INIT;
+static pthread_mutex_t segv_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_t main_thread;
static void
gnome_segv_handler (int signo)
const char *gnome_segv_path;
static int in_segv = 0;
char *exec;
-
+
+ if (pthread_self() != main_thread) {
+ /* deadlock intentionally in the sub-threads */
+ pthread_kill(main_thread, signo);
+ pthread_mutex_lock(&segv_mutex);
+ }
+
+ in_segv++;
if (in_segv > 2) {
/* The fprintf() was segfaulting, we are just totally hosed */
_exit (1);
exec = g_strdup_printf ("%s \"" PACKAGE "\" %d \"" VERSION "\"", gnome_segv_path, signo);
system (exec);
g_free (exec);
+
+ _exit(1);
}
static void
sigaction (SIGSEGV, &sa, NULL);
sigaction (SIGBUS, &sa, NULL);
sigaction (SIGFPE, &sa, NULL);
+
+ main_thread = pthread_self();
+ pthread_mutex_lock(&segv_mutex);
}