Here is the patch to obsolete StoreEntryStream from squid.
If any of you want to check it before I push it to HEAD next weekend.

It blocks out the StoreEntryStream class code and test cases, and
replaces all use of the stream with calls to storeAppendPrintf().

I'm not sure if it needs a Changelog entry since this is code new to 3.0 anyway.

Amos
Patch file generated Sun Aug  5 01:03:02 NZST 2007 from
CVS branch bug2000
CVS base branch HEAD
CVS repository: [EMAIL PROTECTED]:/cvsroot/squid
CVS module: squid3

cvs -q rdiff -u -kk -r Z-bug2000_merge_HEAD -r bug2000 squid3
Index: squid3/src/Makefile.am
diff -u squid3/src/Makefile.am:1.122 squid3/src/Makefile.am:1.122.10.1
--- squid3/src/Makefile.am:1.122	Tue Jun 19 15:51:04 2007
+++ squid3/src/Makefile.am	Sat Aug  4 04:14:42 2007
@@ -2121,7 +2121,16 @@
 
 # string needs mem.cc.
 tests_testString_SOURCES= \
+	Mem.h \
 	mem.cc \
+	mem_node.h \
+	mem_node.cc \
+	stmem.cc \
+	MemObject.h \
+	tests/stub_MemObject.cc \
+	tests/stub_comm.cc \
+	tests/stub_store.cc \
+	cbdata.cc \
 	String.cc \
 	tests/testMain.cc \
 	tests/testString.cc \
Index: squid3/src/Mem.h
diff -u squid3/src/Mem.h:1.5 squid3/src/Mem.h:1.5.28.1
--- squid3/src/Mem.h:1.5	Sun May 28 17:50:18 2006
+++ squid3/src/Mem.h	Sat Aug  4 04:14:42 2007
@@ -40,7 +40,7 @@
 
 class CacheManager;
 
-#include <iosfwd>
+class StoreEntry;
 
 class Mem
 {
@@ -50,8 +50,8 @@
     static void RegisterWithCacheManager(CacheManager & manager);
     static void Stats(StoreEntry *);
     static void CleanIdlePools(void *unused);
-    static void Report(std::ostream &);
-    static void PoolReport(const MemPoolStats * mp_st, const MemPoolMeter * AllMeter, std::ostream &);
+    static void Report(StoreEntry *sentry);
+    static void PoolReport(const MemPoolStats * mp_st, const MemPoolMeter * AllMeter, StoreEntry *);
 };
 
 #endif /* SQUID_MEM */
Index: squid3/src/StoreEntryStream.h
diff -u squid3/src/StoreEntryStream.h:1.2 squid3/src/StoreEntryStream.h:1.2.36.2
--- squid3/src/StoreEntryStream.h:1.2	Fri May  5 18:50:22 2006
+++ squid3/src/StoreEntryStream.h	Sat Aug  4 06:02:42 2007
@@ -30,15 +30,16 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
  *
  */
-
 #ifndef SQUID_STORE_ENTRY_STREAM_H
 #define SQUID_STORE_ENTRY_STREAM_H
 
+#if 0 /* obsoleting StoreEntryStream */
+
 #include "Store.h"
 
 #include <ostream>
 
-/*
+/**
  * This class provides a streambuf interface for writing
  * to StoreEntries. Typical use is via a StoreEntryStream
  * rather than direct manipulation
@@ -51,9 +52,7 @@
     StoreEntryStreamBuf(StoreEntry *anEntry) : anEntry(anEntry)
     {
 
-        anEntry->lock()
-
-        ;
+        anEntry->lock();
         anEntry->buffer();
     }
 
@@ -63,7 +62,8 @@
     }
 
 protected:
-    /* flush the current buffer and the character that is overflowing
+    /**
+     * flush the current buffer and the character that is overflowing
      * to the store entry.
      */
     virtual char overflow(char aChar = traits_type::eof())
