From 3aa96ff51efd72767f1a4e04c546187269b008c0 Mon Sep 17 00:00:00 2001 From: Dmitry Antipov Date: Fri, 11 Jul 2014 16:19:58 +0400 Subject: [PATCH] * src/alloc.c (Fmemory_info) [HAVE_LINUX_SYSINFO]: Return nil if sysinfo failed. Adjust docstring. * doc/lispref/internals.texi (Garbage Collection): Mention memory-info. * lisp/files.el (out-of-memory-warning-percentage): New defcustom. (warn-maybe-out-of-memory): Use it. --- doc/lispref/ChangeLog | 4 ++++ doc/lispref/internals.texi | 4 ++++ lisp/ChangeLog | 5 +++++ lisp/files.el | 23 +++++++++++++++++------ src/ChangeLog | 5 +++++ src/alloc.c | 7 ++++--- 6 files changed, 39 insertions(+), 9 deletions(-) diff --git a/doc/lispref/ChangeLog b/doc/lispref/ChangeLog index 17af128ae49..5f7e00a4f10 100644 --- a/doc/lispref/ChangeLog +++ b/doc/lispref/ChangeLog @@ -1,3 +1,7 @@ +2014-07-11 Dmitry Antipov + + * internals.texi (Garbage Collection): Mention memory-info. + 2014-07-11 Michael Albinus * minibuf.texi (Intro to Minibuffers, Reading a Password): diff --git a/doc/lispref/internals.texi b/doc/lispref/internals.texi index 3a5bd4aea7e..626ecad7f42 100644 --- a/doc/lispref/internals.texi +++ b/doc/lispref/internals.texi @@ -513,6 +513,10 @@ created in this Emacs session. Each of these counters increments for a certain kind of object. See the documentation string for details. @end defun +@defun memory-info +This functions returns an amount of total system memory and how much +of it is free. On an unsupported system, the value may be @code{nil}. + @defvar gcs-done This variable contains the total number of garbage collections done so far in this Emacs session. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 3965da7287b..faa5a3dffff 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2014-07-11 Dmitry Antipov + + * files.el (out-of-memory-warning-percentage): New defcustom. + (warn-maybe-out-of-memory): Use it. + 2014-07-11 Michael Albinus * subr.el (read-passwd): Use `read-hide-char' if non-nil. Bind it diff --git a/lisp/files.el b/lisp/files.el index 258a37616c1..d3aa063e788 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -1786,6 +1786,14 @@ When nil, never request confirmation." :version "22.1" :type '(choice integer (const :tag "Never request confirmation" nil))) +(defcustom out-of-memory-warning-percentage 50 + "Warn if file size exceeds this percentage of available free memory. +When nil, never issue warning." + :group 'files + :group 'find-file + :version "24.4" + :type '(choice integer (const :tag "Never issue warning" nil))) + (defun abort-if-file-too-large (size op-type filename) "If file SIZE larger than `large-file-warning-threshold', allow user to abort. OP-TYPE specifies the file operation being performed (for message to user)." @@ -1798,19 +1806,22 @@ OP-TYPE specifies the file operation being performed (for message to user)." (defun warn-maybe-out-of-memory (size) "Warn if an attempt to open file of SIZE bytes may run out of memory." - (when (and (numberp size) (not (zerop size))) + (when (and (numberp size) (not (zerop size)) + (integerp out-of-memory-warning-percentage)) (let ((meminfo (memory-info))) (when (consp meminfo) - (let ((total-free-memory (+ (nth 1 meminfo) (nth 3 meminfo)))) - (when (> (/ size 1024) total-free-memory) + (let ((total-free-memory (float (+ (nth 1 meminfo) (nth 3 meminfo))))) + (when (> (/ size 1024) + (/ (* total-free-memory out-of-memory-warning-percentage) + 100.0)) (warn "You are trying to open a file whose size (%s) -exceeds the amount of currently available free memory (%s). +exceeds the %S%% of currently available free memory (%s). If that fails, try to open it with `find-file-literally' \(but note that some characters might be displayed incorrectly)." (file-size-human-readable size) - (file-size-human-readable - (* (float total-free-memory) 1024))))))))) + out-of-memory-warning-percentage + (file-size-human-readable (* total-free-memory 1024))))))))) (defun find-file-noselect (filename &optional nowarn rawfile wildcards) "Read file FILENAME into a buffer and return the buffer. diff --git a/src/ChangeLog b/src/ChangeLog index e469880a4ce..52ba04d2f5f 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2014-07-11 Dmitry Antipov + + * alloc.c (Fmemory_info) [HAVE_LINUX_SYSINFO]: Return nil if + sysinfo failed. Adjust docstring. + 2014-07-11 Eli Zaretskii Implement memory-info for MS-DOS. diff --git a/src/alloc.c b/src/alloc.c index 77be94d73d1..a8ad44491fa 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -6875,8 +6875,9 @@ gc_sweep (void) DEFUN ("memory-info", Fmemory_info, Smemory_info, 0, 0, 0, doc: /* Return a list of (TOTAL-RAM FREE-RAM TOTAL-SWAP FREE-SWAP). -All values are in Kbytes. If there is no swap space, last two -values are zero. If the system is not supported, return nil. */) +All values are in Kbytes. If there is no swap space, +last two values are zero. If the system is not supported +or memory information can't be obtained, return nil. */) (void) { #if defined HAVE_LINUX_SYSINFO @@ -6884,7 +6885,7 @@ values are zero. If the system is not supported, return nil. */) uintmax_t units; if (sysinfo (&si)) - emacs_abort (); + return Qnil; #ifdef LINUX_SYSINFO_UNIT units = si.mem_unit; #else -- 2.39.5