thread/patch ...



Hi there,

	So - memprof is proving horribly unstable with OO.o for reasons that I
don't completely understand; either way - adding atomic operations for
'seq' seems to have fixed one bug I saw [ with an exploding queue -
waiting for a seqno that never arrived ].

	My other problems tend to end up with memprof just doing a blocking
read forever on a socket - which, since the other end is pumping data
down (another?) socket via send() just shouldn't happen. We just block
in g_io_channel_read_chars.

	The attached patch adds atomic seqno bits, and adds a load more error
conditions to listen for on the pipe.

	I'm still really rather unsure as to how memprof can possibly be
blocking; is it possible that data is getting corrupted - mi_write seems
to have no protection, and multiple threads could (in theory) send
partial chunks of buffer in an interleaved way (?) - or is that
impossible in practice ?

	Advice appreciated;

	HTH,

		Michael.

-- 
 michael meeks novell com  <><, Pseudo Engineer, itinerant idiot
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/memprof/ChangeLog,v
retrieving revision 1.129
diff -u -r1.129 ChangeLog
--- ChangeLog	1 Apr 2005 23:09:59 -0000	1.129
+++ ChangeLog	13 Jun 2005 15:26:27 -0000
@@ -1,3 +1,13 @@
+2005-06-13  Michael Meeks  <michael meeks novell com>
+
+	* server.c (ensure_cleanup, mp_server_init),
+	* process.c (process_start_input): use a fuller set
+	of G_IO_ flags for various conditions.
+
+	* intercept.c (exit_wait, mi_write_stack): use atomic
+	increment for seqno - if we get out of step process.c
+	bombs with an ever-growing sorted GList.
+
 2005-04-01  Steve Murphy  <murf e-tools com>
 
         * configure.in: Added "rw" to ALL_LINGUAS.
Index: intercept.c
===================================================================
RCS file: /cvs/gnome/memprof/intercept.c,v
retrieving revision 1.5
diff -u -r1.5 intercept.c
--- intercept.c	3 Sep 2004 22:29:47 -0000	1.5
+++ intercept.c	13 Jun 2005 15:26:27 -0000
@@ -72,8 +72,8 @@
 static ThreadInfo threads[MAX_THREADS];
 static char *socket_path = NULL;
 static char socket_buf[64];
-static unsigned int seqno = 0;
+static uint32_t seqno = 0;
 
 #undef ENABLE_DEBUG
 
 #ifdef ENABLE_DEBUG
@@ -331,7 +332,7 @@
 
 	info->alloc.stack_size = n_frames;
 	info->alloc.pid = getpid();
-	info->alloc.seqno = seqno++;
+	info->alloc.seqno = mi_atomic_increment (&seqno) - 1;
 
 	thread = find_thread (info->alloc.pid);
 	
@@ -490,7 +491,7 @@
 	int count;
 	char response;
 	info.any.operation = MI_EXIT;
-	info.any.seqno = seqno++;
+	info.any.seqno = mi_atomic_increment (&seqno) - 1;
 	info.any.pid = getpid();
 	
 	mi_stop ();
Index: process.c
===================================================================
RCS file: /cvs/gnome/memprof/process.c,v
retrieving revision 1.37
diff -u -r1.37 process.c
--- process.c	13 Sep 2004 18:43:52 -0000	1.37
+++ process.c	13 Jun 2005 15:26:29 -0000
@@ -667,7 +667,7 @@
 	if (!process->input_tag && process->input_channel)
 		process->input_tag = g_io_add_watch_full (process->input_channel,
 							  G_PRIORITY_LOW,
-							  G_IO_IN | G_IO_HUP,
+							  G_IO_IN | G_IO_PRI | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
 							  input_func, process, NULL);
 }
 
Index: server.c
===================================================================
RCS file: /cvs/gnome/memprof/server.c,v
retrieving revision 1.14
diff -u -r1.14 server.c
--- server.c	20 Sep 2003 21:02:18 -0000	1.14
+++ server.c	13 Jun 2005 15:26:29 -0000
@@ -164,7 +164,8 @@
 	channel = g_io_channel_unix_new (server->socket_fd);
 	g_io_channel_set_encoding (channel, NULL, NULL);
 	
-	server->control_watch = g_io_add_watch (channel, G_IO_IN | G_IO_HUP, control_func, server);
+	server->control_watch = g_io_add_watch (channel, G_IO_IN | G_IO_PRI | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
+											control_func, server);
 	g_io_channel_unref (channel);
 
 	g_object_ref (G_OBJECT (server));
@@ -366,7 +367,7 @@
 		channel = g_io_channel_unix_new (terminate_pipe[0]);
 		g_io_channel_set_encoding (channel, NULL, NULL);
 		
-		g_io_add_watch (channel, G_IO_IN, terminate_io_handler, NULL);
+		g_io_add_watch (channel, G_IO_IN | G_IO_PRI, terminate_io_handler, NULL);
 		g_io_channel_unref (channel);
 		
 		added_cleanup = TRUE;


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