VuMessageQueue

  friend class VuTargetEntity;
public:
  VuMessageQueue(int queueSize, VuMessageFilter *filter = 0);
  ~VuMessageQueue();

  VuMessage *PeekVuMessage() { return *read_; }
  virtual VuMessage *DispatchVuMessage(VU_BOOL autod = FALSE);
  int DispatchAllMessages(VU_BOOL autod = FALSE);
  static int PostVuMessage(VuMessage *event);
  static void FlushAllQueues();
  static int InvalidateMessages(VU_BOOL (*evalFunc)(VuMessage*, void*), void *);
  int InvalidateQueueMessages(VU_BOOL (*evalFunc)(VuMessage*, void*), void *);

protected:
  // called when queue is about to wrap -- default does nothing & returns FALSE
  virtual VU_BOOL ReallocQueue();

  virtual int AddMessage(VuMessage *event); // called only by PostVuMessage()
  static void RepostMessage(VuMessage *event, int delay);

// DATA
protected:
  VuMessage **head_;    // also queue mem store
  VuMessage **read_;
  VuMessage **write_;
  VuMessage **tail_;

  VuMessageFilter *filter_;

private:
  static VuMessageQueue *queuecollhead_;
  VuMessageQueue *nextqueue_;
};