Re: core dumps
Adrian Phillips (adrian.phillips@dnmi.no)
Mon, 22 Aug 1994 08:26:51 -0500
I found this in my archive, and wish I checked earlier - I have crashes
regularly, say once/twice a day with 19.25 and all the debug traces were
completely corrupted but I have seen a few mails with crashes which crashed in
the same function (regexp package) - this the same bug or are there two ?
Oh well, going to try patching this change in (thanks to Jeff Sparkes for it).
Adrian
On Jun 29, 9:32am, jeff (j.d.) sparkes wrote:
> Subject: re:well, efs kills lemacs-19.10..
> In message "well, efs kills lemacs-19.10..",
> 'mly@adoc.xerox.com' writes:
>
> >Fri Jun 24 21:14:00 1994
> Fri, 24 Jun 1994 16:48:03 -0700
> >
> > jeff sparkes writes:
> > > It's hard to report those bugs because I'm a beta tester of both; I'm
> > > not sure how many people are doing that.
> > >
> > > I'm seeing GC bugs, core dumps in mark_object when I have efs running.
> > > How do I make a useful bug report from that? Hmm, maybe I can set
> > > gc-cons-threshold real small to be pretty close to where the
> > > corruption occurs.
> >
> > The file-handler-alist code has worried me for some time because
> > some very low level function are now running Lisp code. I have a
> > nagging, wholly unsubstantiated feeling that some variable isn't
> > being GCPRO'd before one of these functions is called. It's one
> > place to start looking anyway.
> >
> >It worried me so much that I found and fixed several dozen such places
> >when I reluctantly merged in this RMSmacs randomness. I wouldn't be
> >at all surprised to find that more GC-protection is needed.
> >
> >This is the sort of thing that somebody who understands it can go a
> >long way towards fixing by just reading the code carefully. We just
> >need to find such a person with some spare time.
>
> I've already spent some time looking for this. As I understand it,
> function need to gcpro local variables pointing to allocated/consed
> memory if they call a function that may cons. (Please correct me if
> I'm wrong.)
>
> I went trolling through the functions that called
> Ffind_file_name_handler. I noticed that Fexpand_file_name is called
> inconsistently, sometimes the variable used is gcpro'd, sometimes not.
> I made them all consistent (in fileio.c at least) and fixed a couple
> of other things as well.
>
> This patch fixes both problems I had with efs-1.9. (Or at least has
> for the day I've been running it; before I couldn't go 20 minutes
> without a problem.)
> 1. crashing during garbage collection
> 2. verify-visited-file-modtime erroneously returning nil, which caused
> emacs to think that the file had changed on disk.
>
> ===================================================================
> RCS file: buffer.c,v
> retrieving revision 1.1
> diff -c -r1.1 buffer.c
> *** 1.1 1994/06/27 15:44:26
> --- buffer.c 1994/06/27 15:46:00
> ***************
> *** 314,322 ****
> Lisp_Object filename;
> {
> register Lisp_Object tail, buf, tem;
> CHECK_STRING (filename, 0);
> filename = Fexpand_file_name (filename, Qnil);
> !
> {
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
> --- 314,325 ----
> Lisp_Object filename;
> {
> register Lisp_Object tail, buf, tem;
> + struct gcpro gcpro1;
> +
> + GCPRO1 (filename);
> CHECK_STRING (filename, 0);
> filename = Fexpand_file_name (filename, Qnil);
> ! UNGCPRO;
> {
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
> ===================================================================
> RCS file: dired.c,v
> retrieving revision 1.1
> diff -c -r1.1 dired.c
> *** 1.1 1994/06/27 15:45:44
> --- dired.c 1994/06/27 15:45:58
> ***************
> *** 644,650 ****
> --- 644,652 ----
> Lisp_Object handler;
> struct gcpro gcpro1, gcpro2;
>
> + GCPRO1 (filename);
> filename = Fexpand_file_name (filename, Qnil);
> + UNGCPRO;
>
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
> ===================================================================
> RCS file: fileio.c,v
> retrieving revision 1.1
> diff -c -r1.1 fileio.c
> *** 1.1 1994/06/27 14:34:46
> --- fileio.c 1994/06/28 15:09:13
> ***************
> *** 1711,1719 ****
> {
> char dir [MAXPATHLEN];
> Lisp_Object handler;
> !
> CHECK_STRING (dirname, 0);
> dirname = Fexpand_file_name (dirname, Qnil);
>
> handler = Ffind_file_name_handler (dirname, Qmake_directory);
> if (!NILP (handler))
> --- 1711,1722 ----
> {
> char dir [MAXPATHLEN];
> Lisp_Object handler;
> ! struct gcpro gcpro1;
> !
> ! GCPRO1 (dirname);
> CHECK_STRING (dirname, 0);
> dirname = Fexpand_file_name (dirname, Qnil);
> + UNGCPRO;
>
> handler = Ffind_file_name_handler (dirname, Qmake_directory);
> if (!NILP (handler))
> ***************
> *** 1745,1753 ****
> Lisp_Object dirname;
> {
> Lisp_Object handler;
> !
> CHECK_STRING (dirname, 0);
> dirname = Fexpand_file_name (dirname, Qnil);
>
> handler = Ffind_file_name_handler (dirname, Qdelete_directory);
> if (!NILP (handler))
> --- 1748,1759 ----
> Lisp_Object dirname;
> {
> Lisp_Object handler;
> ! struct gcpro gcpro1;
> !
> ! GCPRO1 (dirname);
> CHECK_STRING (dirname, 0);
> dirname = Fexpand_file_name (dirname, Qnil);
> + UNGCPRO;
>
> handler = Ffind_file_name_handler (dirname, Qdelete_directory);
> if (!NILP (handler))
> ***************
> *** 1766,1773 ****
> --- 1772,1783 ----
> Lisp_Object filename;
> {
> Lisp_Object handler;
> + struct gcpro gcpro1;
> +
> + GCPRO1 (filename);
> CHECK_STRING (filename, 0);
> filename = Fexpand_file_name (filename, Qnil);
> + UNGCPRO;
>
> handler = Ffind_file_name_handler (filename, Qdelete_file);
> if (!NILP (handler))
> ***************
> *** 2046,2054 ****
> {
> Lisp_Object abspath;
> Lisp_Object handler;
> !
> CHECK_STRING (filename, 0);
> abspath = Fexpand_file_name (filename, Qnil);
>
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
> --- 2056,2067 ----
> {
> Lisp_Object abspath;
> Lisp_Object handler;
> ! struct gcpro gcpro1;
> !
> ! GCPRO1 (filename);
> CHECK_STRING (filename, 0);
> abspath = Fexpand_file_name (filename, Qnil);
> + UNGCPRO;
>
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
> ***************
> *** 2071,2079 ****
> {
> Lisp_Object abspath;
> Lisp_Object handler;
> !
> CHECK_STRING (filename, 0);
> abspath = Fexpand_file_name (filename, Qnil);
>
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
> --- 2084,2095 ----
> {
> Lisp_Object abspath;
> Lisp_Object handler;
> ! struct gcpro gcpro1;
> !
> ! GCPRO1 (filename);
> CHECK_STRING (filename, 0);
> abspath = Fexpand_file_name (filename, Qnil);
> + UNGCPRO;
>
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
> ***************
> *** 2095,2103 ****
> {
> Lisp_Object abspath;
> Lisp_Object handler;
> !
> CHECK_STRING (filename, 0);
> abspath = Fexpand_file_name (filename, Qnil);
>
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
> --- 2111,2122 ----
> {
> Lisp_Object abspath;
> Lisp_Object handler;
> ! struct gcpro gcpro1;
> !
> ! GCPRO1 (filename);
> CHECK_STRING (filename, 0);
> abspath = Fexpand_file_name (filename, Qnil);
> + UNGCPRO;
>
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
> ***************
> *** 2124,2132 ****
> int valsize;
> Lisp_Object val;
> Lisp_Object handler;
> !
> CHECK_STRING (filename, 0);
> filename = Fexpand_file_name (filename, Qnil);
>
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
> --- 2143,2154 ----
> int valsize;
> Lisp_Object val;
> Lisp_Object handler;
> ! struct gcpro gcpro1;
> !
> ! GCPRO1 (filename);
> CHECK_STRING (filename, 0);
> filename = Fexpand_file_name (filename, Qnil);
> + UNGCPRO;
>
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
> ***************
> *** 2191,2199 ****
> {
> Lisp_Object abspath, dir;
> Lisp_Object handler;
> !
> CHECK_STRING (filename, 0);
> abspath = Fexpand_file_name (filename, Qnil);
>
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
> --- 2213,2224 ----
> {
> Lisp_Object abspath, dir;
> Lisp_Object handler;
> ! struct gcpro gcpro1;
> !
> ! GCPRO1 (filename);
> CHECK_STRING (filename, 0);
> abspath = Fexpand_file_name (filename, Qnil);
> + UNGCPRO;
>
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
> ***************
> *** 2232,2239 ****
> register Lisp_Object abspath;
> struct stat st;
> Lisp_Object handler;
> !
> abspath = expand_and_dir_to_file (filename, current_buffer->directory);
>
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
> --- 2257,2267 ----
> register Lisp_Object abspath;
> struct stat st;
> Lisp_Object handler;
> ! struct gcpro gcpro1;
> !
> ! GCPRO1 (filename);
> abspath = expand_and_dir_to_file (filename, current_buffer->directory);
> + UNGCPRO;
>
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
> ***************
> *** 2285,2292 ****
> Lisp_Object abspath;
> struct stat st;
> Lisp_Object handler;
> !
> abspath = expand_and_dir_to_file (filename, current_buffer->directory);
>
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
> --- 2313,2323 ----
> Lisp_Object abspath;
> struct stat st;
> Lisp_Object handler;
> ! struct gcpro gcpro1;
> !
> ! GCPRO1 (filename);
> abspath = expand_and_dir_to_file (filename, current_buffer->directory);
> + UNGCPRO;
>
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
> ***************
> *** 2322,2330 ****
> {
> Lisp_Object abspath;
> Lisp_Object handler;
> !
> abspath = Fexpand_file_name (filename, current_buffer->directory);
> CHECK_FIXNUM (mode, 1);
>
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
> --- 2353,2364 ----
> {
> Lisp_Object abspath;
> Lisp_Object handler;
> ! struct gcpro gcpro1;
> !
> ! GCPRO1 (filename);
> abspath = Fexpand_file_name (filename, current_buffer->directory);
> CHECK_FIXNUM (mode, 1);
> + UNGCPRO;
>
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
> ***************
> *** 2865,2870 ****
> --- 2899,2905 ----
> {
> Lisp_Object handler;
> struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
> +
> GCPRO4 (start, filename, visit, visit_file);
>
> if (visiting_other)
> ***************
> *** 2874,2880 ****
> filename = Fexpand_file_name (filename, Qnil);
>
> UNGCPRO;
> !
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
> handler = Ffind_file_name_handler (filename, Qwrite_region);
> --- 2909,2915 ----
> filename = Fexpand_file_name (filename, Qnil);
>
> UNGCPRO;
> !
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
> handler = Ffind_file_name_handler (filename, Qwrite_region);
> ***************
> *** 2892,2900 ****
> --- 2927,2937 ----
> current_buffer->save_length = make_number (Z - BEG);
> current_buffer->filename = visit_file;
> }
> + UNGCPRO;
> return val;
> }
> }
> +
>
> #ifdef CLASH_DETECTION
> if (!auto_saving)
> ***************
> *** 3549,3559 ****
> current_buffer->modtime = cons_to_long (time_list);
> else
> {
> ! register Lisp_Object filename;
> struct stat st;
> Lisp_Object handler;
> !
> filename = Fexpand_file_name (current_buffer->filename, Qnil);
>
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
> --- 3586,3599 ----
> current_buffer->modtime = cons_to_long (time_list);
> else
> {
> ! Lisp_Object filename;
> struct stat st;
> Lisp_Object handler;
> ! struct gcpro gcpro1;
> !
> ! GCPRO1 (filename);
> filename = Fexpand_file_name (current_buffer->filename, Qnil);
> + UNGCPRO;
>
> /* If the file name has special constructs in it,
> call the corresponding file handler. */
>-- End of excerpt from jeff (j.d.) sparkes
--
-------------------------------------------------------------------------
= Adrian Phillips at | BUT any thoughts in this are purely =
= The Norwegian Meteorological | my own and have nothing to do with =
= Institute | this establishment, thankfully. =
= Net: adrian.phillips@dnmi.no | Phone: 47 22 96 32 09 Fax: 47 22 96 30 50