From: Alex Rousskov Date: Sun, 19 Dec 2010 03:51:48 +0000 (-0700) Subject: Fixed BodyPipe.cc:144 "!theConsumer" assertion. X-Git-Tag: for-libecap-v0p1~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5a856d1eaac5c82758600b950e0a905e80c2ba31;p=thirdparty%2Fsquid.git Fixed BodyPipe.cc:144 "!theConsumer" assertion. BodySink must hold a pointer to the body pipe it is consuming. Otherwise, the pipe may be deleted before BodySink received the final notification and had a chance to stop consumption, causing the assertion in the pipe destructor. --- diff --git a/src/BodyPipe.cc b/src/BodyPipe.cc index 31922952b1..d503ff46ed 100644 --- a/src/BodyPipe.cc +++ b/src/BodyPipe.cc @@ -10,24 +10,25 @@ CBDATA_CLASS_INIT(BodyPipe); // data from a BodyPipe class BodySink: public BodyConsumer { - bool done; public: - BodySink():AsyncJob("BodySink"), done(false) {} - virtual ~BodySink() {} + BodySink(const BodyPipe::Pointer &bp): AsyncJob("BodySink"), body_pipe(bp) {} + virtual ~BodySink() { assert(!body_pipe); } virtual void noteMoreBodyDataAvailable(BodyPipe::Pointer bp) { size_t contentSize = bp->buf().contentSize(); bp->consume(contentSize); } virtual void noteBodyProductionEnded(BodyPipe::Pointer bp) { - stopConsumingFrom(bp); - done = true; + stopConsumingFrom(body_pipe); } virtual void noteBodyProducerAborted(BodyPipe::Pointer bp) { - stopConsumingFrom(bp); - done = true; + stopConsumingFrom(body_pipe); } - bool doneAll() const {return done && AsyncJob::doneAll();} + bool doneAll() const {return !body_pipe && AsyncJob::doneAll();} + +private: + BodyPipe::Pointer body_pipe; ///< the pipe we are consuming from + CBDATA_CLASS2(BodySink); }; @@ -318,7 +319,7 @@ BodyPipe::startAutoConsumption() { Must(mustAutoConsume); Must(!theConsumer); - theConsumer = new BodySink; + theConsumer = new BodySink(this); debugs(91,7, HERE << "starting auto consumption" << status()); scheduleBodyDataNotification(); }