You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2007/12/06 19:22:21 UTC

svn commit: r601803 - in /incubator/qpid/trunk/qpid/cpp/src: qpid/broker/DtxManager.cpp qpid/broker/DtxTimeout.h qpid/broker/DtxWorkRecord.h qpid/broker/Timer.cpp qpid/broker/Timer.h qpid/management/ManagementAgent.cpp tests/TimerTest.cpp

Author: aconway
Date: Thu Dec  6 10:22:17 2007
New Revision: 601803

URL: http://svn.apache.org/viewvc?rev=601803&view=rev
Log:

Removed redundant TimerA, use intrusive_ptr for Timer.

Modified:
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/DtxManager.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/DtxTimeout.h
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/DtxWorkRecord.h
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Timer.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Timer.h
    incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.cpp
    incubator/qpid/trunk/qpid/cpp/src/tests/TimerTest.cpp

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/DtxManager.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/DtxManager.cpp?rev=601803&r1=601802&r2=601803&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/DtxManager.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/DtxManager.cpp Thu Dec  6 10:22:17 2007
@@ -119,12 +119,12 @@
 void DtxManager::setTimeout(const std::string& xid, uint32_t secs)
 {
     DtxWorkRecord* record = getWork(xid);
-    DtxTimeout::shared_ptr timeout = record->getTimeout();
+    intrusive_ptr<DtxTimeout> timeout = record->getTimeout();
     if (timeout.get()) {
         if (timeout->timeout == secs) return;//no need to do anything further if timeout hasn't changed
         timeout->cancelled = true;
     }
-    timeout = DtxTimeout::shared_ptr(new DtxTimeout(secs, *this, xid));
+    timeout = intrusive_ptr<DtxTimeout>(new DtxTimeout(secs, *this, xid));
     record->setTimeout(timeout);
     timer.add(boost::static_pointer_cast<TimerTask>(timeout));
     
@@ -132,7 +132,7 @@
 
 uint32_t DtxManager::getTimeout(const std::string& xid)
 {
-    DtxTimeout::shared_ptr timeout = getWork(xid)->getTimeout();
+    intrusive_ptr<DtxTimeout> timeout = getWork(xid)->getTimeout();
     return !timeout ? 0 : timeout->timeout;
 }
 
@@ -145,7 +145,7 @@
     } else {
         get_pointer(i)->timedout();
         //TODO: do we want to have a timed task to cleanup, or can we rely on an explicit completion?
-        //timer.add(TimerTask::shared_ptr(new DtxCleanup(60*30/*30 mins*/, *this, xid)));
+        //timer.add(intrusive_ptr<TimerTask>(new DtxCleanup(60*30/*30 mins*/, *this, xid)));
     }
 }
 

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/DtxTimeout.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/DtxTimeout.h?rev=601803&r1=601802&r2=601803&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/DtxTimeout.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/DtxTimeout.h Thu Dec  6 10:22:17 2007
@@ -33,7 +33,6 @@
 
 struct DtxTimeout : public TimerTask
 {
-    typedef boost::shared_ptr<DtxTimeout> shared_ptr;
     const uint32_t timeout;
     DtxManager& mgr;
     const std::string xid;

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/DtxWorkRecord.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/DtxWorkRecord.h?rev=601803&r1=601802&r2=601803&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/DtxWorkRecord.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/DtxWorkRecord.h Thu Dec  6 10:22:17 2007
@@ -48,7 +48,7 @@
     bool rolledback;
     bool prepared;
     bool expired;
-    DtxTimeout::shared_ptr timeout;
+    intrusive_ptr<DtxTimeout> timeout;
     Work work;
     std::auto_ptr<TPCTransactionContext> txn;
     qpid::sys::Mutex lock;
@@ -65,8 +65,8 @@
     void add(DtxBuffer::shared_ptr ops);
     void recover(std::auto_ptr<TPCTransactionContext> txn, DtxBuffer::shared_ptr ops);
     void timedout();
-    void setTimeout(DtxTimeout::shared_ptr t) { timeout = t; }
-    DtxTimeout::shared_ptr getTimeout() { return timeout; }
+    void setTimeout(intrusive_ptr<DtxTimeout> t) { timeout = t; }
+    intrusive_ptr<DtxTimeout> getTimeout() { return timeout; }
 };
 
 }

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Timer.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Timer.cpp?rev=601803&r1=601802&r2=601803&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Timer.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Timer.cpp Thu Dec  6 10:22:17 2007
@@ -27,9 +27,14 @@
 using qpid::sys::Thread;
 using namespace qpid::broker;
 
