From 8eb272cea38325f963c521ecfa7b927a563f8509 Mon Sep 17 00:00:00 2001 From: kwolekr Date: Wed, 8 Jul 2015 11:53:02 -0400 Subject: Misc. minor fixes --- src/util/thread.h | 138 +++++++++++++++++++++++------------------------------- 1 file changed, 58 insertions(+), 80 deletions(-) (limited to 'src/util/thread.h') diff --git a/src/util/thread.h b/src/util/thread.h index faa5869ca..b3a5e68a2 100644 --- a/src/util/thread.h +++ b/src/util/thread.h @@ -28,13 +28,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "log.h" template -class MutexedVariable -{ +class MutexedVariable { public: MutexedVariable(T value): m_value(value) - { - } + {} T get() { @@ -47,13 +45,13 @@ public: JMutexAutoLock lock(m_mutex); m_value = value; } - + // You'll want to grab this in a SharedPtr - JMutexAutoLock * getLock() + JMutexAutoLock *getLock() { return new JMutexAutoLock(m_mutex); } - + // You pretty surely want to grab the lock when accessing this T m_value; @@ -65,8 +63,7 @@ private: A single worker thread - multiple client threads queue framework. */ template -class GetResult -{ +class GetResult { public: Key key; T item; @@ -74,34 +71,27 @@ public: }; template -class ResultQueue: public MutexedQueue< GetResult > -{ +class ResultQueue : public MutexedQueue > { }; template -class CallerInfo -{ +class CallerInfo { public: Caller caller; Data data; - ResultQueue< Key, T, Caller, Data>* dest; + ResultQueue *dest; }; template -class GetRequest -{ +class GetRequest { public: - GetRequest() - { - } - GetRequest(Key a_key) - { + GetRequest() {} + ~GetRequest() {} + + GetRequest(Key a_key) { key = a_key; } - ~GetRequest() - { - } - + Key key; std::list > callers; }; @@ -114,8 +104,7 @@ public: * @param CallerData data passed back to caller */ template -class RequestQueue -{ +class RequestQueue { public: bool empty() { @@ -123,40 +112,36 @@ public: } void add(Key key, Caller caller, CallerData callerdata, - ResultQueue *dest) + ResultQueue *dest) { + typename std::deque >::iterator i; + typename std::list >::iterator j; + { JMutexAutoLock lock(m_queue.getMutex()); /* If the caller is already on the list, only update CallerData */ - for(typename std::deque< GetRequest >::iterator - i = m_queue.getQueue().begin(); - i != m_queue.getQueue().end(); ++i) - { + for (i = m_queue.getQueue().begin(); i != m_queue.getQueue().end(); ++i) { GetRequest &request = *i; - - if(request.key == key) - { - for(typename std::list< CallerInfo >::iterator - i = request.callers.begin(); - i != request.callers.end(); ++i) - { - CallerInfo &ca = *i; - if(ca.caller == caller) - { - ca.data = callerdata; - return; - } + if (request.key != key) + continue; + + for (j = request.callers.begin(); j != request.callers.end(); ++j) { + CallerInfo &ca = *j; + if (ca.caller == caller) { + ca.data = callerdata; + return; } - CallerInfo ca; - ca.caller = caller; - ca.data = callerdata; - ca.dest = dest; - request.callers.push_back(ca); - return; } + + CallerInfo ca; + ca.caller = caller; + ca.data = callerdata; + ca.dest = dest; + request.callers.push_back(ca); + return; } } @@ -171,7 +156,7 @@ public: ca.data = callerdata; ca.dest = dest; request.callers.push_back(ca); - + m_queue.push_back(request); } @@ -185,13 +170,11 @@ public: return m_queue.pop_frontNoEx(); } - void pushResult(GetRequest req, - T res) { - - for(typename std::list< CallerInfo >::iterator + void pushResult(GetRequest req, T res) + { + for (typename std::list >::iterator i = req.callers.begin(); - i != req.callers.end(); ++i) - { + i != req.callers.end(); ++i) { CallerInfo &ca = *i; GetResult result; @@ -206,24 +189,13 @@ public: } private: - MutexedQueue< GetRequest > m_queue; + MutexedQueue > m_queue; }; -class UpdateThread : public JThread -{ -private: - JSemaphore m_update_sem; - -protected: - virtual void doUpdate() = 0; - virtual const char *getName() = 0; - +class UpdateThread : public JThread { public: - UpdateThread() - { - } - ~UpdateThread() - {} + UpdateThread() {} + virtual ~UpdateThread() {} void deferUpdate() { @@ -243,30 +215,36 @@ public: ThreadStarted(); const char *thread_name = getName(); - log_register_thread(thread_name); + porting::setThreadName(thread_name); DSTACK(__FUNCTION_NAME); - BEGIN_DEBUG_EXCEPTION_HANDLER - porting::setThreadName(thread_name); - while (!StopRequested()) { - m_update_sem.Wait(); // Empty the queue, just in case doUpdate() is expensive - while (m_update_sem.GetValue()) m_update_sem.Wait(); + while (m_update_sem.GetValue()) + m_update_sem.Wait(); - if (StopRequested()) break; + if (StopRequested()) + break; doUpdate(); } + END_DEBUG_EXCEPTION_HANDLER(errorstream) return NULL; } + +protected: + virtual void doUpdate() = 0; + virtual const char *getName() = 0; + +private: + JSemaphore m_update_sem; }; #endif -- cgit v1.2.3