xref: /plan9/sys/src/cmd/venti/srv/zblock.c (revision 368c31ab13393dea083228fdd1c3445076f83a4b)
1*368c31abSDavid du Colombier #include "stdinc.h"
2*368c31abSDavid du Colombier #include "dat.h"
3*368c31abSDavid du Colombier #include "fns.h"
4*368c31abSDavid du Colombier 
5*368c31abSDavid du Colombier void
fmtzbinit(Fmt * f,ZBlock * b)6*368c31abSDavid du Colombier fmtzbinit(Fmt *f, ZBlock *b)
7*368c31abSDavid du Colombier {
8*368c31abSDavid du Colombier 	memset(f, 0, sizeof *f);
9*368c31abSDavid du Colombier #ifdef PLAN9PORT
10*368c31abSDavid du Colombier 	fmtlocaleinit(f, nil, nil, nil);
11*368c31abSDavid du Colombier #endif
12*368c31abSDavid du Colombier 	f->start = b->data;
13*368c31abSDavid du Colombier 	f->to = f->start;
14*368c31abSDavid du Colombier 	f->stop = (char*)f->start + b->len;
15*368c31abSDavid du Colombier }
16*368c31abSDavid du Colombier 
17*368c31abSDavid du Colombier #define ROUNDUP(p, n) ((void*)(((uintptr)(p)+(n)-1)&~(uintptr)((n)-1)))
18*368c31abSDavid du Colombier 
19*368c31abSDavid du Colombier enum {
20*368c31abSDavid du Colombier 	OverflowCheck = 32
21*368c31abSDavid du Colombier };
22*368c31abSDavid du Colombier static char zmagic[] = "1234567890abcdefghijklmnopqrstuvxyz";
23*368c31abSDavid du Colombier 
24*368c31abSDavid du Colombier ZBlock *
alloczblock(u32int size,int zeroed,uint blocksize)25*368c31abSDavid du Colombier alloczblock(u32int size, int zeroed, uint blocksize)
26*368c31abSDavid du Colombier {
27*368c31abSDavid du Colombier 	uchar *p, *data;
28*368c31abSDavid du Colombier 	ZBlock *b;
29*368c31abSDavid du Colombier 	static ZBlock z;
30*368c31abSDavid du Colombier 	int n;
31*368c31abSDavid du Colombier 
32*368c31abSDavid du Colombier 	if(blocksize == 0)
33*368c31abSDavid du Colombier 		blocksize = 32;	/* try for cache line alignment */
34*368c31abSDavid du Colombier 
35*368c31abSDavid du Colombier 	n = size+OverflowCheck+sizeof(ZBlock)+blocksize+8;
36*368c31abSDavid du Colombier 	p = malloc(n);
37*368c31abSDavid du Colombier 	if(p == nil){
38*368c31abSDavid du Colombier 		seterr(EOk, "out of memory");
39*368c31abSDavid du Colombier 		return nil;
40*368c31abSDavid du Colombier 	}
41*368c31abSDavid du Colombier 
42*368c31abSDavid du Colombier 	data = ROUNDUP(p, blocksize);
43*368c31abSDavid du Colombier 	b = ROUNDUP(data+size+OverflowCheck, 8);
44*368c31abSDavid du Colombier 	if(0) fprint(2, "alloc %p-%p data %p-%p b %p-%p\n",
45*368c31abSDavid du Colombier 		p, p+n, data, data+size, b, b+1);
46*368c31abSDavid du Colombier 	*b = z;
47*368c31abSDavid du Colombier 	b->data = data;
48*368c31abSDavid du Colombier 	b->free = p;
49*368c31abSDavid du Colombier 	b->len = size;
50*368c31abSDavid du Colombier 	b->_size = size;
51*368c31abSDavid du Colombier 	if(zeroed)
52*368c31abSDavid du Colombier 		memset(b->data, 0, size);
53*368c31abSDavid du Colombier 	memmove(b->data+size, zmagic, OverflowCheck);
54*368c31abSDavid du Colombier 	return b;
55*368c31abSDavid du Colombier }
56*368c31abSDavid du Colombier 
57*368c31abSDavid du Colombier void
freezblock(ZBlock * b)58*368c31abSDavid du Colombier freezblock(ZBlock *b)
59*368c31abSDavid du Colombier {
60*368c31abSDavid du Colombier 	if(b){
61*368c31abSDavid du Colombier 		if(memcmp(b->data+b->_size, zmagic, OverflowCheck) != 0)
62*368c31abSDavid du Colombier 			abort();
63*368c31abSDavid du Colombier 		memset(b->data+b->_size, 0, OverflowCheck);
64*368c31abSDavid du Colombier 		free(b->free);
65*368c31abSDavid du Colombier 	}
66*368c31abSDavid du Colombier }
67*368c31abSDavid du Colombier 
68*368c31abSDavid du Colombier ZBlock*
packet2zblock(Packet * p,u32int size)69*368c31abSDavid du Colombier packet2zblock(Packet *p, u32int size)
70*368c31abSDavid du Colombier {
71*368c31abSDavid du Colombier 	ZBlock *b;
72*368c31abSDavid du Colombier 
73*368c31abSDavid du Colombier 	if(p == nil)
74*368c31abSDavid du Colombier 		return nil;
75*368c31abSDavid du Colombier 	b = alloczblock(size, 0, 0);
76*368c31abSDavid du Colombier 	if(b == nil)
77*368c31abSDavid du Colombier 		return nil;
78*368c31abSDavid du Colombier 	if(packetcopy(p, b->data, 0, size) < 0){
79*368c31abSDavid du Colombier 		freezblock(b);
80*368c31abSDavid du Colombier 		return nil;
81*368c31abSDavid du Colombier 	}
82*368c31abSDavid du Colombier 	return b;
83*368c31abSDavid du Colombier }
84*368c31abSDavid du Colombier 
85*368c31abSDavid du Colombier Packet*
zblock2packet(ZBlock * zb,u32int size)86*368c31abSDavid du Colombier zblock2packet(ZBlock *zb, u32int size)
87*368c31abSDavid du Colombier {
88*368c31abSDavid du Colombier 	Packet *p;
89*368c31abSDavid du Colombier 
90*368c31abSDavid du Colombier 	if(zb == nil)
91*368c31abSDavid du Colombier 		return nil;
92*368c31abSDavid du Colombier 	p = packetalloc();
93*368c31abSDavid du Colombier 	packetappend(p, zb->data, size);
94*368c31abSDavid du Colombier 	return p;
95*368c31abSDavid du Colombier }
96*368c31abSDavid du Colombier 
97