@@ -127,4 +127,5 @@
     StoreEntryStreamBuf * rdbuf() const { return const_cast<StoreEntryStreamBuf *>(&_buffer); }
 };
 
+#endif
 #endif /* SQUID_STORE_ENTRY_STREAM_H */
Index: squid3/src/mem.cc
diff -u squid3/src/mem.cc:1.38 squid3/src/mem.cc:1.38.12.1
--- squid3/src/mem.cc:1.38	Tue May 22 09:52:04 2007
+++ squid3/src/mem.cc	Sat Aug  4 04:14:42 2007
@@ -34,23 +34,17 @@
  */
 
 #include "squid.h"
-
-#include <iomanip>
-#include <ostream>
-
 #include "event.h"
 #include "CacheManager.h"
 #include "Mem.h"
 #include "memMeter.h"
 #include "Store.h"
-#include "StoreEntryStream.h"
 #include "MemBuf.h"
 #include "SquidTime.h"
 
 /* module globals */
 
 /* local prototypes */
-static void memStringStats(std::ostream &);
 
 /* module locals */
 static MemAllocator *MemPools[MEM_MAX];
@@ -94,66 +88,58 @@
 /* local routines */
 
 static void
-memStringStats(std::ostream &stream)
+memStringStats(StoreEntry *sentry)
 {
     int i;
     int pooled_count = 0;
     size_t pooled_volume = 0;
     /* heading */
-    stream << "String Pool\t Impact\t\t\n \t (%strings)\t (%volume)\n";
+    storeAppendPrintf(sentry,"String Pool\t Impact\t\t\n \t (%%strings)\t (%%volume)\n");
     /* table body */
 
     for (i = 0; i < mem_str_pool_count; i++) {
         const MemAllocator *pool = StrPools[i].pool;
         const int plevel = pool->getMeter().inuse.level;
-        stream << std::setw(20) << std::left << pool->objectType();
-        stream << std::right << "\t " << xpercentInt(plevel, StrCountMeter.level);
-        stream << "\t " << xpercentInt(plevel * pool->objectSize(), StrVolumeMeter.level) << "\n";
+        storeAppendPrintf(sentry," %20s\t %10.0d\t %10.0d\n",
+                          pool->objectType() ,
+                          xpercentInt(plevel, StrCountMeter.level) ,
+                          xpercentInt(plevel * pool->objectSize(), StrVolumeMeter.level) );
         pooled_count += plevel;
         pooled_volume += plevel * pool->objectSize();
     }
 
     /* malloc strings */
-    stream << std::setw(20) << std::left << "Other Strings";
-
-    stream << std::right << "\t ";
-
-    stream << xpercentInt(StrCountMeter.level - pooled_count, StrCountMeter.level) << "\t ";
-
-    stream << xpercentInt(StrVolumeMeter.level - pooled_volume, StrVolumeMeter.level) << "\n\n";
-}
-
-static void
-memBufStats(std::ostream & stream)
-{
-    stream << "Large buffers: " <<
-    HugeBufCountMeter.level << " (" <<
-    HugeBufVolumeMeter.level / 1024 << " KB)\n";
+    storeAppendPrintf(sentry," %20s\t %10.0d\t %10.0d\n\n",
+                      "Other Strings",
+                      xpercentInt(StrCountMeter.level - pooled_count, StrCountMeter.level) ,
+                      xpercentInt(StrVolumeMeter.level - pooled_volume, StrVolumeMeter.level) );
 }
 
 void
 Mem::Stats(StoreEntry * sentry)
 {
-    StoreEntryStream stream(sentry);
-    Report(stream);
-    memStringStats(stream);
-    memBufStats(stream);
+    Report(sentry);
+    memStringStats(sentry);
+
+    storeAppendPrintf(sentry,"Large buffers: %d (%d KB)\n",
+                      HugeBufCountMeter.level,
+                      HugeBufVolumeMeter.level / 1024);
+
 #if WITH_VALGRIND
     if (RUNNING_ON_VALGRIND) {
-	long int leaked = 0, dubious = 0, reachable = 0, suppressed = 0;
-	stream << "Valgrind Report:\n";
-	stream << "Type\tAmount\n";
-       debugs(13, 1, "Asking valgrind for memleaks");
+        long int leaked = 0, dubious = 0, reachable = 0, suppressed = 0;
+        storeAppendPrintf(sentry,"Valgrind Report:\nType\tAmount\n";
+        debugs(13, 1, "Asking valgrind for memleaks");
 	VALGRIND_DO_LEAK_CHECK;
-       debugs(13, 1, "Getting valgrind statistics");
+        debugs(13, 1, "Getting valgrind statistics");
+
 	VALGRIND_COUNT_LEAKS(leaked, dubious, reachable, suppressed);
-	stream << "Leaked\t" << leaked << "\n";
-	stream << "Dubious\t" << dubious << "\n";
-	stream << "Reachable\t" << reachable << "\n";
-	stream << "Suppressed\t" << suppressed << "\n";
+	storeAppendPrintf(sentry,"Leaked\t%d\n", leaked);
+	storeAppendPrintf(sentry,"Dubious\t%d\n", dubious);
+	storeAppendPrintf(sentry,"Reachable\t%d\n", reachable);
+	storeAppendPrintf(sentry,"Suppressed\t%d\n", suppressed);
     }
 #endif
-    stream.flush();
 }
 
 /*
@@ -556,19 +542,19 @@
 /* MemPoolMeter */
 
 void
-Mem::PoolReport(const MemPoolStats * mp_st, const MemPoolMeter * AllMeter, std::ostream &stream)
+Mem::PoolReport(const MemPoolStats * mp_st, const MemPoolMeter * AllMeter, StoreEntry *sentry)
 {
     int excess = 0;
     int needed = 0;
     MemPoolMeter *pm = mp_st->meter;
     const char *delim = "\t ";
 
-    stream << std::setw(20) << std::left << mp_st->label << delim;
-    stream << std::setw(4) << std::right << mp_st->obj_size << delim;
+    storeAppendPrintf(sentry,"%20.20s%s", mp_st->label, delim);
+    storeAppendPrintf(sentry,"%4d%s", mp_st->obj_size, delim);
 
     /* Chunks */
-    stream << std::setw(4) << toKB(mp_st->obj_size * mp_st->chunk_capacity) << delim;
-    stream << std::setw(4) << mp_st->chunk_capacity << delim;
+    storeAppendPrintf(sentry,"%4d%s", toKB(mp_st->obj_size * mp_st->chunk_capacity), delim);
+    storeAppendPrintf(sentry,"%4d%s", mp_st->chunk_capacity, delim);
 
     if (mp_st->chunk_capacity) {
         needed = mp_st->items_inuse / mp_st->chunk_capacity;
@@ -579,11 +565,11 @@
         excess = mp_st->chunks_inuse - needed;
     }
 
-    stream << std::setw(4) << mp_st->chunks_alloc << delim;
-    stream << std::setw(4) << mp_st->chunks_inuse << delim;
-    stream << std::setw(4) << mp_st->chunks_free << delim;
-    stream << std::setw(4) << mp_st->chunks_partial << delim;
-    stream << std::setprecision(3) << xpercent(excess, needed) << delim;
+    storeAppendPrintf(sentry,"%4d%s", mp_st->chunks_alloc, delim);
+    storeAppendPrintf(sentry,"%4d%s", mp_st->chunks_inuse, delim);
+    storeAppendPrintf(sentry,"%4d%s", mp_st->chunks_free, delim);
+    storeAppendPrintf(sentry,"%4d%s", mp_st->chunks_partial, delim);
+    storeAppendPrintf(sentry,"%0.3f%s", xpercent(excess, needed), delim);
     /*
      *  Fragmentation calculation:
      *    needed = inuse.level / chunk_capacity
@@ -593,26 +579,26 @@
      *    Fragm = (alloced - (inuse / obj_ch) ) / alloced
      */
     /* allocated */
-    stream << mp_st->items_alloc << delim;
-    stream << toKB(mp_st->obj_size * pm->alloc.level) << delim;
-    stream << toKB(mp_st->obj_size * pm->alloc.hwater_level) << delim;
-    stream << std::setprecision(2) << ((squid_curtime - pm->alloc.hwater_stamp) / 3600.) << delim;
-    stream << std::setprecision(3) << xpercent(mp_st->obj_size * pm->alloc.level, AllMeter->alloc.level) << delim;
+    storeAppendPrintf(sentry,"%d%s", mp_st->items_alloc, delim);
+    storeAppendPrintf(sentry,"%d%s", toKB(mp_st->obj_size * pm->alloc.level), delim);
+    storeAppendPrintf(sentry,"%d%s", toKB(mp_st->obj_size * pm->alloc.hwater_level), delim);
+    storeAppendPrintf(sentry,"%3f%s", ((squid_curtime - pm->alloc.hwater_stamp) / 3600.), delim);
+    storeAppendPrintf(sentry,"%3f%s", xpercent(mp_st->obj_size * pm->alloc.level, AllMeter->alloc.level), delim);
     /* in use */
-    stream << mp_st->items_inuse << delim;
-    stream << toKB(mp_st->obj_size * pm->inuse.level) << delim;
-    stream << toKB(mp_st->obj_size * pm->inuse.hwater_level) << delim;
-    stream << std::setprecision(2) << ((squid_curtime - pm->inuse.hwater_stamp) / 3600.) << delim;
-    stream << std::setprecision(3) << xpercent(pm->inuse.level, pm->alloc.level) << delim;
+    storeAppendPrintf(sentry,"%d%s", mp_st->items_inuse, delim);
+    storeAppendPrintf(sentry,"%d%s", toKB(mp_st->obj_size * pm->inuse.level), delim);
+    storeAppendPrintf(sentry,"%d%s", toKB(mp_st->obj_size * pm->inuse.hwater_level), delim);
+    storeAppendPrintf(sentry,"%2f%s", ((squid_curtime - pm->inuse.hwater_stamp) / 3600.), delim);
+    storeAppendPrintf(sentry,"%3f%s", xpercent(pm->inuse.level, pm->alloc.level), delim);
     /* idle */
-    stream << mp_st->items_idle << delim;
-    stream << toKB(mp_st->obj_size * pm->idle.level) << delim;
-    stream << toKB(mp_st->obj_size * pm->idle.hwater_level) << delim;
+    storeAppendPrintf(sentry,"%d%s", mp_st->items_idle, delim);
+    storeAppendPrintf(sentry,"%d%s", toKB(mp_st->obj_size * pm->idle.level), delim);
+    storeAppendPrintf(sentry,"%d%s", toKB(mp_st->obj_size * pm->idle.hwater_level), delim);
     /* saved */
-    stream << (int)pm->gb_saved.count << delim;
-    stream << std::setprecision(3) << xpercent(pm->gb_saved.count, AllMeter->gb_saved.count) << delim;
-    stream << std::setprecision(3) << xpercent(pm->gb_saved.bytes, AllMeter->gb_saved.bytes) << delim;
-    stream << std::setprecision(3) << xdiv(pm->gb_saved.count - pm->gb_osaved.count, xm_deltat) << "\n";
+    storeAppendPrintf(sentry,"%d%s", (int)pm->gb_saved.count, delim);
+    storeAppendPrintf(sentry,"%3f%s", xpercent(pm->gb_saved.count, AllMeter->gb_saved.count), delim);
+    storeAppendPrintf(sentry,"%3f%s", xpercent(pm->gb_saved.bytes, AllMeter->gb_saved.bytes), delim);
+    storeAppendPrintf(sentry,"%3f\n", xdiv(pm->gb_saved.count - pm->gb_osaved.count, xm_deltat) );
     pm->gb_osaved.count = pm->gb_saved.count;
 }
 
@@ -648,7 +634,7 @@
 }
 
 void
