aboutsummaryrefslogtreecommitdiff
path: root/src/base/mem
diff options
context:
space:
mode:
authorNicholas <nbnoll@eml.cc>2021-11-20 20:12:21 -0800
committerNicholas <nbnoll@eml.cc>2021-11-20 20:12:21 -0800
commit138fb272fae79587de3469493b55e4d18eadc722 (patch)
tree447d2af80b8c2ea080253e76d33e128c9b27d3f6 /src/base/mem
parentc9a32c1a43d2bdded07eaa45732c3a6e195a5442 (diff)
Feat: added buffered io from plan9
As we no longer have the FILE type, we need to buffer our reading and writing so that we don't have to make so many syscalls. The API is nice so that we can buffer other readers. We will update it so that it eats io·Readers/io·Writers.
Diffstat (limited to 'src/base/mem')
-rw-r--r--src/base/mem/arena.c9
-rw-r--r--src/base/mem/copy.c14
-rw-r--r--src/base/mem/findc.c14
-rw-r--r--src/base/mem/move.c22
-rw-r--r--src/base/mem/rules.mk3
-rw-r--r--src/base/mem/set.c12
-rw-r--r--src/base/mem/set64.c4
7 files changed, 71 insertions, 7 deletions
diff --git a/src/base/mem/arena.c b/src/base/mem/arena.c
index b2ce044..37e7b56 100644
--- a/src/base/mem/arena.c
+++ b/src/base/mem/arena.c
@@ -25,15 +25,13 @@ struct mem·Arena
struct Block first;
};
-static
-void*
+static void*
·arenaalloc(void *heap, uint n, ulong size)
{
return mem·arenaalloc(heap, n, size);
}
-static
-void
+static void
·arenafree(void *heap, void *ptr)
{
/* no-op */
@@ -45,8 +43,7 @@ mem·Allocator mem·ArenaAllocator = {
};
-static
-void
+static void
grow(mem·Arena *a, vlong min)
{
uintptr size;
diff --git a/src/base/mem/copy.c b/src/base/mem/copy.c
new file mode 100644
index 0000000..5ce4f90
--- /dev/null
+++ b/src/base/mem/copy.c
@@ -0,0 +1,14 @@
+#include "internal.h"
+
+int
+mem·copy(void *dst, void *src, uintptr len)
+{
+ char *d, *s;
+ if((long)len < 0)
+ return 1;
+
+ d=dst, s=src;
+ while(len-- > 0)
+ *d++ = *s++;
+ return 0;
+}
diff --git a/src/base/mem/findc.c b/src/base/mem/findc.c
new file mode 100644
index 0000000..d3215c5
--- /dev/null
+++ b/src/base/mem/findc.c
@@ -0,0 +1,14 @@
+#include "internal.h"
+
+void *
+mem·findc(void *addr, uintptr len, int c)
+{
+ uchar *a = addr;
+
+ c &= 0xFF;
+ while(len-- > 0){
+ if(*a++ == c)
+ return a-1;
+ }
+ return nil;
+}
diff --git a/src/base/mem/move.c b/src/base/mem/move.c
new file mode 100644
index 0000000..5ad4074
--- /dev/null
+++ b/src/base/mem/move.c
@@ -0,0 +1,22 @@
+#include "internal.h"
+
+int
+mem·move(void *dst, void *src, uintptr len)
+{
+ char *d, *s;
+ if((long)len < 0)
+ return 1;
+
+ d=dst, s=src;
+ if((s < d) && (s+len > d))
+ goto aliased;
+ while(len-- > 0)
+ *d++ = *s++;
+ return 0;
+
+aliased:
+ d+=len, s+=len;
+ while(len-- > 0)
+ *--d = *--s;
+ return 0;
+}
diff --git a/src/base/mem/rules.mk b/src/base/mem/rules.mk
index b912d0c..fda54e1 100644
--- a/src/base/mem/rules.mk
+++ b/src/base/mem/rules.mk
@@ -2,4 +2,7 @@ SRCS_$(d)+=\
$(d)/mem/arena.c\
$(d)/mem/buffer.c\
$(d)/mem/interface.c\
+ $(d)/mem/set.c\
$(d)/mem/set64.c\
+ $(d)/mem/copy.c\
+ $(d)/mem/move.c
diff --git a/src/base/mem/set.c b/src/base/mem/set.c
new file mode 100644
index 0000000..2e296be
--- /dev/null
+++ b/src/base/mem/set.c
@@ -0,0 +1,12 @@
+#include "internal.h"
+
+int
+mem·set(void *addr, int c, uintptr len)
+{
+ char *a = addr;
+
+ while(len-- > 0)
+ *a++ = c;
+
+ return 0;
+}
diff --git a/src/base/mem/set64.c b/src/base/mem/set64.c
index 464b3ad..7000866 100644
--- a/src/base/mem/set64.c
+++ b/src/base/mem/set64.c
@@ -1,6 +1,6 @@
#include "internal.h"
-void
+int
mem·set64(void *dst, uint64 val, uintptr size)
{
intptr i;
@@ -10,4 +10,6 @@ mem·set64(void *dst, uint64 val, uintptr size)
for(; i < size; i++)
((byte*)dst)[i] = ((byte*)&val)[i&7];
+
+ return 0;
}