3 Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #ifndef UTIL_THREAD_HEADER
21 #define UTIL_THREAD_HEADER
23 #include "../irrlichttypes.h"
24 #include "../jthread/jthread.h"
25 #include "../jthread/jmutex.h"
26 #include "../jthread/jmutexautolock.h"
33 MutexedVariable(T value):
40 JMutexAutoLock lock(m_mutex);
46 JMutexAutoLock lock(m_mutex);
50 // You'll want to grab this in a SharedPtr
51 JMutexAutoLock * getLock()
53 return new JMutexAutoLock(m_mutex);
56 // You pretty surely want to grab the lock when accessing this
64 A single worker thread - multiple client threads queue framework.
66 template<typename Key, typename T, typename Caller, typename CallerData>
72 std::pair<Caller, CallerData> caller;
75 template<typename Key, typename T, typename Caller, typename CallerData>
76 class ResultQueue: public MutexedQueue< GetResult<Key, T, Caller, CallerData> >
80 template<typename Caller, typename Data, typename Key, typename T>
86 ResultQueue< Key, T, Caller, Data>* dest;
89 template<typename Key, typename T, typename Caller, typename CallerData>
105 std::list<CallerInfo<Caller, CallerData, Key, T> > callers;
109 * Notes for RequestQueue usage
110 * @param Key unique key to identify a request for a specific resource
112 * @param Caller unique id of calling thread
113 * @param CallerData data passed back to caller
115 template<typename Key, typename T, typename Caller, typename CallerData>
121 return m_queue.empty();
124 void add(Key key, Caller caller, CallerData callerdata,
125 ResultQueue<Key, T, Caller, CallerData> *dest)
128 JMutexAutoLock lock(m_queue.getMutex());
131 If the caller is already on the list, only update CallerData
133 for(typename std::list< GetRequest<Key, T, Caller, CallerData> >::iterator
134 i = m_queue.getList().begin();
135 i != m_queue.getList().end(); ++i)
137 GetRequest<Key, T, Caller, CallerData> &request = *i;
139 if(request.key == key)
141 for(typename std::list< CallerInfo<Caller, CallerData, Key, T> >::iterator
142 i = request.callers.begin();
143 i != request.callers.end(); ++i)
145 CallerInfo<Caller, CallerData, Key, T> &ca = *i;
146 if(ca.caller == caller)
148 ca.data = callerdata;
152 CallerInfo<Caller, CallerData, Key, T> ca;
154 ca.data = callerdata;
156 request.callers.push_back(ca);
163 Else add a new request to the queue
166 GetRequest<Key, T, Caller, CallerData> request;
168 CallerInfo<Caller, CallerData, Key, T> ca;
170 ca.data = callerdata;
172 request.callers.push_back(ca);
174 m_queue.push_back(request);
177 GetRequest<Key, T, Caller, CallerData> pop(unsigned int timeout_ms)
179 return m_queue.pop_front(timeout_ms);
182 GetRequest<Key, T, Caller, CallerData> pop()
184 return m_queue.pop_frontNoEx();
187 void pushResult(GetRequest<Key, T, Caller, CallerData> req,
190 for(typename std::list< CallerInfo<Caller, CallerData, Key, T> >::iterator
191 i = req.callers.begin();
192 i != req.callers.end(); ++i)
194 CallerInfo<Caller, CallerData, Key, T> &ca = *i;
196 GetResult<Key,T,Caller,CallerData> result;
198 result.key = req.key;
200 result.caller.first = ca.caller;
201 result.caller.second = ca.data;
203 ca.dest->push_back(result);
208 MutexedQueue< GetRequest<Key, T, Caller, CallerData> > m_queue;