Statistics
| Branch: | Tag: | Revision:

root / mblock / src / include / mblock / msg_queue.h @ c48f42b5

History | View | Annotate | Download (2.4 kB)

1
/* -*- c++ -*- */
2
/*
3
 * Copyright 2007,2008 Free Software Foundation, Inc.
4
 * 
5
 * This file is part of GNU Radio
6
 * 
7
 * GNU Radio is free software; you can redistribute it and/or modify
8
 * it under the terms of the GNU General Public License as published by
9
 * the Free Software Foundation; either version 3, or (at your option)
10
 * any later version.
11
 * 
12
 * GNU Radio is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU General Public License for more details.
16
 * 
17
 * You should have received a copy of the GNU General Public License along
18
 * with this program; if not, write to the Free Software Foundation, Inc.,
19
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
 */
21
#ifndef INCLUDED_MB_MSG_QUEUE_H
22
#define INCLUDED_MB_MSG_QUEUE_H
23
24
#include <mblock/common.h>
25
#include <gnuradio/omnithread.h>
26
#include <mblock/time.h>
27
28
/*!
29
 * \brief priority queue for mblock messages
30
 */
31
class mb_msg_queue : boost::noncopyable
32
{
33
  // When empty both head and tail are zero.
34
  struct subq {
35
    mb_message_sptr        head;
36
    mb_message_sptr        tail;
37
38
    bool empty_p() const { return head == 0; }
39
  };
40
41
  omni_mutex         d_mutex;
42
  omni_condition d_not_empty;        // reader waits on this
43
44
  // FIXME add bitmap to indicate which queues are non-empty.
45
  subq                 d_queue[MB_NPRI];
46
47
  mb_message_sptr get_highest_pri_msg_helper();
48
49
public:
50
  mb_msg_queue();
51
  ~mb_msg_queue();
52
53
  //! Insert \p msg into priority queue.
54
  void insert(mb_message_sptr msg);
55
56
  /*
57
   * \brief Delete highest pri message from the queue and return it.
58
   * Returns equivalent of zero pointer if queue is empty.
59
   */
60
  mb_message_sptr get_highest_pri_msg_nowait();
61
62
  /*
63
   * \brief Delete highest pri message from the queue and return it.
64
   * If the queue is empty, this call blocks until it can return a message.
65
   */
66
  mb_message_sptr get_highest_pri_msg();
67
68
  /*
69
   * \brief Delete highest pri message from the queue and return it.
70
   * If the queue is empty, this call blocks until it can return a message
71
   * or real-time exceeds the absolute time, abs_time.
72
   *
73
   * \param abs_time specifies the latest absolute time to wait until.
74
   * \sa mb_time::time
75
   *
76
   * \returns a valid mb_message_sptr, or the equivalent of a zero pointer
77
   * if the call timed out while waiting.
78
   */
79
  mb_message_sptr get_highest_pri_msg_timedwait(const mb_time &abs_time);
80
};
81
82
#endif /* INCLUDED_MB_MSG_QUEUE_H */