From 0f33a01dca1796a4d73eff791a911bb1fb709cc0 Mon Sep 17 00:00:00 2001 From: Amos Jeffries Date: Mon, 27 Apr 2015 07:20:17 -0700 Subject: [PATCH] Make StoreEntry provide Packable interface Preparation for removal of C-style storeAppendPrintf() functions and Packer wrapper class. --- src/Store.h | 17 ++++++----------- src/store.cc | 37 ++++++++++++++++++++++++++++++------- src/tests/stub_store.cc | 3 ++- 3 files changed, 38 insertions(+), 19 deletions(-) diff --git a/src/Store.h b/src/Store.h index 19bc58a282..1464639b68 100644 --- a/src/Store.h +++ b/src/Store.h @@ -9,11 +9,7 @@ #ifndef SQUID_STORE_H #define SQUID_STORE_H -/** - \defgroup StoreAPI Store API - \ingroup FileSystems - */ - +#include "base/Packable.h" #include "base/RefCount.h" #include "comm/forward.h" #include "CommRead.h" @@ -46,10 +42,7 @@ extern StoreIoStats store_io_stats; /// maximum number of entries per cache_dir enum { SwapFilenMax = 0xFFFFFF }; // keep in sync with StoreEntry::swap_filen -/** - \ingroup StoreAPI - */ -class StoreEntry : public hash_link +class StoreEntry : public hash_link, public Packable { public: @@ -190,8 +183,6 @@ public: ESIElement::Pointer cachedESITree; #endif - /** append bytes to the buffer */ - virtual void append(char const *, int len); /** disable sending content to the clients */ virtual void buffer(); /** flush any buffered content */ @@ -222,6 +213,10 @@ public: void kickProducer(); #endif + /* Packable API */ + virtual void append(char const *, int); + virtual void vappendf(const char *, va_list); + protected: void transientsAbandonmentCheck(); diff --git a/src/store.cc b/src/store.cc index ae51d1ec65..334cab3b88 100644 --- a/src/store.cc +++ b/src/store.cc @@ -865,24 +865,47 @@ StoreEntry::append(char const *buf, int len) write(tempBuffer); } +void +StoreEntry::vappendf(const char *fmt, va_list vargs) +{ + LOCAL_ARRAY(char, buf, 4096); + *buf = 0; + int x; + + errno = 0; + if ((x = vsnprintf(buf, sizeof(buf), fmt, vargs)) < 0) { + fatalf( xstrerror(errno)); + return; + } + + if (x < sizeof(buf)) { + append(buf, x); + return; + } + + // okay, do it the slow way. + char *buf2 = new char[x+1]; + int y = vsnprintf(buf2, x+1, fmt, vargs); + assert(y >= 0 && y == x); + append(buf2, y); + delete[] buf2; +} + +// deprecated. use StoreEntry::appendf() instead. void storeAppendPrintf(StoreEntry * e, const char *fmt,...) { va_list args; va_start(args, fmt); - - storeAppendVPrintf(e, fmt, args); + e->vappendf(fmt, args); va_end(args); } -/* used be storeAppendPrintf and Packer */ +// deprecated. use StoreEntry::appendf() instead. void storeAppendVPrintf(StoreEntry * e, const char *fmt, va_list vargs) { - LOCAL_ARRAY(char, buf, 4096); - buf[0] = '\0'; - vsnprintf(buf, 4096, fmt, vargs); - e->append(buf, strlen(buf)); + e->vappendf(fmt, vargs); } struct _store_check_cachable_hist { diff --git a/src/tests/stub_store.cc b/src/tests/stub_store.cc index 3eb734f3bd..6427a80087 100644 --- a/src/tests/stub_store.cc +++ b/src/tests/stub_store.cc @@ -91,7 +91,6 @@ void StoreEntry::setReleaseFlag() STUB //#if USE_SQUID_ESI //ESIElement::Pointer StoreEntry::cachedESITree STUB_RETVAL(NULL) //#endif -void StoreEntry::append(char const *, int len) STUB void StoreEntry::buffer() STUB void StoreEntry::flush() STUB int StoreEntry::unlock(const char *) STUB_RETVAL(0) @@ -100,6 +99,8 @@ int64_t StoreEntry::contentLen() const STUB_RETVAL(0) void StoreEntry::lock(const char *) STUB void StoreEntry::touch() STUB void StoreEntry::release() STUB +void StoreEntry::append(char const *, int) STUB +void StoreEntry::vappendf(const char *, va_list) STUB NullStoreEntry *NullStoreEntry::getInstance() STUB_RETVAL(NULL) const char *NullStoreEntry::getMD5Text() const STUB_RETVAL(NULL) -- 2.47.2