/* General utility routines for GDB, the GNU debugger.
- Copyright (C) 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
- 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
- 2009, 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 1986, 1988-2012 Free Software Foundation, Inc.
This file is part of GDB.
#include "gdb_assert.h"
#include <ctype.h>
#include "gdb_string.h"
+#include "gdb_wait.h"
#include "event-top.h"
#include "exceptions.h"
#include "gdbthread.h"
? _("Startup time: %ld.%06ld (cpu), %ld.%06ld (wall)\n")
: _("Command execution time: %ld.%06ld (cpu), %ld.%06ld (wall)\n"),
cmd_time / 1000000, cmd_time % 1000000,
- delta_wall_time.tv_sec, delta_wall_time.tv_usec);
+ (long) delta_wall_time.tv_sec,
+ (long) delta_wall_time.tv_usec);
}
if (display_space)
}
#endif
+ /* The MS Windows method. If we don't have realpath, we assume we
+ don't have symlinks and just canonicalize to a Windows absolute
+ path. GetFullPath converts ../ and ./ in relative paths to
+ absolute paths, filling in current drive if one is not given
+ or using the current directory of a specified drive (eg, "E:foo").
+ It also converts all forward slashes to back slashes. */
+ /* The file system is case-insensitive but case-preserving.
+ So we do not lowercase the path. Otherwise, we might not
+ be able to display the original casing in a given path. */
+#if defined (_WIN32)
+ {
+ char buf[MAX_PATH];
+ DWORD len = GetFullPathName (filename, MAX_PATH, buf, NULL);
+
+ if (len > 0 && len < MAX_PATH)
+ return xstrdup (buf);
+ }
+#endif
+
/* This system is a lost cause, just dup the buffer. */
return xstrdup (filename);
}
return * (int *) ap - * (int *) bp;
}
+/* String compare function for qsort. */
+
+int
+compare_strings (const void *arg1, const void *arg2)
+{
+ const char **s1 = (const char **) arg1;
+ const char **s2 = (const char **) arg2;
+
+ return strcmp (*s1, *s2);
+}
+
#define AMBIGUOUS_MESS1 ".\nMatching formats:"
#define AMBIGUOUS_MESS2 \
".\nUse \"set gnutarget format-name\" to specify the format."
return minor;
}
+#ifdef HAVE_WAITPID
+
+#ifdef SIGALRM
+
+/* SIGALRM handler for waitpid_with_timeout. */
+
+static void
+sigalrm_handler (int signo)
+{
+ /* Nothing to do. */
+}
+
+#endif
+
+/* Wrapper to wait for child PID to die with TIMEOUT.
+ TIMEOUT is the time to stop waiting in seconds.
+ If TIMEOUT is zero, pass WNOHANG to waitpid.
+ Returns PID if it was successfully waited for, otherwise -1.
+
+ Timeouts are currently implemented with alarm and SIGALRM.
+ If the host does not support them, this waits "forever".
+ It would be odd though for a host to have waitpid and not SIGALRM. */
+
+pid_t
+wait_to_die_with_timeout (pid_t pid, int *status, int timeout)
+{
+ pid_t waitpid_result;
+
+ gdb_assert (pid > 0);
+ gdb_assert (timeout >= 0);
+
+ if (timeout > 0)
+ {
+#ifdef SIGALRM
+#if defined (HAVE_SIGACTION) && defined (SA_RESTART)
+ struct sigaction sa, old_sa;
+
+ sa.sa_handler = sigalrm_handler;
+ sigemptyset (&sa.sa_mask);
+ sa.sa_flags = 0;
+ sigaction (SIGALRM, &sa, &old_sa);
+#else
+ void (*ofunc) ();
+
+ ofunc = (void (*)()) signal (SIGALRM, sigalrm_handler);
+#endif
+
+ alarm (timeout);
+#endif
+
+ waitpid_result = waitpid (pid, status, 0);
+
+#ifdef SIGALRM
+ alarm (0);
+#if defined (HAVE_SIGACTION) && defined (SA_RESTART)
+ sigaction (SIGALRM, &old_sa, NULL);
+#else
+ signal (SIGALRM, ofunc);
+#endif
+#endif
+ }
+ else
+ waitpid_result = waitpid (pid, status, WNOHANG);
+
+ if (waitpid_result == pid)
+ return pid;
+ else
+ return -1;
+}
+
+#endif /* HAVE_WAITPID */
+
/* Provide a prototype to silence -Wmissing-prototypes. */
extern initialize_file_ftype _initialize_utils;