ref: e1720e7817812dea1bb6aea1db30ebb3b58befb6
parent: 383da8d9753c8e215932940215e58b9cc5a0c933
author: Ori Bernstein <ori@eigenstate.org>
date: Tue Dec 5 00:10:28 EST 2023
fs: probe available memory for default cache size
--- a/main.c
+++ b/main.c
@@ -2,6 +2,7 @@
#include <libc.h>
#include <avl.h>
#include <fcall.h>
+#include <bio.h>
#include "dat.h"
#include "fns.h"
@@ -26,6 +27,30 @@
Blk *blkbuf;
void **errctx;
+static uvlong
+memsize(void)
+{+ char *ln, *f[2];
+ vlong mem;
+ Biobuf *bp;
+
+ mem = 512*MiB;
+ if((bp = Bopen("/dev/swap", OREAD)) == nil)+ return mem;
+ while((ln = Brdstr(bp, '\n', 1)) != nil){+ if(tokenize(ln, f, nelem(f)) != 2)
+ continue;
+ if(strcmp(f[1], "memory") == 0){+ mem = strtoll(f[0], 0, 0);
+ free(ln);
+ break;
+ }
+ free(ln);
+ }
+ Bterm(bp);
+ return mem;
+}
+
jmp_buf*
_waserror(void)
{@@ -204,11 +229,14 @@
main(int argc, char **argv)
{int i, srvfd, ctlfd, nann, check;
- char *s, *ann[16];
+ char *s, *e, *ann[16];
+ vlong v, memsz;
Conn *c;
nann = 0;
check = 0;
+ memsz = memsize();
+ cachesz = 25*memsz/100;
ARGBEGIN{case 'a':
if(nann == nelem(ann))
@@ -223,7 +251,20 @@
grow = 1;
break;
case 'm':
- cachesz = strtoll(EARGF(usage()), nil, 0)*MiB;
+ v = strtoll(EARGF(usage()), &e, 0);
+ switch(*e){+ case 'M': case 'm': case 0:
+ cachesz = v*MiB;
+ break;
+ case 'G': case 'g':
+ cachesz = v*GiB;
+ break;
+ case '%':
+ cachesz = v*memsz/100;
+ break;
+ default:
+ sysfatal("unknown suffix %s", e);+ }
break;
case 'd':
debug++;
--
⑨