-TimerTask::TimerTask(Duration timeout) : duration(timeout), time(AbsTime::now(), timeout), cancelled(false) {}
-TimerTask::TimerTask(AbsTime _time) : duration(0), time(_time), cancelled(false) {}
+TimerTask::TimerTask(Duration timeout) :
+    duration(timeout), time(AbsTime::now(), timeout), cancelled(false) {}
+
+TimerTask::TimerTask(AbsTime _time) :
+    duration(0), time(_time), cancelled(false) {}
+
 TimerTask::~TimerTask(){}
+
 void TimerTask::reset() { time.reset(AbsTime::now(), duration); }
 
 Timer::Timer() : active(false) 
@@ -49,7 +54,7 @@
         if (tasks.empty()) {
             monitor.wait();
         } else {
-            TimerTask::shared_ptr t = tasks.top();
+            intrusive_ptr<TimerTask> t = tasks.top();
             if (t->cancelled) {
                 tasks.pop();
             } else if(t->time < AbsTime::now()) {
@@ -62,7 +67,7 @@
     }
 }
 
-void Timer::add(TimerTask::shared_ptr task)
+void Timer::add(intrusive_ptr<TimerTask> task)
 {
     Monitor::ScopedLock l(monitor);
     tasks.push(task);
@@ -93,92 +98,9 @@
     }
 }
 
-bool Later::operator()(const TimerTask::shared_ptr& a, const TimerTask::shared_ptr& b) const
+bool Later::operator()(const intrusive_ptr<TimerTask>& a,
+                       const intrusive_ptr<TimerTask>& b) const
 {
     return a.get() && b.get() && a->time > b->time;
 }
-
-bool LaterA::operator()(const TimerTaskA::intrusive_ptr& a, const TimerTaskA::intrusive_ptr& b) const
-{
-    return a.get() && b.get() && a->time > b->time;
-}
-
-TimerA::TimerA(): active(false) 
-{
-    start();
-}
-
-TimerA::~TimerA() 
-{
-    stop();
-}
-
-void TimerA::run()
-{
-    Monitor::ScopedLock l(monitor);
-    while(active){
-        if (itasks.empty()) {
-            monitor.wait();
-        } else {
-            TimerTaskA::intrusive_ptr t = itasks.top();
-            if (t->cancelled) {
-                itasks.pop();
-            } else if(t->time < AbsTime::now()) {
-                itasks.pop();
-                t->fire();
-            } else {
-                monitor.wait(t->time);
-            }
-        }
-    }
-//    ::run();
-}
-
-TimerTaskA::TimerTaskA(qpid::sys::Duration timeout): TimerTask(timeout), ref_cnt(0) {}
-TimerTaskA::TimerTaskA(qpid::sys::AbsTime time): TimerTask(time), ref_cnt(0) {}
-TimerTaskA::~TimerTaskA() {}
-
-
-void TimerA::add(TimerTaskA::intrusive_ptr& task)
-{
-    Monitor::ScopedLock l(monitor);
-    itasks.push(task);
-    monitor.notify();
-}
-
-void TimerA::start()
-{
-    Monitor::ScopedLock l(monitor);
-    if (!active) {
-        active = true;
-        runner = Thread(this);
-    }
-}
-
-void TimerA::stop()
-{
-    signalStop();
-    runner.join();
-}
-
-void TimerA::signalStop()
-{
-    Monitor::ScopedLock l(monitor);
-    if (active) {
-        active = false;
-        monitor.notifyAll();
-    }
-}
-
-void qpid::broker::intrusive_ptr_add_ref(TimerTaskA* fe)
-{
-    fe->ref();
-}
-
-void qpid::broker::intrusive_ptr_release(TimerTaskA* fe)
-{
-    fe->unref();
-    if (fe->refcnt() == 0) delete fe;
-}
-
 

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Timer.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Timer.h?rev=601803&r1=601802&r2=601803&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Timer.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Timer.h Thu Dec  6 10:22:17 2007
@@ -21,22 +21,19 @@
 #ifndef _Timer_
 #define _Timer_
 
-#include <memory>
-#include <queue>
-#include <boost/shared_ptr.hpp>
-#include <boost/intrusive_ptr.hpp>
 #include "qpid/sys/Monitor.h"
 #include "qpid/sys/Thread.h"
 #include "qpid/sys/Runnable.h"
