summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
77a021d)
This accidentally got slaughtered while moving to the new event backend. Now
messages are buffered in CoreSession until the event queue is empty, which means
that a bulk of incoming messages will completely be processed before inserting into
the database, resulting in a huge performance gain.
This buffers even more aggressive than the old version, as we process Qt events in between,
which means we'll receive and process any additional data from the socket before flushing the
message queue. The downside is that nothing will arrive in the client as long as your socket gets
flooded, but on the other hand, it will greatly reduce db I/O in such cases.
_eventQueue.removeFirst();
if(_eventQueue.count())
QCoreApplication::postEvent(this, new QEvent(QEvent::User));
_eventQueue.removeFirst();
if(_eventQueue.count())
QCoreApplication::postEvent(this, new QEvent(QEvent::User));
+ else
+ emit eventQueueEmptied();
}
void EventManager::dispatchEvent(Event *event) {
}
void EventManager::dispatchEvent(Event *event) {
*/
void sendEvent(Event *event);
*/
void sendEvent(Event *event);
+signals:
+ void eventQueueEmptied();
+
protected:
virtual void customEvent(QEvent *event);
protected:
virtual void customEvent(QEvent *event);
_ctcpParser(new CtcpParser(this)),
_ircParser(new IrcParser(this)),
scriptEngine(new QScriptEngine(this)),
_ctcpParser(new CtcpParser(this)),
_ircParser(new IrcParser(this)),
scriptEngine(new QScriptEngine(this)),
- _processMessages(false),
_ignoreListManager(this)
{
SignalProxy *p = signalProxy();
_ignoreListManager(this)
{
SignalProxy *p = signalProxy();
loadSettings();
initScriptEngine();
loadSettings();
initScriptEngine();
+ connect(eventManager(), SIGNAL(eventQueueEmptied()), SLOT(processMessages()));
eventManager()->registerObject(ircParser(), EventManager::NormalPriority);
eventManager()->registerObject(sessionEventProcessor(), EventManager::HighPriority); // needs to process events *before* the stringifier!
eventManager()->registerObject(ctcpParser(), EventManager::NormalPriority);
eventManager()->registerObject(ircParser(), EventManager::NormalPriority);
eventManager()->registerObject(sessionEventProcessor(), EventManager::HighPriority); // needs to process events *before* the stringifier!
eventManager()->registerObject(ctcpParser(), EventManager::NormalPriority);
CoreNetwork *net = network(bufinfo.networkId());
if(net) {
net->userInput(bufinfo, msg);
CoreNetwork *net = network(bufinfo.networkId());
if(net) {
net->userInput(bufinfo, msg);
+ // FIXME as soon as user input is event-based
+ // until then, user input doesn't trigger a message queue flush!
+ processMessages();
} else {
qWarning() << "Trying to send to unconnected network:" << msg;
}
} else {
qWarning() << "Trying to send to unconnected network:" << msg;
}
return;
_messageQueue << rawMsg;
return;
_messageQueue << rawMsg;
- if(!_processMessages) {
- _processMessages = true;
- QCoreApplication::postEvent(this, new ProcessMessagesEvent());
- }
}
void CoreSession::recvStatusMsgFromServer(QString msg) {
}
void CoreSession::recvStatusMsgFromServer(QString msg) {
return Core::requestBuffers(user());
}
return Core::requestBuffers(user());
}
-void CoreSession::customEvent(QEvent *event) {
- if(event->type() != QEvent::User)
+void CoreSession::processMessages() {
+ if(_messageQueue.isEmpty())
- processMessages();
- event->accept();
-}
-
-void CoreSession::processMessages() {
if(_messageQueue.count() == 1) {
const RawMessage &rawMsg = _messageQueue.first();
bool createBuffer = !(rawMsg.flags & Message::Redirected);
if(_messageQueue.count() == 1) {
const RawMessage &rawMsg = _messageQueue.first();
bool createBuffer = !(rawMsg.flags & Message::Redirected);
emit displayMsg(messages[i]);
}
}
emit displayMsg(messages[i]);
}
}
- _processMessages = false;
void recvStatusMsgFromServer(QString msg);
void recvMessageFromServer(NetworkId networkId, Message::Type, BufferInfo::Type, const QString &target, const QString &text, const QString &sender = "", Message::Flags flags = Message::None);
void recvStatusMsgFromServer(QString msg);
void recvMessageFromServer(NetworkId networkId, Message::Type, BufferInfo::Type, const QString &target, const QString &text, const QString &sender = "", Message::Flags flags = Message::None);
+ void processMessages();
void destroyNetwork(NetworkId);
void destroyNetwork(NetworkId);
void saveSessionState() const;
void saveSessionState() const;
-protected:
- virtual void customEvent(QEvent *event);
-
private:
void loadSettings();
void initScriptEngine();
private:
void loadSettings();
void initScriptEngine();
- void processMessages();
/// Hook for converting events to the old displayMsg() handlers
Q_INVOKABLE void processMessageEvent(MessageEvent *event);
/// Hook for converting events to the old displayMsg() handlers
Q_INVOKABLE void processMessageEvent(MessageEvent *event);
QScriptEngine *scriptEngine;
QList<RawMessage> _messageQueue;
QScriptEngine *scriptEngine;
QList<RawMessage> _messageQueue;
CoreIgnoreListManager _ignoreListManager;
};
CoreIgnoreListManager _ignoreListManager;
};