diff options
author | Eli Zaretskii <eliz@gnu.org> | 2014-07-11 13:09:51 +0300 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2014-07-11 13:09:51 +0300 |
commit | 5f7c30e757680f66be9ef4c399fd1d7ce5b66203 (patch) | |
tree | a7a1c1806020f496dc2948622a6e43b8b06df4cf /src/dosfns.c | |
parent | 8f4fc468ca50120c2218f74555301d68004d8217 (diff) | |
download | emacs-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.c | 42 |
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) { |