X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=ucw%2Ffastbuf.c;h=ac6eaea7272b44676ec37d0e55cba1181541d2b6;hb=5de81f1debc4341fb3af4e756b0a18e196d5ba13;hp=4068aab89adef2e30868530da34ea70686d5e1b5;hpb=c41d616c80443a7755eab3e9135ae618427e5407;p=libucw.git diff --git a/ucw/fastbuf.c b/ucw/fastbuf.c index 4068aab8..ac6eaea7 100644 --- a/ucw/fastbuf.c +++ b/ucw/fastbuf.c @@ -9,11 +9,11 @@ #undef LOCAL_DEBUG -#include "ucw/lib.h" -#include "ucw/fastbuf.h" -#include "ucw/respool.h" -#include "ucw/trans.h" -#include "ucw/stkstring.h" +#include +#include +#include +#include +#include #include #include @@ -23,11 +23,7 @@ void bclose(struct fastbuf *f) if (f) { bflush(f); - if (f->res) - { - res_drop(f->res); - f->res = NULL; - } + res_detach(f->res); DBG("FB: closing", f); if (f->close) f->close(f); /* Should always free all internal resources, even if it throws an exception */ @@ -36,15 +32,17 @@ void bclose(struct fastbuf *f) void NONRET bthrow(struct fastbuf *f, const char *id, const char *fmt, ...) { + DBG("FB: throwing %s", full_id); + char full_id[16]; + snprintf(full_id, sizeof(full_id), "ucw.fb.%s", id); ASSERT(!(f->flags & FB_DEAD)); /* Only one bthrow() is allowed before bclose() */ - DBG("FB: throwing %s", id); va_list args; va_start(args, fmt); if (!f->res) die("Fastbuf %s error: %s", f->name ? : "", stk_vprintf(fmt, args)); f->flags |= FB_DEAD; f->bptr = f->bstop = f->bufend; /* Reset the buffer to guard consecutive seek/read/write */ - trans_vthrow(id, f, fmt, args); + trans_vthrow(full_id, f, fmt, args); } int brefill(struct fastbuf *f, int allow_eof) @@ -52,7 +50,7 @@ int brefill(struct fastbuf *f, int allow_eof) DBG("FB: refill"); ASSERT(!(f->flags & FB_DEAD) && f->buffer <= f->bstop && f->bstop <= f->bptr && f->bptr <= f->bufend); if (!f->refill) - bthrow(f, "fb.read", "Stream not readable"); + bthrow(f, "read", "Stream not readable"); if (f->refill(f)) { ASSERT(f->buffer <= f->bptr && f->bptr < f->bstop && f->bstop <= f->bufend); @@ -62,7 +60,7 @@ int brefill(struct fastbuf *f, int allow_eof) { ASSERT(f->buffer <= f->bptr && f->bptr == f->bstop && f->bstop <= f->bufend); if (!allow_eof && (f->flags & FB_DIE_ON_EOF)) - bthrow(f, "fb.eof", "Unexpected EOF"); + bthrow(f, "eof", "Unexpected EOF"); return 0; } } @@ -72,7 +70,7 @@ static void do_spout(struct fastbuf *f) DBG("FB: spout"); ASSERT(!(f->flags & FB_DEAD) && f->buffer <= f->bstop && f->bstop <= f->bptr && f->bptr <= f->bufend); /* Check write mode possibly with unflushed data */ if (!f->spout) - bthrow(f, "fb.write", "Stream not writeable"); + bthrow(f, "write", "Stream not writeable"); f->spout(f); ASSERT(f->buffer <= f->bstop && f->bstop <= f->bptr && f->bptr <= f->bufend); } @@ -101,7 +99,7 @@ static void do_seek(struct fastbuf *f, ucw_off_t pos, int whence) bflush(f); DBG("FB: seeking to pos=%lld whence=%d %p %p %p %p", (long long)pos, whence, f->buffer, f->bstop, f->bptr, f->bufend); if (!f->seek || !f->seek(f, pos, whence)) - bthrow(f, "fb.seek", "Stream not seekable"); + bthrow(f, "seek", "Stream not seekable"); DBG("FB: seeked %p %p %p %p", f->buffer, f->bstop, f->bptr, f->bufend); ASSERT(f->buffer <= f->bstop && f->bstop <= f->bptr && f->bptr <= f->bufend); if (whence == SEEK_SET) @@ -118,7 +116,7 @@ inline void bsetpos(struct fastbuf *f, ucw_off_t pos) else if (pos != btell(f)) { if (pos < 0) - bthrow(f, "fb.seek", "Seek out of range"); + bthrow(f, "seek", "Seek out of range"); do_seek(f, pos, SEEK_SET); } } @@ -135,7 +133,7 @@ void bseek(struct fastbuf *f, ucw_off_t pos, int whence) break; case SEEK_END: if (pos > 0) - bthrow(f, "fb.seek", "Seek out of range"); + bthrow(f, "seek", "Seek out of range"); do_seek(f, pos, SEEK_END); break; default: @@ -196,7 +194,7 @@ uns bread_slow(struct fastbuf *f, void *b, uns l, uns check) total += k; } if (check && total && l) - bthrow(f, "fb.read", "breadb: short read"); + bthrow(f, "eof", "breadb: short read"); return total; } @@ -232,7 +230,7 @@ void bbcopy_slow(struct fastbuf *f, struct fastbuf *t, uns l) { if (l == ~0U) return; - bthrow(f, "fb.read", "bbcopy: source exhausted"); + bthrow(f, "eof", "bbcopy: source exhausted"); } tavail = bdirect_write_prepare(t, &tptr); n = MIN(l, favail);