+#include "qpid/RefCounted.h"
+
+#include <memory>
+#include <queue>
 
 namespace qpid {
 namespace broker {
 
-struct TimerTask
-{
+struct TimerTask : public RefCounted {
     const qpid::sys::Duration duration;
-    typedef boost::shared_ptr<TimerTask> shared_ptr;
-
     qpid::sys::AbsTime time;
     volatile bool cancelled;
 
@@ -47,79 +44,35 @@
     virtual void fire() = 0;
 };
 
-struct TimerTaskA : public TimerTask
-{
-    typedef boost::intrusive_ptr<TimerTaskA> intrusive_ptr;
-
-    TimerTaskA(qpid::sys::Duration timeout);
-    TimerTaskA(qpid::sys::AbsTime time);
-    virtual ~TimerTaskA();
-    
-    size_t          ref_cnt;
-    inline size_t refcnt(void) { return ref_cnt;}
-    inline void ref(void) { ref_cnt++; }
-    inline void unref(void) { ref_cnt--; }
+struct Later {
+    bool operator()(const intrusive_ptr<TimerTask>& a,
+                    const intrusive_ptr<TimerTask>& b) const;
 };
 
-struct Later
-{
-    bool operator()(const TimerTask::shared_ptr& a, const TimerTask::shared_ptr& b) const;
-};
-
-struct LaterA
-{
-     bool operator()(const TimerTaskA::intrusive_ptr& a, const TimerTaskA::intrusive_ptr& b) const;
-};
-
-
-class Timer : private qpid::sys::Runnable
-{
-protected:
+class Timer : private qpid::sys::Runnable {
+  protected:
     qpid::sys::Monitor monitor;            
-    std::priority_queue<TimerTask::shared_ptr, std::vector<TimerTask::shared_ptr>, Later> tasks;
+    std::priority_queue<intrusive_ptr<TimerTask>,
+                        std::vector<intrusive_ptr<TimerTask> >,
+                        Later> tasks;
     qpid::sys::Thread runner;
     bool active;
 
     virtual void run();
     void signalStop();
 
-public:
+  public:
     Timer();
     virtual ~Timer();
 
-    void add(TimerTask::shared_ptr task);
+    void add(intrusive_ptr<TimerTask> task);
     void start();
     void stop();
 
 };
 
-class TimerA : private qpid::sys::Runnable
-{
-protected:
-    qpid::sys::Monitor monitor;            
-    std::priority_queue<TimerTaskA::intrusive_ptr&, std::vector<TimerTaskA::intrusive_ptr>,
-             LaterA> itasks;
-    qpid::sys::Thread runner;
-    bool active;
-    
-    virtual void run();
-    void signalStop();
-
-public:
-    TimerA();
-    virtual ~TimerA();
-
-    void add(TimerTaskA::intrusive_ptr& task);
-    void start();
-    void stop();
-};
-
-void intrusive_ptr_add_ref(TimerTaskA* r);
-void intrusive_ptr_release(TimerTaskA* r);
-
 
-}
-}
+}}
 
 
 #endif

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.cpp?rev=601803&r1=601802&r2=601803&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.cpp Thu Dec  6 10:22:17 2007
@@ -36,7 +36,7 @@
 
 ManagementAgent::ManagementAgent (uint16_t _interval) : interval (_interval)
 {
-    timer.add (TimerTask::shared_ptr (new Periodic(*this, interval)));
+    timer.add (intrusive_ptr<TimerTask> (new Periodic(*this, interval)));
     nextObjectId = uint64_t (qpid::sys::Duration (qpid::sys::now ()));
 }
 
@@ -68,7 +68,7 @@
 
 void ManagementAgent::Periodic::fire ()
 {
-    agent.timer.add (TimerTask::shared_ptr (new Periodic (agent, agent.interval)));
+    agent.timer.add (intrusive_ptr<TimerTask> (new Periodic (agent, agent.interval)));
     agent.PeriodicProcessing ();
 }
 

Modified: incubator/qpid/trunk/qpid/cpp/src/tests/TimerTest.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/TimerTest.cpp?rev=601803&r1=601802&r2=601803&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/TimerTest.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/TimerTest.cpp Thu Dec  6 10:22:17 2007
@@ -30,6 +30,7 @@
 
 using namespace qpid::broker;
 using namespace qpid::sys;
+using qpid::intrusive_ptr;
 using boost::dynamic_pointer_cast;
 
 class TimerTest : public CppUnit::TestCase  
@@ -104,10 +105,10 @@
     {
         Counter counter;
         Timer timer;
-        TestTask::shared_ptr task1(new TestTask(Duration(3 * TIME_SEC), counter));
-        TestTask::shared_ptr task2(new TestTask(Duration(1 * TIME_SEC), counter));
-        TestTask::shared_ptr task3(new TestTask(Duration(4 * TIME_SEC), counter));
-        TestTask::shared_ptr task4(new TestTask(Duration(2 * TIME_SEC), counter));
+        intrusive_ptr<TestTask> task1(new TestTask(Duration(3 * TIME_SEC), counter));
+        intrusive_ptr<TestTask> task2(new TestTask(Duration(1 * TIME_SEC), counter));
+        intrusive_ptr<TestTask> task3(new TestTask(Duration(4 * TIME_SEC), counter));
+        intrusive_ptr<TestTask> task4(new TestTask(Duration(2 * TIME_SEC), counter));
         
         timer.add(task1);
         timer.add(task2);