Merged mblock work-in-progress (eb/mb r4273:4312) into trunk.
[debian/gnuradio] / mblock / src / lib / mb_msg_queue.cc
1 /* -*- c++ -*- */
2 /*
3  * Copyright 2007 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 2, 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
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25 #include <mb_msg_queue.h>
26 #include <mb_message.h>
27
28 // FIXME turn this into a template so we can use it for the runq of mblocks too
29
30 mb_msg_queue::mb_msg_queue()
31 {
32 }
33
34 mb_msg_queue::~mb_msg_queue()
35 {
36 }
37
38 void
39 mb_msg_queue::insert(mb_message_sptr msg)
40 {
41   // omni_mutex_lock    l(d_mutex);             FIXME
42   
43   mb_pri_t q = mb_pri_clamp(msg->priority());
44
45   if (d_queue[q].empty_p()){
46     d_queue[q].tail = d_queue[q].head = msg;
47     msg->d_next.reset();        //msg->d_next = 0;
48   }
49   else {
50     d_queue[q].tail->d_next = msg;
51     d_queue[q].tail = msg;
52     msg->d_next.reset();        // msg->d_next = 0;
53   }
54   // FIXME set bit in bitmap
55 }
56
57 mb_message_sptr
58 mb_msg_queue::get_highest_pri_msg()
59 {
60   // omni_mutex_lock    l(d_mutex);             FIXME
61
62   // FIXME use bitmap and ffz to find best queue in O(1)
63
64   for (mb_pri_t q = 0; q <= MB_PRI_WORST; q++){
65
66     if (!d_queue[q].empty_p()){
67       mb_message_sptr msg = d_queue[q].head;
68       d_queue[q].head = msg->d_next;
69       if (d_queue[q].head == 0){
70         d_queue[q].tail.reset();        // d_queue[q].tail = 0;
71         // FIXME clear bit in bitmap
72       }
73
74       msg->d_next.reset();              // msg->d_next = 0;
75       return msg;
76     }
77   }
78
79   return mb_message_sptr();     // equivalent of a zero pointer
80 }