diff options
Diffstat (limited to 'src/emacs.c')
| -rw-r--r-- | src/emacs.c | 390 |
1 files changed, 160 insertions, 230 deletions
diff --git a/src/emacs.c b/src/emacs.c index 3c814a36043..8787e4bca9f 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -20,28 +20,38 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> -#include <signal.h> #include <errno.h> #include <stdio.h> #include <sys/types.h> #include <sys/file.h> -#include <setjmp.h> #include <unistd.h> -#include "lisp.h" +#include <close-stream.h> +#include <ignore-value.h> -#ifdef HAVE_WINDOW_SYSTEM -#include TERM_HEADER -#endif /* HAVE_WINDOW_SYSTEM */ +#include "lisp.h" #ifdef WINDOWSNT #include <fcntl.h> -#include <windows.h> /* just for w32.h */ #include "w32.h" -#include "w32heap.h" /* for prototype of sbrk */ +#include "w32heap.h" +#endif + +#if defined WINDOWSNT || defined HAVE_NTGUI +#include "w32select.h" +#include "w32font.h" +#include "w32common.h" +#endif + +#if defined HAVE_NTGUI && defined CYGWIN +#include "cygw32.h" #endif +#ifdef HAVE_WINDOW_SYSTEM +#include TERM_HEADER +#endif /* HAVE_WINDOW_SYSTEM */ + #ifdef NS_IMPL_GNUSTEP /* At least under Debian, GSConfig is in a subdirectory. --Stef */ #include <GNUstepBase/GSConfig.h> @@ -54,6 +64,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include "window.h" #include "systty.h" +#include "atimer.h" #include "blockinput.h" #include "syssignal.h" #include "process.h" @@ -85,16 +96,17 @@ extern void moncontrol (int mode); #include <sys/personality.h> #endif -#ifndef O_RDWR -#define O_RDWR 2 -#endif - static const char emacs_version[] = VERSION; -static const char emacs_copyright[] = "Copyright (C) 2012 Free Software Foundation, Inc."; +static const char emacs_copyright[] = COPYRIGHT; /* Empty lisp strings. To avoid having to build any others. */ Lisp_Object empty_unibyte_string, empty_multibyte_string; +#ifdef WINDOWSNT +/* Cache for externally loaded libraries. */ +Lisp_Object Vlibrary_cache; +#endif + /* Set after Emacs has started up the first time. Prevents reinitialization of the Lisp world and keymaps on subsequent starts. */ @@ -146,6 +158,22 @@ static void *my_heap_start; static uprintmax_t heap_bss_diff; #endif +/* To run as a daemon under Cocoa or Windows, we must do a fork+exec, + not a simple fork. + + On Cocoa, CoreFoundation lib fails in forked process: + http://developer.apple.com/ReleaseNotes/ + CoreFoundation/CoreFoundation.html) + + On Windows, a Cygwin fork child cannot access the USER subsystem. + + We mark being in the exec'd process by a daemon name argument of + form "--daemon=\nFD0,FD1\nNAME" where FD are the pipe file descriptors, + NAME is the original daemon name, if any. */ +#if defined NS_IMPL_COCOA || (defined HAVE_NTGUI && defined CYGWIN) +# define DAEMON_MUST_EXEC +#endif + /* True means running Emacs without interactive terminal. */ bool noninteractive; @@ -265,20 +293,9 @@ Report bugs to bug-gnu-emacs@gnu.org. First, please see the Bugs\n\ section of the Emacs manual or the file BUGS.\n" -/* Signal code for the fatal signal that was received. */ -static int fatal_error_code; - /* True if handling a fatal error already. */ bool fatal_error_in_progress; -#ifdef FORWARD_SIGNAL_TO_MAIN_THREAD -/* When compiled with GTK and running under Gnome, - multiple threads may be created. Keep track of our main - thread to make sure signals are delivered to it (see syssignal.h). */ - -pthread_t main_thread; -#endif - #ifdef HAVE_NS /* NS autrelease pool, for memory management. */ static void *ns_pool; @@ -286,18 +303,13 @@ static void *ns_pool; -/* Handle bus errors, invalid instruction, etc. */ -#ifndef FLOAT_CATCH_SIGILL -static -#endif -void -fatal_error_signal (int sig) +/* Report a fatal error due to signal SIG, output a backtrace of at + most BACKTRACE_LIMIT lines, and exit. */ +_Noreturn void +terminate_due_to_signal (int sig, int backtrace_limit) { - SIGNAL_THREAD_CHECK (sig); - fatal_error_code = sig; signal (sig, SIG_DFL); - - TOTALLY_UNBLOCK_INPUT; + totally_unblock_input (); /* If fatal error occurs in code below, avoid infinite recursion. */ if (! fatal_error_in_progress) @@ -308,50 +320,45 @@ fatal_error_signal (int sig) Fkill_emacs (make_number (sig)); shut_down_emacs (sig, Qnil); + emacs_backtrace (backtrace_limit); } /* Signal the same code; this time it will really be fatal. - Remember that since we're in a signal handler, the signal we're - going to send is probably blocked, so we have to unblock it if we - want to really receive it. */ + Since we're in a signal handler, the signal is blocked, so we + have to unblock it if we want to really receive it. */ #ifndef MSDOS - sigunblock (sigmask (fatal_error_code)); + { + sigset_t unblocked; + sigemptyset (&unblocked); + sigaddset (&unblocked, sig); + pthread_sigmask (SIG_UNBLOCK, &unblocked, 0); + } #endif - kill (getpid (), fatal_error_code); + emacs_raise (sig); + + /* This shouldn't be executed, but it prevents a warning. */ + exit (1); } #ifdef SIGDANGER /* Handler for SIGDANGER. */ -void -memory_warning_signal (int sig) +static void +handle_danger_signal (int sig) { - signal (sig, memory_warning_signal); - SIGNAL_THREAD_CHECK (sig); - malloc_warning ("Operating system warns that virtual memory is running low.\n"); /* It might be unsafe to call do_auto_save now. */ force_auto_save_soon (); } -#endif -/* We define abort, rather than using it from the library, - so that GDB can return from a breakpoint here. - MSDOS has its own definition in msdos.c. */ - -#if ! defined (DOS_NT) && ! defined (NO_ABORT) - -void -abort (void) +static void +deliver_danger_signal (int sig) { - kill (getpid (), SIGABRT); - /* This shouldn't be executed, but it prevents a warning. */ - exit (1); + deliver_process_signal (sig, handle_danger_signal); } #endif - /* Code for dealing with Lisp access to the Unix command line. */ @@ -525,7 +532,7 @@ DEFUN ("invocation-directory", Finvocation_directory, Sinvocation_directory, #ifdef HAVE_TZSET /* A valid but unlikely value for the TZ environment value. It is OK (though a bit slower) if the user actually chooses this value. */ -static char dump_tz[] = "UtC0"; +static char const dump_tz[] = "UtC0"; #endif #ifndef ORDINARY_LINK @@ -662,6 +669,22 @@ void (*__malloc_initialize_hook) (void) EXTERNALLY_VISIBLE = malloc_initialize_h #endif /* DOUG_LEA_MALLOC */ +/* Close standard output and standard error, reporting any write + errors as best we can. This is intended for use with atexit. */ +static void +close_output_streams (void) +{ + if (close_stream (stdout) != 0) + { + fprintf (stderr, "Write error to standard output: %s\n", + strerror (errno)); + fflush (stderr); + _exit (EXIT_FAILURE); + } + + if (close_stream (stderr) != 0) + _exit (EXIT_FAILURE); +} /* ARGSUSED */ int @@ -669,6 +692,7 @@ main (int argc, char **argv) { char stack_bottom_variable; bool do_initial_setlocale; + bool dumping; int skip_args = 0; #ifdef HAVE_SETRLIMIT struct rlimit rlim; @@ -676,7 +700,7 @@ main (int argc, char **argv) bool no_loadup = 0; char *junk = 0; char *dname_arg = 0; -#ifdef NS_IMPL_COCOA +#ifdef DAEMON_MUST_EXEC char dname_arg2[80]; #endif char *ch_to_dir; @@ -684,9 +708,9 @@ main (int argc, char **argv) /* Record (approximately) where the stack begins. */ stack_bottom = &stack_bottom_variable; -#if defined (USE_GTK) && defined (G_SLICE_ALWAYS_MALLOC) +#ifdef G_SLICE_ALWAYS_MALLOC /* This is used by the Cygwin build. */ - setenv ("G_SLICE", "always-malloc", 1); + xputenv ("G_SLICE=always-malloc"); #endif #ifdef GNU_LINUX @@ -702,6 +726,13 @@ main (int argc, char **argv) } #endif +#if defined WINDOWSNT || defined HAVE_NTGUI + /* Set global variables used to detect Windows version. Do this as + early as possible. (unexw32.c calls this function as well, but + the additional call here is harmless.) */ + cache_system_info (); +#endif + #ifdef RUN_TIME_REMAP if (initialized) run_time_remap (argv[0]); @@ -713,6 +744,8 @@ main (int argc, char **argv) unexec_init_emacs_zone (); #endif + atexit (close_output_streams); + sort_args (argc, argv); argc = 0; while (argv[argc]) argc++; @@ -764,16 +797,14 @@ main (int argc, char **argv) exit (1); } + dumping = !initialized && (strcmp (argv[argc - 1], "dump") == 0 + || strcmp (argv[argc - 1], "bootstrap") == 0); #ifdef HAVE_PERSONALITY_LINUX32 - if (!initialized - && (strcmp (argv[argc-1], "dump") == 0 - || strcmp (argv[argc-1], "bootstrap") == 0) - && ! getenv ("EMACS_HEAP_EXEC")) + if (dumping && ! getenv ("EMACS_HEAP_EXEC")) { - static char heapexec[] = "EMACS_HEAP_EXEC=true"; /* Set this so we only do this once. */ - putenv (heapexec); + xputenv ("EMACS_HEAP_EXEC=true"); /* A flag to turn off address randomization which is introduced in linux kernel shipped with fedora core 4 */ @@ -834,20 +865,12 @@ main (int argc, char **argv) /* Arrange to get warning messages as memory fills up. */ memory_warnings (0, malloc_warning); - /* Call malloc at least once, to run the initial __malloc_hook. + /* Call malloc at least once, to run malloc_initialize_hook. Also call realloc and free for consistency. */ free (realloc (malloc (4), 4)); -# ifndef SYNC_INPUT - /* Arrange to disable interrupt input inside malloc etc. */ - uninterrupt_malloc (); -# endif /* not SYNC_INPUT */ #endif /* not SYSTEM_MALLOC */ -#ifdef FORWARD_SIGNAL_TO_MAIN_THREAD - main_thread = pthread_self (); -#endif /* FORWARD_SIGNAL_TO_MAIN_THREAD */ - #if defined (MSDOS) || defined (WINDOWSNT) /* We do all file input/output as binary files. When we need to translate newlines, we do that manually. */ @@ -976,25 +999,19 @@ main (int argc, char **argv) exit (1); } -#ifndef NS_IMPL_COCOA +#ifndef DAEMON_MUST_EXEC #ifdef USE_GTK fprintf (stderr, "\nWarning: due to a long standing Gtk+ bug\nhttp://bugzilla.gnome.org/show_bug.cgi?id=85715\n\ Emacs might crash when run in daemon mode and the X11 connection is unexpectedly lost.\n\ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem.\n"); -#endif +#endif /* USE_GTK */ f = fork (); -#else /* NS_IMPL_COCOA */ - /* Under Cocoa we must do fork+exec as CoreFoundation lib fails in - forked process: http://developer.apple.com/ReleaseNotes/ - CoreFoundation/CoreFoundation.html) - We mark being in the exec'd process by a daemon name argument of - form "--daemon=\nFD0,FD1\nNAME" where FD are the pipe file descriptors, - NAME is the original daemon name, if any. */ +#else /* DAEMON_MUST_EXEC */ if (!dname_arg || !strchr (dname_arg, '\n')) f = fork (); /* in orig */ else f = 0; /* in exec'd */ -#endif /* NS_IMPL_COCOA */ +#endif /* !DAEMON_MUST_EXEC */ if (f > 0) { int retval; @@ -1030,7 +1047,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem exit (1); } -#ifdef NS_IMPL_COCOA +#ifdef DAEMON_MUST_EXEC { /* In orig process, forked as child, OR in exec'd. */ if (!dname_arg || !strchr (dname_arg, '\n')) @@ -1066,7 +1083,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem dname_arg2); dname_arg = *dname_arg2 ? dname_arg2 : NULL; } -#endif /* NS_IMPL_COCOA */ +#endif /* DAEMON_MUST_EXEC */ if (dname_arg) daemon_name = xstrdup (dname_arg); @@ -1076,132 +1093,23 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem that it is not accessible to programs started from .emacs. */ fcntl (daemon_pipe[1], F_SETFD, FD_CLOEXEC); -#ifdef HAVE_SETSID setsid (); -#endif #else /* DOS_NT */ fprintf (stderr, "This platform does not support the -daemon flag.\n"); exit (1); #endif /* DOS_NT */ } +#if defined (HAVE_PTHREAD) && !defined (SYSTEM_MALLOC) && !defined (DOUG_LEA_MALLOC) if (! noninteractive) { -#if defined (USG5) && defined (INTERRUPT_INPUT) - setpgrp (); -#endif -#if defined (HAVE_PTHREAD) && !defined (SYSTEM_MALLOC) && !defined (DOUG_LEA_MALLOC) - { - extern void malloc_enable_thread (void); - - malloc_enable_thread (); - } -#endif - } + extern void malloc_enable_thread (void); - init_signals (); - - /* Don't catch SIGHUP if dumping. */ - if (1 -#ifndef CANNOT_DUMP - && initialized -#endif - ) - { - sigblock (sigmask (SIGHUP)); - /* In --batch mode, don't catch SIGHUP if already ignored. - That makes nohup work. */ - if (! noninteractive - || signal (SIGHUP, SIG_IGN) != SIG_IGN) - signal (SIGHUP, fatal_error_signal); - sigunblock (sigmask (SIGHUP)); + malloc_enable_thread (); } - - if ( -#ifndef CANNOT_DUMP - ! noninteractive || initialized -#else - 1 -#endif - ) - { - /* Don't catch these signals in batch mode if dumping. - On some machines, this sets static data that would make - signal fail to work right when the dumped Emacs is run. */ - signal (SIGQUIT, fatal_error_signal); - signal (SIGILL, fatal_error_signal); - signal (SIGTRAP, fatal_error_signal); -#ifdef SIGUSR1 - add_user_signal (SIGUSR1, "sigusr1"); -#endif -#ifdef SIGUSR2 - add_user_signal (SIGUSR2, "sigusr2"); -#endif -#ifdef SIGABRT - signal (SIGABRT, fatal_error_signal); -#endif -#ifdef SIGHWE - signal (SIGHWE, fatal_error_signal); -#endif -#ifdef SIGPRE - signal (SIGPRE, fatal_error_signal); -#endif -#ifdef SIGORE - signal (SIGORE, fatal_error_signal); -#endif -#ifdef SIGUME - signal (SIGUME, fatal_error_signal); -#endif -#ifdef SIGDLK - signal (SIGDLK, fatal_error_signal); -#endif -#ifdef SIGCPULIM - signal (SIGCPULIM, fatal_error_signal); -#endif -#ifdef SIGIOT - /* This is missing on some systems - OS/2, for example. */ - signal (SIGIOT, fatal_error_signal); -#endif -#ifdef SIGEMT - signal (SIGEMT, fatal_error_signal); -#endif - signal (SIGFPE, fatal_error_signal); -#ifdef SIGBUS - signal (SIGBUS, fatal_error_signal); -#endif - signal (SIGSEGV, fatal_error_signal); -#ifdef SIGSYS - signal (SIGSYS, fatal_error_signal); -#endif - /* May need special treatment on MS-Windows. See - http://lists.gnu.org/archive/html/emacs-devel/2010-09/msg01062.html - Please update the doc of kill-emacs, kill-emacs-hook, and - NEWS if you change this. - */ - if (noninteractive) signal (SIGINT, fatal_error_signal); - signal (SIGTERM, fatal_error_signal); -#ifdef SIGXCPU - signal (SIGXCPU, fatal_error_signal); -#endif -#ifdef SIGXFSZ - signal (SIGXFSZ, fatal_error_signal); -#endif /* SIGXFSZ */ - -#ifdef SIGDANGER - /* This just means available memory is getting low. */ - signal (SIGDANGER, memory_warning_signal); #endif -#ifdef AIX -/* 20 is SIGCHLD, 21 is SIGTTIN, 22 is SIGTTOU. */ - signal (SIGXCPU, fatal_error_signal); - signal (SIGIOINT, fatal_error_signal); - signal (SIGGRANT, fatal_error_signal); - signal (SIGRETRACT, fatal_error_signal); - signal (SIGSOUND, fatal_error_signal); - signal (SIGMSG, fatal_error_signal); -#endif /* AIX */ - } + init_signals (dumping); noninteractive1 = noninteractive; @@ -1239,6 +1147,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem /* Called before syms_of_fileio, because it sets up Qerror_condition. */ syms_of_data (); + syms_of_fns (); /* Before syms_of_charset which uses hashtables. */ syms_of_fileio (); /* Before syms_of_coding to initialize Vgc_cons_threshold. */ syms_of_alloc (); @@ -1250,7 +1159,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem init_window_once (); /* Init the window system. */ #ifdef HAVE_WINDOW_SYSTEM - init_fringe_once (); /* Swap bitmaps if necessary. */ + init_fringe_once (); /* Swap bitmaps if necessary. */ #endif /* HAVE_WINDOW_SYSTEM */ } @@ -1265,7 +1174,6 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem } init_eval (); - init_data (); init_atimer (); running_asynch_code = 0; init_random (); @@ -1378,9 +1286,10 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem #ifdef WINDOWSNT globals_of_w32 (); + globals_of_w32notify (); /* Initialize environment from registry settings. */ init_environment (argv); - init_ntproc (); /* must precede init_editfns. */ + init_ntproc (dumping); /* must precede init_editfns. */ #endif /* Initialize and GC-protect Vinitial_environment and @@ -1391,8 +1300,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem /* egetenv is a pretty low-level facility, which may get called in many circumstances; it seems flimsy to put off initializing it until calling init_callproc. Do not do it when dumping. */ - if (initialized || ((strcmp (argv[argc-1], "dump") != 0 - && strcmp (argv[argc-1], "bootstrap") != 0))) + if (! dumping) set_initial_environment (); /* AIX crashes are reported in system versions 3.2.3 and 3.2.4 @@ -1400,7 +1308,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem don't pollute Vglobal_environment. */ /* Setting LANG here will defeat the startup locale processing... */ #ifdef AIX - putenv ("LANG=C"); + xputenv ("LANG=C"); #endif init_buffer (); /* Init default directory of main buffer. */ @@ -1436,7 +1344,6 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem syms_of_lread (); syms_of_print (); syms_of_eval (); - syms_of_fns (); syms_of_floatfns (); syms_of_buffer (); @@ -1475,6 +1382,9 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem #ifdef WINDOWSNT syms_of_ntproc (); #endif /* WINDOWSNT */ +#if defined CYGWIN && defined HAVE_NTGUI + syms_of_cygw32 (); +#endif syms_of_window (); syms_of_xdisp (); syms_of_font (); @@ -1505,11 +1415,14 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem #ifdef HAVE_NTGUI syms_of_w32term (); syms_of_w32fns (); - syms_of_w32select (); syms_of_w32menu (); syms_of_fontset (); #endif /* HAVE_NTGUI */ +#if defined WINDOWSNT || defined HAVE_NTGUI + syms_of_w32select (); +#endif + #ifdef MSDOS syms_of_xmenu (); syms_of_dosfns (); @@ -1529,15 +1442,21 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem syms_of_gnutls (); #endif +#ifdef HAVE_INOTIFY + syms_of_inotify (); +#endif /* HAVE_INOTIFY */ + #ifdef HAVE_DBUS syms_of_dbusbind (); #endif /* HAVE_DBUS */ #ifdef WINDOWSNT syms_of_ntterm (); + syms_of_w32notify (); #endif /* WINDOWSNT */ syms_of_threads (); + syms_of_profiler (); keys_of_casefiddle (); keys_of_cmds (); @@ -1554,8 +1473,11 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem globals_of_w32font (); globals_of_w32fns (); globals_of_w32menu (); - globals_of_w32select (); #endif /* HAVE_NTGUI */ + +#if defined WINDOWSNT || defined HAVE_NTGUI + globals_of_w32select (); +#endif } init_charset (); @@ -1570,7 +1492,6 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem init_fringe (); #endif /* HAVE_WINDOW_SYSTEM */ init_macros (); - init_floatfns (); init_window (); init_font (); @@ -1885,7 +1806,7 @@ sort_args (int argc, char **argv) } if (best < 0) - abort (); + emacs_abort (); /* Copy the highest priority remaining option, with its args, to NEW. Unless it is a duplicate of the previous one. */ @@ -1964,8 +1885,6 @@ all of which are called before Emacs is actually killed. */) exit_code = (XINT (arg) < 0 ? XINT (arg) | INT_MIN : XINT (arg) & INT_MAX); - else if (noninteractive && (fflush (stdout) || ferror (stdout))) - exit_code = EXIT_FAILURE; else exit_code = EXIT_SUCCESS; exit (exit_code); @@ -1995,13 +1914,20 @@ shut_down_emacs (int sig, Lisp_Object stuff) /* If we are controlling the terminal, reset terminal modes. */ #ifndef DOS_NT { - int pgrp = EMACS_GETPGRP (0); - int tpgrp = tcgetpgrp (0); + pid_t pgrp = getpgrp (); + pid_t tpgrp = tcgetpgrp (0); if ((tpgrp != -1) && tpgrp == pgrp) { reset_all_sys_modes (); if (sig && sig != SIGTERM) - fprintf (stderr, "Fatal error (%d)", sig); + { + static char const format[] = "Fatal error %d: "; + char buf[sizeof format - 2 + INT_STRLEN_BOUND (int)]; + int buflen = sprintf (buf, format, sig); + char const *sig_desc = safe_strsignal (sig); + ignore_value (write (STDERR_FILENO, buf, buflen)); + ignore_value (write (STDERR_FILENO, sig_desc, strlen (sig_desc))); + } } } #else @@ -2019,16 +1945,10 @@ shut_down_emacs (int sig, Lisp_Object stuff) unlock_all_files (); #endif -#ifdef SIGIO /* There is a tendency for a SIGIO signal to arrive within exit, and cause a SIGHUP because the input descriptor is already closed. */ unrequest_sigio (); - signal (SIGIO, SIG_IGN); -#endif - -#ifdef WINDOWSNT - term_ntproc (); -#endif + ignore_sigio (); /* Do this only if terminating normally, we want glyph matrices etc. in a core dump. */ @@ -2049,6 +1969,10 @@ shut_down_emacs (int sig, Lisp_Object stuff) #ifdef HAVE_LIBXML2 xml_cleanup_parser (); #endif + +#ifdef WINDOWSNT + term_ntproc (0); +#endif } @@ -2130,12 +2054,6 @@ You must run Emacs in batch mode in order to dump it. */) memory_warnings (my_edata, malloc_warning); } #endif /* not WINDOWSNT */ -#if defined (HAVE_PTHREAD) && !defined SYNC_INPUT - /* Pthread may call malloc before main, and then we will get an endless - loop, because pthread_self (see alloc.c) calls malloc the first time - it is called on some systems. */ - reset_malloc_hooks (); -#endif #endif /* not SYSTEM_MALLOC */ #ifdef DOUG_LEA_MALLOC malloc_state_ptr = malloc_get_state (); @@ -2152,6 +2070,13 @@ You must run Emacs in batch mode in order to dump it. */) free (malloc_state_ptr); #endif +#ifdef WINDOWSNT + Vlibrary_cache = Qnil; +#endif +#ifdef HAVE_WINDOW_SYSTEM + reset_image_types (); +#endif + Vpurify_flag = tem; return unbind_to (count, Qnil); @@ -2484,6 +2409,11 @@ libraries; only those already known by Emacs will be loaded. */); Vdynamic_library_alist = Qnil; Fput (intern_c_string ("dynamic-library-alist"), Qrisky_local_variable, Qt); +#ifdef WINDOWSNT + Vlibrary_cache = Qnil; + staticpro (&Vlibrary_cache); +#endif + /* Make sure IS_DAEMON starts up as false. */ daemon_pipe[1] = 0; } |
