1f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/* 2f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * libjingle 3f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Copyright 2004--2005, Google Inc. 4f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 5f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Redistribution and use in source and binary forms, with or without 6f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * modification, are permitted provided that the following conditions are met: 7f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 8f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 1. Redistributions of source code must retain the above copyright notice, 9f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer. 10f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 2. Redistributions in binary form must reproduce the above copyright notice, 11f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer in the documentation 12f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * and/or other materials provided with the distribution. 13f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 3. The name of the author may not be used to endorse or promote products 14f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * derived from this software without specific prior written permission. 15f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 16f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch */ 27f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 28f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifndef TALK_BASE_MESSAGEQUEUE_H_ 29f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define TALK_BASE_MESSAGEQUEUE_H_ 30f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 31f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <algorithm> 32f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <cstring> 33f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <list> 34f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <queue> 35f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <vector> 36f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 37f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/basictypes.h" 38f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/criticalsection.h" 39f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/messagehandler.h" 40f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/scoped_ptr.h" 41f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/sigslot.h" 42f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/socketserver.h" 43f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/time.h" 44f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 45f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochnamespace talk_base { 46f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 47f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochstruct Message; 48f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass MessageQueue; 49f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 50f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// MessageQueueManager does cleanup of of message queues 51f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 52f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass MessageQueueManager { 53f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 54f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static MessageQueueManager* Instance(); 55f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 56f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void Add(MessageQueue *message_queue); 57f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void Remove(MessageQueue *message_queue); 58f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void Clear(MessageHandler *handler); 59f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 60f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch private: 61f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch MessageQueueManager(); 62f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ~MessageQueueManager(); 63f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 64f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch static MessageQueueManager* instance_; 65f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // This list contains 'active' MessageQueues. 66f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::vector<MessageQueue *> message_queues_; 67f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch CriticalSection crit_; 68f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 69f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 70f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// Derive from this for specialized data 71f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// App manages lifetime, except when messages are purged 72f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 73f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass MessageData { 74f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 75f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch MessageData() {} 76f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual ~MessageData() {} 77f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 78f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 79f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochtemplate <class T> 80f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass TypedMessageData : public MessageData { 81f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 82f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch explicit TypedMessageData(const T& data) : data_(data) { } 83f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const T& data() const { return data_; } 84f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch T& data() { return data_; } 85f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch private: 86f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch T data_; 87f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 88f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 89f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// Like TypedMessageData, but for pointers that require a delete. 90f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochtemplate <class T> 91f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass ScopedMessageData : public MessageData { 92f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 93f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch explicit ScopedMessageData(T* data) : data_(data) { } 94f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const scoped_ptr<T>& data() const { return data_; } 95f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch scoped_ptr<T>& data() { return data_; } 96f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch private: 97f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch scoped_ptr<T> data_; 98f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 99f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 100f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochtemplate<class T> 101f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochinline MessageData* WrapMessageData(const T& data) { 102f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return new TypedMessageData<T>(data); 103f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 104f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 105f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochtemplate<class T> 106f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochinline const T& UseMessageData(MessageData* data) { 107f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return static_cast< TypedMessageData<T>* >(data)->data(); 108f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 109f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 110f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochtemplate<class T> 111f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass DisposeData : public MessageData { 112f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 113f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch explicit DisposeData(T* data) : data_(data) { } 114f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual ~DisposeData() { delete data_; } 115f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch private: 116f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch T* data_; 117f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 118f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 119f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochconst uint32 MQID_ANY = static_cast<uint32>(-1); 120f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochconst uint32 MQID_DISPOSE = static_cast<uint32>(-2); 121f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 122f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// No destructor 123f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 124f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochstruct Message { 125f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Message() { 126f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch memset(this, 0, sizeof(*this)); 127f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 128f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch inline bool Match(MessageHandler* handler, uint32 id) const { 129f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return (handler == NULL || handler == phandler) 130f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch && (id == MQID_ANY || id == message_id); 131f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 132f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch MessageHandler *phandler; 133f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch uint32 message_id; 134f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch MessageData *pdata; 135f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch uint32 ts_sensitive; 136f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 137f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 138f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochtypedef std::list<Message> MessageList; 139f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 140f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// DelayedMessage goes into a priority queue, sorted by trigger time. Messages 141f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// with the same trigger time are processed in num_ (FIFO) order. 142f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 143f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass DelayedMessage { 144f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 145f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch DelayedMessage(int delay, uint32 trigger, uint32 num, const Message& msg) 146f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch : cmsDelay_(delay), msTrigger_(trigger), num_(num), msg_(msg) { } 147f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 148f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool operator< (const DelayedMessage& dmsg) const { 149f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return (dmsg.msTrigger_ < msTrigger_) 150f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch || ((dmsg.msTrigger_ == msTrigger_) && (dmsg.num_ < num_)); 151f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 152f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 153f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch int cmsDelay_; // for debugging 154f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch uint32 msTrigger_; 155f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch uint32 num_; 156f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Message msg_; 157f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 158f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 159f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass MessageQueue { 160f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 161f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch explicit MessageQueue(SocketServer* ss = NULL); 162f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual ~MessageQueue(); 163f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 164f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SocketServer* socketserver() { return ss_; } 165f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void set_socketserver(SocketServer* ss); 166f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 167f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Note: The behavior of MessageQueue has changed. When a MQ is stopped, 168f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // futher Posts and Sends will fail. However, any pending Sends and *ready* 169f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Posts (as opposed to unexpired delayed Posts) will be delivered before 170f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Get (or Peek) returns false. By guaranteeing delivery of those messages, 171f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // we eliminate the race condition when an MessageHandler and MessageQueue 172f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // may be destroyed independently of each other. 173f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual void Quit(); 174f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool IsQuitting(); 175f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual void Restart(); 176f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 177f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Get() will process I/O until: 178f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // 1) A message is available (returns true) 179f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // 2) cmsWait seconds have elapsed (returns false) 180f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // 3) Stop() is called (returns false) 181f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool Get(Message *pmsg, int cmsWait = kForever, 182f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool process_io = true); 183f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool Peek(Message *pmsg, int cmsWait = 0); 184f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual void Post(MessageHandler *phandler, uint32 id = 0, 185f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch MessageData *pdata = NULL, bool time_sensitive = false); 186f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual void PostDelayed(int cmsDelay, MessageHandler *phandler, 187f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch uint32 id = 0, MessageData *pdata = NULL) { 188f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return DoDelayPost(cmsDelay, TimeAfter(cmsDelay), phandler, id, pdata); 189f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 190f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual void PostAt(uint32 tstamp, MessageHandler *phandler, 191f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch uint32 id = 0, MessageData *pdata = NULL) { 192f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return DoDelayPost(TimeUntil(tstamp), tstamp, phandler, id, pdata); 193f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 194f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual void Clear(MessageHandler *phandler, uint32 id = MQID_ANY, 195f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch MessageList* removed = NULL); 196f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual void Dispatch(Message *pmsg); 197f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual void ReceiveSends(); 198f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 199f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Amount of time until the next message can be retrieved 200f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual int GetDelay(); 201f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 202f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool empty() const { return msgq_.empty() && dmsgq_.empty() && !fPeekKeep_; } 203f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch size_t size() const { return msgq_.size() + dmsgq_.size() + fPeekKeep_; } 204f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 205f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Internally posts a message which causes the doomed object to be deleted 206f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch template<class T> void Dispose(T* doomed) { 207f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (doomed) { 208f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Post(NULL, MQID_DISPOSE, new DisposeData<T>(doomed)); 209f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 210f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 211f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 212f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // When this signal is sent out, any references to this queue should 213f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // no longer be used. 214f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch sigslot::signal0<> SignalQueueDestroyed; 215f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 216f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch protected: 217f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch class PriorityQueue : public std::priority_queue<DelayedMessage> { 218f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 219f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch container_type& container() { return c; } 220f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void reheap() { make_heap(c.begin(), c.end(), comp); } 221f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch }; 222f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 223f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void EnsureActive(); 224f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void DoDelayPost(int cmsDelay, uint32 tstamp, MessageHandler *phandler, 225f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch uint32 id, MessageData* pdata); 226f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 227f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // The SocketServer is not owned by MessageQueue. 228f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SocketServer* ss_; 229f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // If a server isn't supplied in the constructor, use this one. 230f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch scoped_ptr<SocketServer> default_ss_; 231f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool fStop_; 232f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool fPeekKeep_; 233f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Message msgPeek_; 234f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // A message queue is active if it has ever had a message posted to it. 235f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // This also corresponds to being in MessageQueueManager's global list. 236f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool active_; 237f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch MessageList msgq_; 238f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch PriorityQueue dmsgq_; 239f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch uint32 dmsgq_next_num_; 240f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch CriticalSection crit_; 241f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 242f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 243f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} // namespace talk_base 244f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 245f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif // TALK_BASE_MESSAGEQUEUE_H_ 246