[evolution-patches] eds crashloop




does that evolution does.  otherwise very odd things happen when you get a crash, often it will loop forever, otherwise e-d-s will keep running in the other threads without exiting.

--
Michael Zucchi <notzed ximian com>
"born to die, live to work, it's all downhill from here"
Novell's Evolution and Free Software Developer
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution-data-server/ChangeLog,v
retrieving revision 1.142
diff -u -3 -r1.142 ChangeLog
--- ChangeLog	29 Jul 2004 15:54:09 -0000	1.142
+++ ChangeLog	2 Aug 2004 06:36:03 -0000
@@ -1,3 +1,10 @@
+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
Index: src/server.c
===================================================================
RCS file: /cvs/gnome/evolution-data-server/src/server.c,v
retrieving revision 1.19
diff -u -3 -r1.19 server.c
--- src/server.c	29 Jul 2004 15:54:09 -0000	1.19
+++ src/server.c	2 Aug 2004 06:36:03 -0000
@@ -30,6 +30,8 @@
 
 #include <stdlib.h>
 #include <sys/signal.h>
+#include <unistd.h>
+#include <pthread.h>
 
 #include <glib.h>
 #include <libgnome/gnome-init.h>
@@ -83,6 +85,8 @@
 
 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)
@@ -90,7 +94,14 @@
 	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);
@@ -105,6 +116,8 @@
 	exec = g_strdup_printf ("%s \"" PACKAGE "\" %d \"" VERSION "\"", gnome_segv_path, signo);
 	system (exec);
 	g_free (exec);
+
+	_exit(1);
 }
 
 static void
@@ -118,6 +131,9 @@
 	sigaction (SIGSEGV, &sa, NULL);
 	sigaction (SIGBUS, &sa, NULL);
 	sigaction (SIGFPE, &sa, NULL);
+
+	main_thread = pthread_self();
+	pthread_mutex_lock(&segv_mutex);
 }
 
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]