return of venti
This commit is contained in:
parent
88bb285e3d
commit
a0d146edd7
68 changed files with 14443 additions and 2 deletions
93
src/cmd/venti/srv/zblock.c
Normal file
93
src/cmd/venti/srv/zblock.c
Normal file
|
|
@ -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;
|
||||
}
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue