From 1984b309b82f1dd07f0ee04bb618e4b4ff41a3fe Mon Sep 17 00:00:00 2001 From: Pietro Cerutti Date: Tue, 17 Jun 2014 17:04:44 +0200 Subject: Add hooks for read/write/cleanup --- adapters/qt.h | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 68 insertions(+), 4 deletions(-) (limited to 'adapters') diff --git a/adapters/qt.h b/adapters/qt.h index 54c0b91..9c801db 100644 --- a/adapters/qt.h +++ b/adapters/qt.h @@ -28,10 +28,46 @@ #include #include "../async.h" +static void RedisQtAddRead(void *); +static void RedisQtDelRead(void *); +static void RedisQtAddWrite(void *); +static void RedisQtDelWrite(void *); +static void RedisQtCleanup(void *); + class RedisQtAdapter : public QObject { Q_OBJECT + friend + void RedisQtAddRead(void * adapter) { + RedisQtAdapter * a = static_cast(adapter); + a->addRead(); + } + + friend + void RedisQtDelRead(void * adapter) { + RedisQtAdapter * a = static_cast(adapter); + a->delRead(); + } + + friend + void RedisQtAddWrite(void * adapter) { + RedisQtAdapter * a = static_cast(adapter); + a->addWrite(); + } + + friend + void RedisQtDelWrite(void * adapter) { + RedisQtAdapter * a = static_cast(adapter); + a->delWrite(); + } + + friend + void RedisQtCleanup(void * adapter) { + RedisQtAdapter * a = static_cast(adapter); + a->cleanup(); + } + public: RedisQtAdapter(QObject * parent = 0) : QObject(parent), m_ctx(0), m_read(0), m_write(0) { } @@ -40,16 +76,44 @@ class RedisQtAdapter : public QObject { void setContext(redisAsyncContext * ac) { m_ctx = ac; + m_ctx->ev.data = this; + m_ctx->ev.addRead = RedisQtAddRead; + m_ctx->ev.delRead = RedisQtDelRead; + m_ctx->ev.addWrite = RedisQtAddWrite; + m_ctx->ev.delWrite = RedisQtDelWrite; + m_ctx->ev.cleanup = RedisQtCleanup; + } - delete m_read; - m_read = new QSocketNotifier(ac->c.fd, QSocketNotifier::Read, this), + private: + void addRead() { + if (m_read) return; + m_read = new QSocketNotifier(m_ctx->c.fd, QSocketNotifier::Read, 0), connect(m_read, SIGNAL(activated(int)), this, SLOT(read())); + } - delete m_write; - m_write = new QSocketNotifier(ac->c.fd, QSocketNotifier::Write, this); + void delRead() { + if (!m_read) return; + delete m_read; + m_read = 0; + } + + void addWrite() { + if (m_write) return; + m_write = new QSocketNotifier(m_ctx->c.fd, QSocketNotifier::Write, 0); connect(m_write, SIGNAL(activated(int)), this, SLOT(write())); } + void delWrite() { + if (!m_write) return; + delete m_write; + m_write = 0; + } + + void cleanup() { + delRead(); + delWrite(); + } + private slots: void read() { redisAsyncHandleRead(m_ctx); } void write() { redisAsyncHandleWrite(m_ctx); } -- cgit v1.2.3