X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Ffastbuf.h;h=b5aa567ebb72dc0213c5fb67f3b041c2fa2dc12f;hb=e34560a76a7af3fb428604e4da3cd14cfd1bf454;hp=bc7ef7eb7e492e2d3d1d25cf1fbcb9e299f0d658;hpb=e3f62ad82e2b88c52c34dcf6b769ba517e7e57f9;p=libucw.git diff --git a/lib/fastbuf.h b/lib/fastbuf.h index bc7ef7eb..b5aa567e 100644 --- a/lib/fastbuf.h +++ b/lib/fastbuf.h @@ -19,7 +19,6 @@ #include #include "lib/unaligned.h" -#include "lib/bbuf.h" /* * Generic buffered I/O. You supply hooks to be called for low-level operations @@ -89,6 +88,9 @@ struct fastbuf *bfdopen(int fd, uns buflen); struct fastbuf *bfdopen_shared(int fd, uns buflen); void bfilesync(struct fastbuf *b); +#define TEMP_FILE_NAME_LEN 256 +void temp_file_name(byte *name); + /* FastIO on in-memory streams */ struct fastbuf *fbmem_create(unsigned blocksize); /* Create stream and return its writing fastbuf */ @@ -98,6 +100,14 @@ struct fastbuf *fbmem_clone_read(struct fastbuf *); /* Create reading fastbuf */ struct fastbuf *bopen_mm(byte *name, uns mode); +/* FastIO on files opened with O_DIRECT (see fb-direct.c for description) */ + +struct asio_queue; +struct fastbuf *fbdir_open(byte *name, uns mode, struct asio_queue *io_queue); +struct fastbuf *fbdir_open_try(byte *name, uns mode, struct asio_queue *io_queue); +struct fastbuf *fbdir_open_fd(int fd, struct asio_queue *io_queue); +struct fastbuf *fbdir_open_tmp(struct asio_queue *io_queue); + /* FastI on file descriptors with limit */ struct fastbuf *bopen_limited_fd(int fd, uns bufsize, uns limit); @@ -118,6 +128,26 @@ struct fastbuf *fbgrow_create(unsigned basic_size); void fbgrow_reset(struct fastbuf *b); /* Reset stream and prepare for writing */ void fbgrow_rewind(struct fastbuf *b); /* Prepare for reading */ +/* FastO with atomic writes for multi-threaded programs */ + +struct fb_atomic { + struct fastbuf fb; + struct fb_atomic_file *af; + byte *expected_max_bptr; + uns slack_size; +}; +#define FB_ATOMIC(f) ((struct fb_atomic *)(f)->is_fastbuf) + +struct fastbuf *fbatomic_open(byte *name, struct fastbuf *master, uns bufsize, int record_len); +void fbatomic_internal_write(struct fastbuf *b); + +static inline void +fbatomic_commit(struct fastbuf *b) +{ + if (b->bptr >= ((struct fb_atomic *)b)->expected_max_bptr) + fbatomic_internal_write(b); +} + /* Configuring stream parameters */ int bconfig(struct fastbuf *f, uns type, int data); @@ -322,11 +352,18 @@ int bgets_nodie(struct fastbuf *f, byte *b, uns l); byte *bgets0(struct fastbuf *f, byte *b, uns l); struct mempool; -uns bgets_bb(struct fastbuf *f, bb_t *b); -byte *bgets_mp(struct mempool *mp, struct fastbuf *f); -int bgets_stk_step(struct fastbuf *f, byte *old_buf, byte *buf, uns len); -#define bgets_stk(f) ({ struct fastbuf *_fb = (f); uns _l = 256; byte *_b, *_p = NULL; \ - while (bgets_stk_step(_fb, _p, _b = alloca(_l), _l)) _p = _b, _l *= 2; _b; }) +struct bb_t; +uns bgets_bb(struct fastbuf *f, struct bb_t *b, uns limit); +byte *bgets_mp(struct fastbuf *f, struct mempool *mp); + +struct bgets_stk_struct { + struct fastbuf *f; + byte *old_buf, *cur_buf, *src; + uns old_len, cur_len, src_len; +}; +void bgets_stk_init(struct bgets_stk_struct *s); +void bgets_stk_step(struct bgets_stk_struct *s); +#define bgets_stk(fb) ({ struct bgets_stk_struct _s; _s.f = (fb); for (bgets_stk_init(&_s); _s.cur_len; _s.cur_buf = alloca(_s.cur_len), bgets_stk_step(&_s)); _s.cur_buf; }) static inline void bputs(struct fastbuf *f, byte *b) @@ -373,7 +410,7 @@ static inline int bskip(struct fastbuf *f, uns len) return bskip_slow(f, len); } -/* I/O on addr_int_t */ +/* I/O on uintptr_t */ #ifdef CPU_64BIT_POINTERS #define bputa(x,p) bputq(x,p)