File: kvu_object_queue.h

package info (click to toggle)
ecasound 2.9.3-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 6,292 kB
  • sloc: cpp: 39,475; sh: 4,335; lisp: 1,918; ansic: 1,883; makefile: 888; python: 617; ruby: 202
file content (108 lines) | stat: -rw-r--r-- 3,108 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// ------------------------------------------------------------------------
// object_queue.cpp: Thread-safe way to transmit generic objects (FIFO).
// Copyright (C) 1999-2000 Kai Vehmanen
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
// ------------------------------------------------------------------------

#ifndef INCLUDED_OBJECT_QUEUE_H
#define INCLUDED_OBJECT_QUEUE_H

#include <pthread.h>
#include <deque>

/**
 * Thread-safe way to transmit generic objects (FIFO-queue).
 */
template<class T>
class OBJECT_QUEUE {
    
private:

    deque<T> cmds_rep;
    mutable pthread_mutex_t lock_rep;

public:
    
    /**
     * Inserts 'obj' into the queue. If some other process is 
     * accessing the queue, this call will block.
     */
    void push_back(const T& obj)  {
      pthread_mutex_lock(&lock_rep);
      cmds_rep.push_back(obj);
      pthread_mutex_unlock(&lock_rep);
    }

    /**
     * Pops the first item. If some other process is 
     * accessing the queue, this call will block.
     */
    void pop_front(void) {
      pthread_mutex_lock(&lock_rep);
      cmds_rep.pop_front();
      pthread_mutex_unlock(&lock_rep);
    }

    /**
     * Returns the first item. If some other process is 
     * accessing the queue, this call will block.
     */
    T front(void) const  {
      T temporary;
      pthread_mutex_lock(&lock_rep);
      if (cmds_rep.size() > 0) {
	temporary = cmds_rep.front();
      }
      pthread_mutex_unlock(&lock_rep);
      return(temporary);
    }

    /**
     * Returns true if the queue is empty. Unlike other calls,
     * this call will not block if some other process is 
     * accessing the queue. In this case, the returned result
     * will be 'true' even if the queue wasn't empty.
     */
    bool is_empty(void) const {
      if (pthread_mutex_trylock(&lock_rep) != 0)
	return(true);
  
      bool temp = true;
      if (cmds_rep.size() > 0) temp = false;
      pthread_mutex_unlock(&lock_rep);
      return(temp);
    }    
    
    /**
     * Clears the queue. If some other process is 
     * accessing the queue, this call will block.
     */
    void clear(void) {
      pthread_mutex_lock(&lock_rep);
      while (cmds_repsize() > 0) cmds_rep.pop_front();
      pthread_mutex_unlock(&lock_rep);
    }

    OBJECT_QUEUE(void) {
      pthread_mutex_init(&lock_rep, NULL);
    }

    ~OBJECT_QUEUE(void) {
      pthread_mutex_destroy(&lock_rep);      
    }
};

#endif