-Mem::Report(std::ostream &stream)
+Mem::Report(StoreEntry *sentry)
 {
     static char buf[64];
     static MemPoolStats mp_stats;
@@ -658,25 +644,26 @@
     MemAllocator *pool;
 
     /* caption */
-    stream << "Current memory usage:\n";
+    storeAppendPrintf(sentry,"Current memory usage:\n");
     /* heading */
-    stream << "Pool\t Obj Size\t"
-    "Chunks\t\t\t\t\t\t\t"
-    "Allocated\t\t\t\t\t"
-    "In Use\t\t\t\t\t"
-    "Idle\t\t\t"
-    "Allocations Saved\t\t\t"
-    "Hit Rate\t"
-    "\n"
-    " \t (bytes)\t"
-    "KB/ch\t obj/ch\t"
-    "(#)\t used\t free\t part\t %Frag\t "
-    "(#)\t (KB)\t high (KB)\t high (hrs)\t %Tot\t"
-    "(#)\t (KB)\t high (KB)\t high (hrs)\t %alloc\t"
-    "(#)\t (KB)\t high (KB)\t"
-    "(#)\t %cnt\t %vol\t"
-    "(#) / sec\t"
-    "\n";
+    storeAppendPrintf(sentry,
+                      "Pool\t Obj Size\t"
+                      "Chunks\t\t\t\t\t\t\t"
+                      "Allocated\t\t\t\t\t"
+                      "In Use\t\t\t\t\t"
+                      "Idle\t\t\t"
+                      "Allocations Saved\t\t\t"
+                      "Hit Rate\t"
+                      "\n"
+                      " \t (bytes)\t"
+                      "KB/ch\t obj/ch\t"
+                      "(#)\t used\t free\t part\t %%Frag\t "
+                      "(#)\t (KB)\t high (KB)\t high (hrs)\t %%Tot\t"
+                      "(#)\t (KB)\t high (KB)\t high (hrs)\t %%alloc\t"
+                      "(#)\t (KB)\t high (KB)\t"
+                      "(#)\t %%cnt\t %%vol\t"
+                      "(#) / sec\t"
+                      "\n");
     xm_deltat = current_dtime - xm_time;
     xm_time = current_dtime;
 
@@ -706,7 +693,7 @@
     qsort(sortme, npools, sizeof(*sortme), MemPoolReportSorter);
 
     for (int i = 0; i< npools; i++) {
-        PoolReport(&sortme[i], mp_total.TheMeter, stream);
+        PoolReport(&sortme[i], mp_total.TheMeter, sentry);
     }
 
     xfree(sortme);
@@ -726,17 +713,19 @@
     mp_stats.items_idle = mp_total.tot_items_idle;
     mp_stats.overhead = mp_total.tot_overhead;
 
-    PoolReport(&mp_stats, mp_total.TheMeter, stream);
+    PoolReport(&mp_stats, mp_total.TheMeter, sentry);
 
     /* Cumulative */
-    stream << "Cumulative allocated volume: "<< double_to_str(buf, 64, mp_total.TheMeter->gb_saved.bytes) << "\n";
+    storeAppendPrintf(sentry,"Cumulative allocated volume: %s\n",
+                      double_to_str(buf, 64, mp_total.TheMeter->gb_saved.bytes) );
     /* overhead */
-    stream << "Current overhead: " << mp_total.tot_overhead << " bytes (" <<
-    std::setprecision(3) << xpercent(mp_total.tot_overhead, mp_total.TheMeter->inuse.level) << "%)\n";
+    storeAppendPrintf(sentry,"Current overhead: %d bytes (%0.3f%%)\n",
+                      mp_total.tot_overhead,
+                      xpercent(mp_total.tot_overhead, mp_total.TheMeter->inuse.level) );
     /* limits */
-    stream << "Idle pool limit: " << std::setprecision(2) << toMB(mp_total.mem_idle_limit) << " MB\n";
+    storeAppendPrintf(sentry,"Idle pool limit: %0.2f MB\n", toMB(mp_total.mem_idle_limit) );
     /* limits */
-    stream << "Total Pools created: " << mp_total.tot_pools_alloc << "\n";
-    stream << "Pools ever used:     " << mp_total.tot_pools_alloc - not_used << " (shown above)\n";
-    stream << "Currently in use:    " << mp_total.tot_pools_inuse << "\n";
+    storeAppendPrintf(sentry,"Total Pools created: %d", mp_total.tot_pools_alloc );
+    storeAppendPrintf(sentry,"Pools ever used:     %d (shown above)\n", mp_total.tot_pools_alloc - not_used );
+    storeAppendPrintf(sentry,"Currently in use:    %d", mp_total.tot_pools_inuse );
 }
