[GNOME VFS] Re: patch for cancellation's 'fd' consumption,
Seth Nickell <[email protected]> 09 Jul 2002 22:06:21 -0700
| Newsgroups | gmane.comp.gnome.vfs |
|---|---|
| Message-ID | <1026277582.1521.4.camel@quixotic> |
Sure, go ahead and commit this. What's the magic to enable the test on "make check" ? I've been meaning to get more of these tests hooked into make check. -Seth On Fri, 2002-07-12 at 05:02, Michael Meeks wrote: > > May I commit to stable and HEAD ? we should also enable this regression > test by default to run at 'make check' time IMHO, the more of those the > better - and the less likely for bit-rot to set in. > > Regards, > > Michael. > > Index: ChangeLog > =================================================================== > RCS file: /cvs/gnome/gnome-vfs/ChangeLog,v > retrieving revision 1.1334.2.14 > diff -u -p -u -r1.1334.2.14 ChangeLog > --- ChangeLog 12 Jul 2002 08:07:54 -0000 1.1334.2.14 > +++ ChangeLog 12 Jul 2002 11:57:08 -0000 > @@ -1,3 +1,28 @@ > +2002-07-12 Michael Meeks <[email protected]> > + > + * libgnomevfs/gnome-vfs-cancellation.c > + (gnome_vfs_cancellation_cancel), > + (gnome_vfs_cancellation_ack): only write if we have a pipe. > + (gnome_vfs_cancellation_get_fd): idly create the pipes, > + return -1 on error. > + (gnome_vfs_cancellation_new): init the pipe fds to -1 > + > + * libgnomevfs/gnome-vfs-init.c (gnome_vfs_init): > + move pthread_init up the order. If we don't do this > + we create a default main context, without the > + 'wake_up_pipe' initialized, which means that anyone > + doing a plain gnome-init has a '0' wake_up_pipe by > + the time they need to write / read to it. This means > + you see an 'A' on the console and have to hit enter > + before getting any async callbacks. > + > + * libgnomevfs/gnome-vfs-job.h (JOB_DEBUG_PRINT): > + make more standard. > + > + * test/test-async.c (async_queue_callback): impl. > + (main): hammer the async queue to test efficiency. > + re-hash lots of this. > + > 2002-07-11 Michael Meeks <[email protected]> > > * libgnomevfs/gnome-vfs-mime-info.c > Index: libgnomevfs/gnome-vfs-cancellation.c > =================================================================== > RCS file: /cvs/gnome/gnome-vfs/libgnomevfs/gnome-vfs-cancellation.c,v > retrieving revision 1.12 > diff -u -p -u -r1.12 gnome-vfs-cancellation.c > --- libgnomevfs/gnome-vfs-cancellation.c 3 Aug 2001 19:03:19 -0000 1.12 > +++ libgnomevfs/gnome-vfs-cancellation.c 12 Jul 2002 11:57:09 -0000 > @@ -53,15 +53,11 @@ GnomeVFSCancellation * > gnome_vfs_cancellation_new (void) > { > GnomeVFSCancellation *new; > - gint pipefd[2]; > - > - if (pipe (pipefd) == -1) > - return NULL; > > new = g_new (GnomeVFSCancellation, 1); > new->cancelled = FALSE; > - new->pipe_in = pipefd[0]; > - new->pipe_out = pipefd[1]; > + new->pipe_in = -1; > + new->pipe_out = -1; > > return new; > } > @@ -77,8 +73,10 @@ gnome_vfs_cancellation_destroy (GnomeVFS > { > g_return_if_fail (cancellation != NULL); > > - close (cancellation->pipe_in); > - close (cancellation->pipe_out); > + if (cancellation->pipe_in >= 0) { > + close (cancellation->pipe_in); > + close (cancellation->pipe_out); > + } > g_free (cancellation); > } > > @@ -98,7 +96,9 @@ gnome_vfs_cancellation_cancel (GnomeVFSC > if (cancellation->cancelled) > return; > > - write (cancellation->pipe_out, "c", 1); > + if (cancellation->pipe_out >= 0) > + write (cancellation->pipe_out, "c", 1); > + > cancellation->cancelled = TRUE; > } > > @@ -136,7 +136,9 @@ gnome_vfs_cancellation_ack (GnomeVFSCanc > if (cancellation == NULL) > return; > > - read (cancellation->pipe_in, &c, 1); > + if (cancellation->pipe_in >= 0) > + read (cancellation->pipe_in, &c, 1); > + > cancellation->cancelled = FALSE; > } > > @@ -154,12 +156,23 @@ gnome_vfs_cancellation_ack (GnomeVFSCanc > * same time. If a data is available on the notificator's file descriptor, you > * know you have to cancel the read/write operation. > * > - * Return value: the notificator's file descriptor. > + * Return value: the notificator's file descriptor, or -1 if starved of > + * file descriptors. > **/ > gint > gnome_vfs_cancellation_get_fd (GnomeVFSCancellation *cancellation) > { > g_return_val_if_fail (cancellation != NULL, -1); > + > + if (cancellation->pipe_in <= 0) { > + gint pipefd [2]; > + > + if (pipe (pipefd) == -1) > + return -1; > + > + cancellation->pipe_in = pipefd [0]; > + cancellation->pipe_out = pipefd [1]; > + } > > return cancellation->pipe_in; > } > Index: libgnomevfs/gnome-vfs-init.c > =================================================================== > RCS file: /cvs/gnome/gnome-vfs/libgnomevfs/gnome-vfs-init.c,v > retrieving revision 1.22.2.1 > diff -u -p -u -r1.22.2.1 gnome-vfs-init.c > --- libgnomevfs/gnome-vfs-init.c 14 Jun 2002 01:13:55 -0000 1.22.2.1 > +++ libgnomevfs/gnome-vfs-init.c 12 Jul 2002 11:57:09 -0000 > @@ -85,21 +85,22 @@ gnome_vfs_init (void) > bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); > #endif > > - if (bonobo_activation_orb_get() == NULL) { > + retval = gnome_vfs_pthread_init (TRUE); > + > + if (retval && bonobo_activation_orb_get() == NULL) { > bonobo_activation_init (0, bogus_argv); > } > > gnome_vfs_ssl_init (); > > - retval = gnome_vfs_method_init (); > if (retval) { > - retval = gnome_vfs_process_init (); > + retval = gnome_vfs_method_init (); > } > if (retval) { > - retval = gnome_vfs_configuration_init (); > + retval = gnome_vfs_process_init (); > } > if (retval) { > - retval = gnome_vfs_pthread_init (TRUE); > + retval = gnome_vfs_configuration_init (); > } > if (retval) { > signal (SIGPIPE, SIG_IGN); > Index: libgnomevfs/gnome-vfs-job.h > =================================================================== > RCS file: /cvs/gnome/gnome-vfs/libgnomevfs/gnome-vfs-job.h,v > retrieving revision 1.43 > diff -u -p -u -r1.43 gnome-vfs-job.h > --- libgnomevfs/gnome-vfs-job.h 12 Feb 2002 14:33:43 -0000 1.43 > +++ libgnomevfs/gnome-vfs-job.h 12 Jul 2002 11:57:09 -0000 > @@ -52,8 +52,8 @@ extern GStaticMutex debug_mutex; > #define JOB_DEBUG_PRINT(x) \ > G_STMT_START{ \ > g_static_mutex_lock (&debug_mutex); \ > + fputs (__FUNCTION__ ":", stdout); \ > printf ("%d ", __LINE__); \ > - fputs (__FUNCTION__ ": ", stdout); \ > printf x; \ > fputc ('\n', stdout); \ > fflush (stdout); \ > Index: test/test-async.c > =================================================================== > RCS file: /cvs/gnome/gnome-vfs/test/test-async.c,v > retrieving revision 1.17 > diff -u -p -u -r1.17 test-async.c > --- test/test-async.c 22 Mar 2002 19:12:07 -0000 1.17 > +++ test/test-async.c 12 Jul 2002 11:57:09 -0000 > @@ -28,6 +28,8 @@ > #include <libgnomevfs/gnome-vfs-init.h> > #include <stdio.h> > > +#define QUEUE_LENGTH 4000 > + > static GMainLoop *main_loop; > > /* Callbacks. */ > @@ -36,7 +38,7 @@ close_callback (GnomeVFSAsyncHandle *han > GnomeVFSResult result, > gpointer callback_data) > { > - printf ("Close: %s.\n", gnome_vfs_result_to_string (result)); > + fprintf (stderr, "Close: %s.\n", gnome_vfs_result_to_string (result)); > g_main_loop_quit (main_loop); > } > > @@ -49,19 +51,20 @@ read_callback (GnomeVFSAsyncHandle *hand > gpointer callback_data) > { > if (result != GNOME_VFS_OK) { > - printf ("Read failed: %s", gnome_vfs_result_to_string (result)); > + fprintf (stderr, "Read failed: %s\n", > + gnome_vfs_result_to_string (result)); > } else { > printf ("%"GNOME_VFS_SIZE_FORMAT_STR"/" > "%"GNOME_VFS_SIZE_FORMAT_STR" " > "byte(s) read, callback data `%s'\n", > - bytes_read, bytes_requested, (gchar *) callback_data); > + bytes_read, bytes_requested, > + (gchar *) callback_data); > *((gchar *) buffer + bytes_read) = 0; > - puts (buffer); > + fprintf (stderr, "%s", (char *) buffer); > } > > - printf ("Now closing the file.\n"); > + fprintf (stderr, "Now closing the file.\n"); > gnome_vfs_async_close (handle, close_callback, "close"); > - g_main_loop_quit (main_loop); > } > > static void > @@ -70,15 +73,15 @@ open_callback (GnomeVFSAsyncHandle *han > gpointer callback_data) > { > if (result != GNOME_VFS_OK) { > - printf ("Open failed: %s.\n", > - gnome_vfs_result_to_string (result)); > + fprintf (stderr, "Open failed: %s.\n", > + gnome_vfs_result_to_string (result)); > g_main_loop_quit (main_loop); > } else { > gchar *buffer; > const gulong buffer_size = 1024; > > - printf ("File opened correctly, data `%s'.\n", > - (gchar *) callback_data); > + fprintf (stderr, "File opened correctly, data `%s'.\n", > + (gchar *) callback_data); > > buffer = g_malloc (buffer_size); > gnome_vfs_async_read (handle, > @@ -89,37 +92,70 @@ open_callback (GnomeVFSAsyncHandle *han > } > } > > +static void > +dummy_close_callback (GnomeVFSAsyncHandle *handle, > + GnomeVFSResult result, > + gpointer callback_data) > +{ > +} > + > +static void > +async_queue_callback (GnomeVFSAsyncHandle *handle, > + GnomeVFSResult result, > + gpointer callback_data) > +{ > + int *completed = callback_data; > + > + (*completed)++; > + > + if (result == GNOME_VFS_OK) > + gnome_vfs_async_close (handle, dummy_close_callback, NULL); > +} > + > int > main (int argc, char **argv) > { > + int completed, i; > GnomeVFSAsyncHandle *handle; > > if (argc < 2) { > - fprintf (stderr, "Usage: %s <uri>\n", argv[0]); > + fprintf (stderr, "Usage: %s <uri of text file>\n", argv[0]); > return 1; > } > > - puts ("Initializing gnome-vfs..."); > + fprintf (stderr, "Initializing gnome-vfs...\n"); > gnome_vfs_init (); > > - puts ("Creating async context..."); > + fprintf (stderr, "Creating async context...\n"); > > - printf ("Starting open for `%s'...\n", argv[1]); > + fprintf (stderr, "Starting open for `%s'...\n", argv[1]); > gnome_vfs_async_open (&handle, argv[1], GNOME_VFS_OPEN_READ, > - 0, > + GNOME_VFS_PRIORITY_MIN, > open_callback, "open_callback"); > > - puts ("Main loop running."); > + fprintf (stderr, "Main loop running.\n"); > main_loop = g_main_loop_new (NULL, TRUE); > g_main_loop_run (main_loop); > - g_main_loop_unref (main_loop); > > - puts ("Main loop finished."); > + fprintf (stderr, "Main loop finished.\n"); > + > + fprintf (stderr, "Test async queue efficiency ..."); > + > + for (completed = i = 0; i < QUEUE_LENGTH; i++) { > + gnome_vfs_async_open (&handle, argv [1], GNOME_VFS_OPEN_READ, 0, > + async_queue_callback, &completed); > + } > + > + while (completed < QUEUE_LENGTH) > + g_main_context_iteration (NULL, TRUE); > + > + fprintf (stderr, "Passed\n"); > + > + g_main_loop_unref (main_loop); > > - puts ("All done"); > + fprintf (stderr, "All done\n"); > > - while (1) > - ; > + gnome_vfs_shutdown (); > > return 0; > } > > -- > [email protected] <><, Pseudo Engineer, itinerant idiot > _______________________________________________ gnome-vfs maillist - [email protected] http://lists.ximian.com/mailman/listinfo/gnome-vfs