From f8d08d1db3bc8c10052ef33b097a0b44dba79286 Mon Sep 17 00:00:00 2001 From: Witold Filipczyk Date: Thu, 2 May 2024 14:31:27 +0200 Subject: [PATCH] [osdep] os_get_free_mem_in_mib DOS and Linux implementation. Called in bfu/leds.c --- src/bfu/leds.c | 33 ++------------------------------- src/osdep/dos/dos.c | 12 ++++++++++++ src/osdep/osdep.c | 8 ++++++++ src/osdep/osdep.h | 1 + src/osdep/unix/unix.c | 37 ++++++++++++++++++++++++++++++++++++- 5 files changed, 59 insertions(+), 32 deletions(-) diff --git a/src/bfu/leds.c b/src/bfu/leds.c index 8e2af658..925851c2 100644 --- a/src/bfu/leds.c +++ b/src/bfu/leds.c @@ -21,6 +21,7 @@ #include "intl/libintl.h" #include "main/module.h" #include "main/timer.h" +#include "osdep/osdep.h" #include "session/session.h" #include "terminal/draw.h" #include "terminal/tab.h" @@ -219,45 +220,15 @@ static int draw_show_mem(struct session *ses, int xpos, int ypos, struct color_pair *color) { struct terminal *term = ses->tab->term; - FILE *f; struct string text; int i; int length; char *pos; - long ret = 0; - - f = fopen("/proc/meminfo", "r"); - - if (!f) { - return 0; - } - - while (!feof(f)) { - char buffer[128]; - - if (!fgets(buffer, 127, f)) { - break; - } - if (strncmp(buffer, "MemAvailable:", sizeof("MemAvailable:")-1)) { - continue; - } - if (sscanf(buffer, "MemAvailable:%ld", &ret) < 1) { - ret = 0; - break; - } else { - break; - } - } - fclose(f); - - if (ret < 1) { - return 0; - } if (!init_string(&text)) { return 0; } - add_format_to_string(&text, "[%ld MiB]", ret / 1024); + add_format_to_string(&text, "[%ld MiB]", os_get_free_mem_in_mib()); length = text.length; for (i = 0, pos = text.source; i < length; i++) { draw_char(term, xpos - length + i, ypos, pos[i], 0, color); diff --git a/src/osdep/dos/dos.c b/src/osdep/dos/dos.c index a73f6a14..844a9f65 100644 --- a/src/osdep/dos/dos.c +++ b/src/osdep/dos/dos.c @@ -983,6 +983,18 @@ int dos_select(int n, fd_set *rs, fd_set *ws, fd_set *es, struct timeval *t, int } } +long +os_get_free_mem_in_mib(void) +{ + __dpmi_memory_info buffer; + int ret = __dpmi_get_memory_information(&buffer); + + if (ret) { + return 0; + } + return buffer.total_available_bytes_of_virtual_memory_client / (1024 * 1024); +} + #ifdef DOS_EXTRA_KEYBOARD int dos_setraw(int ctl, int save) diff --git a/src/osdep/osdep.c b/src/osdep/osdep.c index 8e7659a7..66778f01 100644 --- a/src/osdep/osdep.c +++ b/src/osdep/osdep.c @@ -74,6 +74,14 @@ #include "util/string.h" +#if !defined(CONFIG_OS_DOS) && !defined(CONFIG_OS_UNIX) +long +os_get_free_mem_in_mib(void) +{ + return 0; +} +#endif + #ifndef CONFIG_OS_DOS /* Set a file descriptor to non-blocking mode. It returns a non-zero value * on error. */ diff --git a/src/osdep/osdep.h b/src/osdep/osdep.h index 03f83106..18566be6 100644 --- a/src/osdep/osdep.h +++ b/src/osdep/osdep.h @@ -54,6 +54,7 @@ int can_resize_window(int); int can_open_os_shell(int); void set_highpri(void); char *tempname(const char *dir, const char *pfx, char *suff); +long os_get_free_mem_in_mib(void); #ifdef USE_OPEN_PREALLOC int open_prealloc(char *, int, int, off_t); diff --git a/src/osdep/unix/unix.c b/src/osdep/unix/unix.c index e696d56d..3e65849b 100644 --- a/src/osdep/unix/unix.c +++ b/src/osdep/unix/unix.c @@ -6,6 +6,8 @@ #include "osdep/system.h" +#include + #if defined(CONFIG_GPM) && defined(HAVE_GPM_H) #include #endif @@ -155,5 +157,38 @@ resume_mouse(void *h) set_handlers(gms->h, (select_handler_T) gpm_mouse_in, NULL, NULL, gms); } - #endif + +long +os_get_free_mem_in_mib(void) +{ + FILE *f = fopen("/proc/meminfo", "r"); + long ret = 0; + + if (!f) { + return 0; + } + + while (!feof(f)) { + char buffer[128]; + + if (!fgets(buffer, 127, f)) { + break; + } + if (strncmp(buffer, "MemAvailable:", sizeof("MemAvailable:")-1)) { + continue; + } + if (sscanf(buffer, "MemAvailable:%ld", &ret) < 1) { + ret = 0; + break; + } else { + break; + } + } + fclose(f); + + if (ret < 1) { + return 0; + } + return ret / 1024; +}