From ec1b4d9a51db61b77c3953f3de4339f34e512c42 Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Sat, 16 Jun 2018 08:11:37 -0700
Subject: [PATCH] Rewrite memory-limit in Lisp

Have it return Emacs virtual memory size, not the sbrk value
which is often useless newadays.
* doc/lispref/internals.texi (Garbage Collection):
* etc/NEWS: Document this.
* lisp/subr.el (memory-limit): New implementation in Lisp,
written in terms of process-attributes, and which returns
virtual memory size.
* src/alloc.c (Fmemory_limit): Remove C implementation.
---
 doc/lispref/internals.texi |  6 ++----
 etc/NEWS                   |  3 +++
 lisp/subr.el               |  4 ++++
 src/alloc.c                | 19 -------------------
 4 files changed, 9 insertions(+), 23 deletions(-)

diff --git a/doc/lispref/internals.texi b/doc/lispref/internals.texi
index 9cf1a4f9a32..faaf26f4f7e 100644
--- a/doc/lispref/internals.texi
+++ b/doc/lispref/internals.texi
@@ -507,10 +507,8 @@ function @code{memory-limit} provides information on the total amount of
 memory Emacs is currently using.
 
 @defun memory-limit
-This function returns the address of the last byte Emacs has allocated,
-divided by 1024.  We divide the value by 1024 to make sure it fits in a
-Lisp integer.
-
+This function returns an estimate of the total amount of bytes of
+virtual memory that Emacs is currently using, divided by 1024.
 You can use this to get a general idea of how your actions affect the
 memory usage.
 @end defun
diff --git a/etc/NEWS b/etc/NEWS
index cecd3f81f85..d59b4a7cf4f 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -664,6 +664,9 @@ socket has been passed to Emacs (Bug#24218).
 instead of just Microsoft platforms.  This fixes a 'get-free-disk-space'
 bug on OS X 10.8 and later (Bug#28639).
 
++++
+** 'memory-limit' now returns a better estimate of memory consumption.
+
 +++
 ** New macro 'combine-change-calls' arranges to call the change hooks
 ('before-change-functions' and 'after-change-functions') just once
diff --git a/lisp/subr.el b/lisp/subr.el
index 4a2b797fa0c..8123e60f62a 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -2182,6 +2182,10 @@ It can be retrieved with `(process-get PROCESS PROPNAME)'."
   (set-process-plist process
 		     (plist-put (process-plist process) propname value)))
 
+(defun memory-limit ()
+  "Return an estimate of Emacs virtual memory usage, divided by 1024."
+  (or (cdr (assq 'vsize (process-attributes (emacs-pid)))) 0))
+
 
 ;;;; Input and display facilities.
 
diff --git a/src/alloc.c b/src/alloc.c
index 286358662b9..cc846fd38ee 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -7120,24 +7120,6 @@ or memory information can't be obtained, return nil.  */)
 
 /* Debugging aids.  */
 
-DEFUN ("memory-limit", Fmemory_limit, Smemory_limit, 0, 0, 0,
-       doc: /* Return the address of the last byte Emacs has allocated, divided by 1024.
-This may be helpful in debugging Emacs's memory usage.
-We divide the value by 1024 to make sure it fits in a Lisp integer.  */)
-  (void)
-{
-  Lisp_Object end;
-
-#if defined HAVE_NS || defined __APPLE__ || !HAVE_SBRK
-  /* Avoid warning.  sbrk has no relation to memory allocated anyway.  */
-  XSETINT (end, 0);
-#else
-  XSETINT (end, (intptr_t) (char *) sbrk (0) / 1024);
-#endif
-
-  return end;
-}
-
 DEFUN ("memory-use-counts", Fmemory_use_counts, Smemory_use_counts, 0, 0, 0,
        doc: /* Return a list of counters that measure how much consing there has been.
 Each of these counters increments for a certain kind of object.
@@ -7495,7 +7477,6 @@ The time is in seconds as a floating point value.  */);
   defsubr (&Smake_finalizer);
   defsubr (&Spurecopy);
   defsubr (&Sgarbage_collect);
-  defsubr (&Smemory_limit);
   defsubr (&Smemory_info);
   defsubr (&Smemory_use_counts);
   defsubr (&Ssuspicious_object);
-- 
2.39.5