summaryrefslogtreecommitdiff
path: root/kernel/stats.c
diff options
context:
space:
mode:
authorSanjit Bhat <[email protected]>2023-10-30 14:39:28 -0500
committerSanjit Bhat <[email protected]>2023-10-30 14:39:28 -0500
commit3808f903625f42f58aa95e43e3caca3efaa4d118 (patch)
treead8f5a0e376c246cb60c7cd0940517ea834e610e /kernel/stats.c
parent74c1eba516fdb0ec1a17b16be7e76613ccba92bf (diff)
downloadxv6-labs-3808f903625f42f58aa95e43e3caca3efaa4d118.tar.gz
xv6-labs-3808f903625f42f58aa95e43e3caca3efaa4d118.tar.bz2
xv6-labs-3808f903625f42f58aa95e43e3caca3efaa4d118.zip
lock: release lab
Diffstat (limited to 'kernel/stats.c')
-rw-r--r--kernel/stats.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/kernel/stats.c b/kernel/stats.c
new file mode 100644
index 0000000..9659bb9
--- /dev/null
+++ b/kernel/stats.c
@@ -0,0 +1,69 @@
+#include <stdarg.h>
+
+#include "types.h"
+#include "param.h"
+#include "spinlock.h"
+#include "sleeplock.h"
+#include "fs.h"
+#include "file.h"
+#include "riscv.h"
+#include "defs.h"
+
+#define BUFSZ 4096
+static struct {
+ struct spinlock lock;
+ char buf[BUFSZ];
+ int sz;
+ int off;
+} stats;
+
+int statscopyin(char*, int);
+int statslock(char*, int);
+
+int
+statswrite(int user_src, uint64 src, int n)
+{
+ return -1;
+}
+
+int
+statsread(int user_dst, uint64 dst, int n)
+{
+ int m;
+
+ acquire(&stats.lock);
+
+ if(stats.sz == 0) {
+#ifdef LAB_PGTBL
+ stats.sz = statscopyin(stats.buf, BUFSZ);
+#endif
+#ifdef LAB_LOCK
+ stats.sz = statslock(stats.buf, BUFSZ);
+#endif
+ }
+ m = stats.sz - stats.off;
+
+ if (m > 0) {
+ if(m > n)
+ m = n;
+ if(either_copyout(user_dst, dst, stats.buf+stats.off, m) != -1) {
+ stats.off += m;
+ }
+ } else {
+ m = -1;
+ stats.sz = 0;
+ stats.off = 0;
+ }
+ release(&stats.lock);
+ return m;
+}
+
+void
+statsinit(void)
+{
+ initlock(&stats.lock, "stats");
+
+ devsw[STATS].read = statsread;
+ devsw[STATS].write = statswrite;
+}
+