summaryrefslogtreecommitdiff
path: root/src/dosfns.c
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2014-07-11 13:09:51 +0300
committerEli Zaretskii <eliz@gnu.org>2014-07-11 13:09:51 +0300
commit5f7c30e757680f66be9ef4c399fd1d7ce5b66203 (patch)
treea7a1c1806020f496dc2948622a6e43b8b06df4cf /src/dosfns.c
parent8f4fc468ca50120c2218f74555301d68004d8217 (diff)
downloademacs-5f7c30e757680f66be9ef4c399fd1d7ce5b66203.tar.gz
Implement memory-info for MS-DOS.
src/dosfns.c (dos_memory_info): New function. src/dosfns.h (dos_memory_info): Add prototype. src/alloc.c (Fmemory_info) [MSDOS]: Call dos_memory_info. src/vm-limit.c (get_lim_data) [MSDOS]: Call dos_memory_info, instead of doing some of its job.
Diffstat (limited to 'src/dosfns.c')
-rw-r--r--src/dosfns.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/dosfns.c b/src/dosfns.c
index baa0358d725..e557dcba022 100644
--- a/src/dosfns.c
+++ b/src/dosfns.c
@@ -641,6 +641,48 @@ system_process_attributes (Lisp_Object pid)
return attrs;
}
+/* Support for memory-info. */
+int
+dos_memory_info (unsigned long *totalram, unsigned long *freeram,
+ unsigned long *totalswap, unsigned long *freeswap)
+{
+ _go32_dpmi_meminfo info;
+ unsigned long mem1, mem2, freemem;
+
+ _go32_dpmi_get_free_memory_information (&info);
+ /* DPMI server of Windows NT and its descendants reports in
+ info.available_memory a much lower amount that is really
+ available, which causes bogus "past 95% of memory limit"
+ warnings. Try to overcome that via circumstantial evidence. */
+ mem1 = info.available_memory;
+ mem2 = info.available_physical_pages;
+ /* DPMI Spec: "Fields that are unavailable will hold -1." */
+ if ((long)mem1 == -1L)
+ mem1 = 0;
+ if ((long)mem2 == -1L)
+ mem2 = 0;
+ else
+ mem2 *= 4096;
+ /* Surely, the available memory is at least what we have physically
+ available, right? */
+ if (mem1 >= mem2)
+ freemem = mem1;
+ else
+ freemem = mem2;
+ *freeram = freemem;
+ *totalswap =
+ ((long)info.max_pages_in_paging_file == -1L)
+ ? 0
+ : info.max_pages_in_paging_file * 4096;
+ *totalram =
+ ((long)info.total_physical_pages == -1L)
+ ? (freemem + (unsigned long)sbrk (0) + *totalswap)
+ : info.total_physical_pages * 4096;
+ *freeswap = 0;
+ return 0;
+}
+
+
void
dos_cleanup (void)
{