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