X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fevent-loop.c;h=c8d12f925df3a0925ba3c7ccb974b84d30e73228;hb=d0b45d99e856027785d6ee913238f02f38ff91fe;hp=0a2078c6d1aebad0304aec23195afb591038acde;hpb=b6ba6518e9254bc25f88088228e93ac966ebccd1;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/event-loop.c b/gdb/event-loop.c index 0a2078c6d1..c8d12f925d 100644 --- a/gdb/event-loop.c +++ b/gdb/event-loop.c @@ -1,5 +1,5 @@ /* Event loop machinery for GDB, the GNU debugger. - Copyright 1999, 2000, 2001 Free Software Foundation, Inc. + Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc. Written by Elena Zannoni of Cygnus Solutions. This file is part of GDB. @@ -20,7 +20,6 @@ Boston, MA 02111-1307, USA. */ #include "defs.h" -#include "top.h" #include "event-loop.h" #include "event-top.h" @@ -35,55 +34,8 @@ #include #include "gdb_string.h" #include -#include #include -/* Type of the mask arguments to select. */ - -#ifndef HAVE_POLL -#ifdef NO_FD_SET -/* All this stuff below is not required if select is used as God(tm) - intended, with the FD_* macros. Are there any implementations of - select which don't have FD_SET and other standard FD_* macros? I - don't think there are, but if I'm wrong, we need to catch them. */ -#error FD_SET must be defined if select function is to be used! - -#ifndef _AIX -typedef long fd_mask; -#endif -#if defined(_IBMR2) -#define SELECT_MASK void -#else -#define SELECT_MASK int -#endif /* !_IBMR2 */ - -/* Define "NBBY" (number of bits per byte) if it's not already defined. */ - -#ifndef NBBY -#define NBBY 8 -#endif - -/* Define the number of fd_masks in an fd_set */ - -#ifndef FD_SETSIZE -#ifdef OPEN_MAX -#define FD_SETSIZE OPEN_MAX -#else -#define FD_SETSIZE 256 -#endif -#endif -#if !defined(howmany) -#define howmany(x, y) (((x)+((y)-1))/(y)) -#endif -#ifndef NFDBITS -#define NFDBITS NBBY*sizeof(fd_mask) -#endif -#define MASK_SIZE howmany(FD_SETSIZE, NFDBITS) - -#endif /* NO_FD_SET */ -#endif /* !HAVE_POLL */ - - typedef struct gdb_event gdb_event; typedef void (event_handler_func) (int); @@ -258,7 +210,6 @@ static void create_file_handler (int fd, int mask, handler_func * proc, gdb_clie static void invoke_async_signal_handler (void); static void handle_file_event (int event_file_desc); static int gdb_wait_for_event (void); -static int gdb_do_one_event (void *data); static int check_async_ready (void); static void async_queue_event (gdb_event * event_ptr, queue_position position); static gdb_event *create_file_event (int fd); @@ -394,7 +345,7 @@ process_event (void) can happen if there are no event sources to wait for). If an error occurs catch_errors() which calls this function returns zero. */ -static int +int gdb_do_one_event (void *data) { /* Any events already waiting in the queue? */ @@ -441,15 +392,30 @@ start_event_loop (void) longer any event sources registered. */ while (1) { - int result = catch_errors (gdb_do_one_event, 0, "", RETURN_MASK_ALL); - if (result < 0) + int gdb_result; + + gdb_result = catch_errors (gdb_do_one_event, 0, "", RETURN_MASK_ALL); + if (gdb_result < 0) break; - if (result == 0) + + /* If we long-jumped out of do_one_event, we probably + didn't get around to resetting the prompt, which leaves + readline in a messed-up state. Reset it here. */ + + if (gdb_result == 0) { /* FIXME: this should really be a call to a hook that is interface specific, because interfaces can display the prompt in their own way. */ display_gdb_prompt (0); + /* This call looks bizarre, but it is required. If the user + entered a command that caused an error, + after_char_processing_hook won't be called from + rl_callback_read_char_wrapper. Using a cleanup there + won't work, since we want this function to be called + after a new prompt is printed. */ + if (after_char_processing_hook) + (*after_char_processing_hook) (); /* Maybe better to set a flag to be checked somewhere as to whether display the prompt or not. */ } @@ -534,50 +500,52 @@ create_file_handler (int fd, int mask, handler_func * proc, gdb_client_data clie file_ptr->ready_mask = 0; file_ptr->next_file = gdb_notifier.first_file_handler; gdb_notifier.first_file_handler = file_ptr; - } - file_ptr->proc = proc; - file_ptr->client_data = client_data; - file_ptr->mask = mask; - if (use_poll) - { + if (use_poll) + { #ifdef HAVE_POLL - gdb_notifier.num_fds++; - if (gdb_notifier.poll_fds) - gdb_notifier.poll_fds = - (struct pollfd *) realloc (gdb_notifier.poll_fds, - (gdb_notifier.num_fds) * sizeof (struct pollfd)); - else - gdb_notifier.poll_fds = - (struct pollfd *) xmalloc (sizeof (struct pollfd)); - (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->fd = fd; - (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->events = mask; - (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->revents = 0; + gdb_notifier.num_fds++; + if (gdb_notifier.poll_fds) + gdb_notifier.poll_fds = + (struct pollfd *) xrealloc (gdb_notifier.poll_fds, + (gdb_notifier.num_fds + * sizeof (struct pollfd))); + else + gdb_notifier.poll_fds = + (struct pollfd *) xmalloc (sizeof (struct pollfd)); + (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->fd = fd; + (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->events = mask; + (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->revents = 0; #else - internal_error (__FILE__, __LINE__, - "use_poll without HAVE_POLL"); + internal_error (__FILE__, __LINE__, + "use_poll without HAVE_POLL"); #endif /* HAVE_POLL */ - } - else - { - if (mask & GDB_READABLE) - FD_SET (fd, &gdb_notifier.check_masks[0]); + } else - FD_CLR (fd, &gdb_notifier.check_masks[0]); + { + if (mask & GDB_READABLE) + FD_SET (fd, &gdb_notifier.check_masks[0]); + else + FD_CLR (fd, &gdb_notifier.check_masks[0]); - if (mask & GDB_WRITABLE) - FD_SET (fd, &gdb_notifier.check_masks[1]); - else - FD_CLR (fd, &gdb_notifier.check_masks[1]); + if (mask & GDB_WRITABLE) + FD_SET (fd, &gdb_notifier.check_masks[1]); + else + FD_CLR (fd, &gdb_notifier.check_masks[1]); - if (mask & GDB_EXCEPTION) - FD_SET (fd, &gdb_notifier.check_masks[2]); - else - FD_CLR (fd, &gdb_notifier.check_masks[2]); + if (mask & GDB_EXCEPTION) + FD_SET (fd, &gdb_notifier.check_masks[2]); + else + FD_CLR (fd, &gdb_notifier.check_masks[2]); - if (gdb_notifier.num_fds <= fd) - gdb_notifier.num_fds = fd + 1; + if (gdb_notifier.num_fds <= fd) + gdb_notifier.num_fds = fd + 1; + } } + + file_ptr->proc = proc; + file_ptr->client_data = client_data; + file_ptr->mask = mask; } /* Remove the file descriptor FD from the list of monitored fd's: