mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-18 12:43:44 -04:00
dynamic event queue
This commit is contained in:
parent
f51f95b9bd
commit
cdfdf30f97
@ -18,13 +18,14 @@
|
||||
|
||||
#include "eventQueue.h"
|
||||
#include "config_event.h"
|
||||
#include "mutexHolder.h"
|
||||
|
||||
EventQueue *EventQueue::_global_event_queue = NULL;
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: EventQueue::Constructor
|
||||
// Access: Public
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
EventQueue::
|
||||
@ -33,7 +34,7 @@ EventQueue() {
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: EventQueue::Destructor
|
||||
// Access: Public
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
EventQueue::
|
||||
@ -42,74 +43,76 @@ EventQueue::
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: EventQueue::queue_event
|
||||
// Access: Public
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void EventQueue::
|
||||
queue_event(CPT_Event event) {
|
||||
nassertv(!event.is_null());
|
||||
#ifdef OLD_HAVE_IPC
|
||||
mutex_lock lock(_lock);
|
||||
#endif
|
||||
if (_queue.full()) {
|
||||
event_cat.error()
|
||||
<< "Ignoring event " << *event << "; event queue full.\n";
|
||||
} else {
|
||||
_queue.push_back(event);
|
||||
if (event_cat.is_spam() || event_cat.is_debug()) {
|
||||
if (event->get_name() == "NewFrame") {
|
||||
// Don't bother us with this particularly spammy event.
|
||||
event_cat.spam()
|
||||
<< "Throwing event " << *event << "\n";
|
||||
} else {
|
||||
event_cat.debug()
|
||||
<< "Throwing event " << *event << "\n";
|
||||
}
|
||||
MutexHolder holder(_lock);
|
||||
|
||||
_queue.push_back(event);
|
||||
if (event_cat.is_spam() || event_cat.is_debug()) {
|
||||
if (event->get_name() == "NewFrame") {
|
||||
// Don't bother us with this particularly spammy event.
|
||||
event_cat.spam()
|
||||
<< "Throwing event " << *event << "\n";
|
||||
} else {
|
||||
event_cat.debug()
|
||||
<< "Throwing event " << *event << "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: EventQueue::clear
|
||||
// Access: Public
|
||||
// Access: Published
|
||||
// Description: Empties all events on the queue, throwing them on the
|
||||
// floor.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void EventQueue::
|
||||
clear() {
|
||||
while (!_queue.empty()) {
|
||||
_queue.pop_front();
|
||||
}
|
||||
MutexHolder holder(_lock);
|
||||
|
||||
_queue.clear();
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: EventQueue::is_queue_empty
|
||||
// Access: Public
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool EventQueue::
|
||||
is_queue_empty() const {
|
||||
MutexHolder holder(_lock);
|
||||
return _queue.empty();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: EventQueue::is_queue_full
|
||||
// Access: Published
|
||||
// Description: This function is deprecated--the queue is never full
|
||||
// these days.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool EventQueue::
|
||||
is_queue_full() const {
|
||||
return _queue.full();
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: EventQueue::dequeue_event
|
||||
// Access: Public
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
CPT_Event EventQueue::
|
||||
dequeue_event() {
|
||||
// We need no mutex protection here, as long as there is only one
|
||||
// thread extracting events. The magic of circular buffers.
|
||||
MutexHolder holder(_lock);
|
||||
|
||||
CPT_Event result = _queue.front();
|
||||
_queue.pop_front();
|
||||
|
||||
nassertr(!result.is_null(), result);
|
||||
return result;
|
||||
}
|
||||
|
@ -23,12 +23,8 @@
|
||||
|
||||
#include "event.h"
|
||||
#include "pt_Event.h"
|
||||
|
||||
#include "circBuffer.h"
|
||||
|
||||
#ifdef OLD_HAVE_IPC
|
||||
#include <ipc_mutex.h>
|
||||
#endif
|
||||
#include "pmutex.h"
|
||||
#include "pdeque.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : EventQueue
|
||||
@ -38,9 +34,6 @@
|
||||
// processed.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDA EventQueue {
|
||||
public:
|
||||
enum { max_events = 500 };
|
||||
|
||||
PUBLISHED:
|
||||
EventQueue();
|
||||
~EventQueue();
|
||||
@ -54,15 +47,14 @@ PUBLISHED:
|
||||
|
||||
INLINE static EventQueue *get_global_event_queue();
|
||||
|
||||
protected:
|
||||
CircBuffer<CPT_Event, max_events> _queue;
|
||||
|
||||
private:
|
||||
static void make_global_event_queue();
|
||||
static EventQueue *_global_event_queue;
|
||||
|
||||
#ifdef OLD_HAVE_IPC
|
||||
mutex _lock;
|
||||
#endif
|
||||
typedef pdeque<CPT_Event> Events;
|
||||
Events _queue;
|
||||
|
||||
Mutex _lock;
|
||||
};
|
||||
|
||||
#include "eventQueue.I"
|
||||
|
Loading…
x
Reference in New Issue
Block a user