xref: /nrf52832-nimble/packages/NimBLE-latest/porting/npl/linux/src/wqueue.h (revision 042d53a763ad75cb1465103098bb88c245d95138)
1*042d53a7SEvalZero /*
2*042d53a7SEvalZero    wqueue.h
3*042d53a7SEvalZero    Worker thread queue based on the Standard C++ library list
4*042d53a7SEvalZero    template class.
5*042d53a7SEvalZero    ------------------------------------------
6*042d53a7SEvalZero    Copyright (c) 2013 Vic Hargrave
7*042d53a7SEvalZero    Licensed under the Apache License, Version 2.0 (the "License");
8*042d53a7SEvalZero    you may not use this file except in compliance with the License.
9*042d53a7SEvalZero    You may obtain a copy of the License at
10*042d53a7SEvalZero        http://www.apache.org/licenses/LICENSE-2.0
11*042d53a7SEvalZero    Unless required by applicable law or agreed to in writing, software
12*042d53a7SEvalZero    distributed under the License is distributed on an "AS IS" BASIS,
13*042d53a7SEvalZero    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*042d53a7SEvalZero    See the License for the specific language governing permissions and
15*042d53a7SEvalZero    limitations under the License.
16*042d53a7SEvalZero */
17*042d53a7SEvalZero 
18*042d53a7SEvalZero // https://vichargrave.github.io/articles/2013-01/multithreaded-work-queue-in-cpp
19*042d53a7SEvalZero // https://github.com/vichargrave/wqueue/blob/master/wqueue.h
20*042d53a7SEvalZero 
21*042d53a7SEvalZero 
22*042d53a7SEvalZero #ifndef __wqueue_h__
23*042d53a7SEvalZero #define __wqueue_h__
24*042d53a7SEvalZero 
25*042d53a7SEvalZero #include <pthread.h>
26*042d53a7SEvalZero #include <list>
27*042d53a7SEvalZero 
28*042d53a7SEvalZero using namespace std;
29*042d53a7SEvalZero 
30*042d53a7SEvalZero template <typename T> class wqueue
31*042d53a7SEvalZero {
32*042d53a7SEvalZero     list<T>         m_queue;
33*042d53a7SEvalZero     pthread_mutex_t m_mutex;
34*042d53a7SEvalZero     pthread_cond_t  m_condv;
35*042d53a7SEvalZero 
36*042d53a7SEvalZero public:
wqueue()37*042d53a7SEvalZero     wqueue()
38*042d53a7SEvalZero     {
39*042d53a7SEvalZero         pthread_mutexattr_t attr;
40*042d53a7SEvalZero         pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
41*042d53a7SEvalZero         pthread_mutex_init(&m_mutex, &attr);
42*042d53a7SEvalZero         pthread_cond_init(&m_condv, NULL);
43*042d53a7SEvalZero     }
44*042d53a7SEvalZero 
~wqueue()45*042d53a7SEvalZero     ~wqueue() {
46*042d53a7SEvalZero         pthread_mutex_destroy(&m_mutex);
47*042d53a7SEvalZero         pthread_cond_destroy(&m_condv);
48*042d53a7SEvalZero     }
49*042d53a7SEvalZero 
put(T item)50*042d53a7SEvalZero     void put(T item) {
51*042d53a7SEvalZero         pthread_mutex_lock(&m_mutex);
52*042d53a7SEvalZero         m_queue.push_back(item);
53*042d53a7SEvalZero         pthread_cond_signal(&m_condv);
54*042d53a7SEvalZero         pthread_mutex_unlock(&m_mutex);
55*042d53a7SEvalZero     }
56*042d53a7SEvalZero 
get(uint32_t tmo)57*042d53a7SEvalZero     T get(uint32_t tmo) {
58*042d53a7SEvalZero         pthread_mutex_lock(&m_mutex);
59*042d53a7SEvalZero         if (tmo) {
60*042d53a7SEvalZero             while (m_queue.size() == 0) {
61*042d53a7SEvalZero                 pthread_cond_wait(&m_condv, &m_mutex);
62*042d53a7SEvalZero             }
63*042d53a7SEvalZero         }
64*042d53a7SEvalZero 
65*042d53a7SEvalZero         T item = NULL;
66*042d53a7SEvalZero 
67*042d53a7SEvalZero         if (m_queue.size() != 0) {
68*042d53a7SEvalZero             item = m_queue.front();
69*042d53a7SEvalZero             m_queue.pop_front();
70*042d53a7SEvalZero         }
71*042d53a7SEvalZero 
72*042d53a7SEvalZero         pthread_mutex_unlock(&m_mutex);
73*042d53a7SEvalZero         return item;
74*042d53a7SEvalZero     }
75*042d53a7SEvalZero 
size()76*042d53a7SEvalZero     int size() {
77*042d53a7SEvalZero         pthread_mutex_lock(&m_mutex);
78*042d53a7SEvalZero         int size = m_queue.size();
79*042d53a7SEvalZero         pthread_mutex_unlock(&m_mutex);
80*042d53a7SEvalZero         return size;
81*042d53a7SEvalZero     }
82*042d53a7SEvalZero };
83*042d53a7SEvalZero 
84*042d53a7SEvalZero #endif
85