Index: squid3/src/tests/testStoreEntryStream.cc
diff -u squid3/src/tests/testStoreEntryStream.cc:1.5 squid3/src/tests/testStoreEntryStream.cc:1.5.10.2
--- squid3/src/tests/testStoreEntryStream.cc:1.5	Tue May 29 06:51:53 2007
+++ squid3/src/tests/testStoreEntryStream.cc	Sat Aug  4 06:02:43 2007
@@ -1,3 +1,6 @@
+
+#if 0 /* obsolete StoreEntryStream */
+
 #include "squid.h"
 #include "Mem.h"
 #include "testStore.h"
@@ -31,16 +34,18 @@
         StoreEntryStream stream(anEntry);
         CPPUNIT_ASSERT_EQUAL(1, anEntry->_buffer_calls);
         CPPUNIT_ASSERT_EQUAL(0, anEntry->_flush_calls);
-        stream << "some text" << std::setw(4) << "!";
+        stream << "some text" << std::setw(4) << 2 << std::setw(2) << "!";
         CPPUNIT_ASSERT_EQUAL(1, anEntry->_buffer_calls);
         CPPUNIT_ASSERT_EQUAL(0, anEntry->_flush_calls);
         stream.flush();
         CPPUNIT_ASSERT_EQUAL(1, anEntry->_buffer_calls);
         CPPUNIT_ASSERT_EQUAL(1, anEntry->_flush_calls);
-        CPPUNIT_ASSERT_EQUAL(String("some text   !"), anEntry->_appended_text);
+        CPPUNIT_ASSERT_EQUAL(String("some text   2 !"), anEntry->_appended_text);
     }
 
     delete anEntry;
 
     Store::Root(NULL);
 }
+
+#endif
Index: squid3/src/tests/testStoreEntryStream.h
diff -u squid3/src/tests/testStoreEntryStream.h:1.2 squid3/src/tests/testStoreEntryStream.h:1.2.12.2
--- squid3/src/tests/testStoreEntryStream.h:1.2	Wed May 23 14:51:22 2007
+++ squid3/src/tests/testStoreEntryStream.h	Sat Aug  4 06:02:43 2007
@@ -2,6 +2,8 @@
 #ifndef SQUID_SRC_TEST_STORE_ENTRY_STREAM_H
 #define SQUID_SRC_TEST_STORE_ENTRY_STREAM_H
 
+#if 0 /* obsolete StoreEntryStream */
+
 #include <cppunit/extensions/HelperMacros.h>
 
 /*
@@ -23,3 +25,4 @@
 
 #endif
 
+#endif

Reply via email to