Browse Source
Separate rbuf and wbuf so that log.c can use it. Check in a perliminary version of log.c
Separate rbuf and wbuf so that log.c can use it. Check in a perliminary version of log.c
git-svn-id: file:///svn/tokudb@162 c7de825b-a66e-492c-adef-691d508d4ae1pull/73/head
8 changed files with 155 additions and 89 deletions
-
2newbrt/Makefile
-
2newbrt/brt-internal.h
-
2newbrt/brt-serialize-test.c
-
96newbrt/brt-serialize.c
-
3newbrt/brt.c
-
34newbrt/log.c
-
42newbrt/rbuf.h
-
63newbrt/wbuf.h
@ -0,0 +1,42 @@ |
|||
#ifndef RBUF_H |
|||
#define RBUF_H |
|||
|
|||
#include <assert.h> |
|||
|
|||
struct rbuf { |
|||
unsigned char *buf; |
|||
unsigned int size; |
|||
unsigned int ndone; |
|||
}; |
|||
|
|||
static unsigned int rbuf_char (struct rbuf *r) { |
|||
assert(r->ndone<r->size); |
|||
return r->buf[r->ndone++]; |
|||
} |
|||
|
|||
static unsigned int rbuf_int (struct rbuf *r) { |
|||
unsigned char c0 = rbuf_char(r); |
|||
unsigned char c1 = rbuf_char(r); |
|||
unsigned char c2 = rbuf_char(r); |
|||
unsigned char c3 = rbuf_char(r); |
|||
return ((c0<<24)| |
|||
(c1<<16)| |
|||
(c2<<8)| |
|||
(c3<<0)); |
|||
} |
|||
|
|||
/* Return a pointer into the middle of the buffer. */ |
|||
static void rbuf_bytes (struct rbuf *r, bytevec *bytes, unsigned int *n_bytes) |
|||
{ |
|||
*n_bytes = rbuf_int(r); |
|||
*bytes = &r->buf[r->ndone]; |
|||
r->ndone+=*n_bytes; |
|||
assert(r->ndone<=r->size); |
|||
} |
|||
|
|||
static diskoff rbuf_diskoff (struct rbuf *r) { |
|||
unsigned i0 = rbuf_int(r); |
|||
unsigned i1 = rbuf_int(r); |
|||
return ((unsigned long long)(i0)<<32) | ((unsigned long long)(i1)); |
|||
} |
|||
#endif |
|||
@ -0,0 +1,63 @@ |
|||
#ifndef WBUF_H |
|||
#define WBUF_H |
|||
|
|||
#include <assert.h> |
|||
#include <string.h> |
|||
#include <errno.h> |
|||
|
|||
/* When serializing a value, write it into a buffer. */ |
|||
/* This code requires that the buffer be big enough to hold whatever you put into it. */ |
|||
/* This abstraction doesn't do a good job of hiding its internals. |
|||
* Why? The performance of this code is important, and we want to inline stuff */ |
|||
struct wbuf { |
|||
unsigned char *buf; |
|||
unsigned int size; |
|||
unsigned int ndone; |
|||
}; |
|||
|
|||
static int wbuf_init (struct wbuf *w, diskoff size) { |
|||
w->buf=toku_malloc(size); |
|||
w->size=size; |
|||
w->ndone=0; |
|||
return errno; |
|||
} |
|||
|
|||
/* Write a character. */ |
|||
static inline void wbuf_char (struct wbuf *w, int ch) { |
|||
assert(w->ndone<w->size); |
|||
w->buf[w->ndone++]=ch; |
|||
} |
|||
|
|||
static void wbuf_int (struct wbuf *w, unsigned int i) { |
|||
#if 0 |
|||
wbuf_char(w, i>>24); |
|||
wbuf_char(w, i>>16); |
|||
wbuf_char(w, i>>8); |
|||
wbuf_char(w, i>>0); |
|||
#else |
|||
assert(w->ndone + 4 <= w->size); |
|||
w->buf[w->ndone+0] = i>>24; |
|||
w->buf[w->ndone+1] = i>>16; |
|||
w->buf[w->ndone+2] = i>>8; |
|||
w->buf[w->ndone+3] = i>>0; |
|||
w->ndone += 4; |
|||
#endif |
|||
} |
|||
|
|||
static void wbuf_bytes (struct wbuf *w, bytevec bytes_bv, int nbytes) { |
|||
const unsigned char *bytes=bytes_bv; |
|||
wbuf_int(w, nbytes); |
|||
#if 0 |
|||
{ int i; for (i=0; i<nbytes; i++) wbuf_char(w, bytes[i]); } |
|||
#else |
|||
assert(w->ndone + nbytes <= w->size); |
|||
memcpy(w->buf + w->ndone, bytes, nbytes); |
|||
w->ndone += nbytes; |
|||
#endif |
|||
} |
|||
|
|||
static void wbuf_diskoff (struct wbuf *w, diskoff off) { |
|||
wbuf_int(w, off>>32); |
|||
wbuf_int(w, off&0xFFFFFFFF); |
|||
} |
|||
#endif |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue