aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/venti/srv/zblock.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2005-07-12 15:23:36 +0000
committerrsc <devnull@localhost>2005-07-12 15:23:36 +0000
commita0d146edd7a7de6236a0d60baafeeb59f8452aae (patch)
treeb55baa526d9f5adfc73246e6ee2fadf455e0b7a2 /src/cmd/venti/srv/zblock.c
parent88bb285e3d87ec2508840af33f7e0af53ec3c13c (diff)
downloadplan9port-a0d146edd7a7de6236a0d60baafeeb59f8452aae.tar.gz
plan9port-a0d146edd7a7de6236a0d60baafeeb59f8452aae.tar.bz2
plan9port-a0d146edd7a7de6236a0d60baafeeb59f8452aae.zip
return of venti
Diffstat (limited to 'src/cmd/venti/srv/zblock.c')
-rw-r--r--src/cmd/venti/srv/zblock.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/cmd/venti/srv/zblock.c b/src/cmd/venti/srv/zblock.c
new file mode 100644
index 00000000..b33cdd25
--- /dev/null
+++ b/src/cmd/venti/srv/zblock.c
@@ -0,0 +1,93 @@
+#include "stdinc.h"
+#include "dat.h"
+#include "fns.h"
+
+void
+fmtzbinit(Fmt *f, ZBlock *b)
+{
+ f->runes = 0;
+ f->start = b->data;
+ f->to = f->start;
+ f->stop = (char*)f->start + b->len;
+ f->flush = nil;
+ f->farg = nil;
+ f->nfmt = 0;
+}
+
+#define ROUNDUP(p, n) ((void*)(((ulong)(p)+(n)-1)&~(ulong)((n)-1)))
+
+static char zmagic[] = "1234567890abcdefghijkl";
+
+ZBlock *
+alloczblock(u32int size, int zeroed, uint blocksize)
+{
+ uchar *p, *data;
+ ZBlock *b;
+ static ZBlock z;
+ int n;
+
+ if(blocksize == 0)
+ blocksize = 32; /* try for cache line alignment */
+
+ n = size+32/*XXX*/+sizeof(ZBlock)+blocksize+8;
+ p = malloc(n);
+ if(p == nil){
+ seterr(EOk, "out of memory");
+ return nil;
+ }
+
+ data = ROUNDUP(p, blocksize);
+ b = ROUNDUP(data+size+32/*XXX*/, 8);
+ if(0) fprint(2, "alloc %p-%p data %p-%p b %p-%p\n",
+ p, p+n, data, data+size, b, b+1);
+ *b = z;
+ b->data = data;
+ b->free = p;
+ b->len = size;
+ b->_size = size;
+ if(zeroed)
+ memset(b->data, 0, size);
+ memmove(b->data+size, zmagic, 32/*XXX*/);
+ return b;
+}
+
+void
+freezblock(ZBlock *b)
+{
+ if(b){
+ if(memcmp(b->data+b->_size, zmagic, 32) != 0)
+ abort();
+ memset(b->data+b->_size, 0, 32);
+ free(b->free);
+ }
+}
+
+ZBlock*
+packet2zblock(Packet *p, u32int size)
+{
+ ZBlock *b;
+
+ if(p == nil)
+ return nil;
+ b = alloczblock(size, 0, 0);
+ if(b == nil)
+ return nil;
+ if(packetcopy(p, b->data, 0, size) < 0){
+ freezblock(b);
+ return nil;
+ }
+ return b;
+}
+
+Packet*
+zblock2packet(ZBlock *zb, u32int size)
+{
+ Packet *p;
+
+ if(zb == nil)
+ return nil;
+ p = packetalloc();
+ packetappend(p, zb->data, size);
+ return p;
+}
+