You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ae.h 2.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include <sys/types.h>
  2. #include <ae.h>
  3. #include "../hiredis.h"
  4. #include "../async.h"
  5. typedef struct redisAeEvents {
  6. redisAsyncContext *context;
  7. aeEventLoop *loop;
  8. int fd;
  9. int reading, writing;
  10. } redisAeEvents;
  11. void redisAeReadEvent(aeEventLoop *el, int fd, void *privdata, int mask) {
  12. ((void)el); ((void)fd); ((void)mask);
  13. redisAeEvents *e = (redisAeEvents*)privdata;
  14. redisAsyncHandleRead(e->context);
  15. }
  16. void redisAeWriteEvent(aeEventLoop *el, int fd, void *privdata, int mask) {
  17. ((void)el); ((void)fd); ((void)mask);
  18. redisAeEvents *e = (redisAeEvents*)privdata;
  19. redisAsyncHandleWrite(e->context);
  20. }
  21. void redisAeAddRead(void *privdata) {
  22. redisAeEvents *e = (redisAeEvents*)privdata;
  23. aeEventLoop *loop = e->loop;
  24. if (!e->reading) {
  25. e->reading = 1;
  26. aeCreateFileEvent(loop,e->fd,AE_READABLE,redisAeReadEvent,e);
  27. }
  28. }
  29. void redisAeDelRead(void *privdata) {
  30. redisAeEvents *e = (redisAeEvents*)privdata;
  31. aeEventLoop *loop = e->loop;
  32. if (e->reading) {
  33. e->reading = 0;
  34. aeDeleteFileEvent(loop,e->fd,AE_READABLE);
  35. }
  36. }
  37. void redisAeAddWrite(void *privdata) {
  38. redisAeEvents *e = (redisAeEvents*)privdata;
  39. aeEventLoop *loop = e->loop;
  40. if (!e->writing) {
  41. e->writing = 1;
  42. aeCreateFileEvent(loop,e->fd,AE_WRITABLE,redisAeWriteEvent,e);
  43. }
  44. }
  45. void redisAeDelWrite(void *privdata) {
  46. redisAeEvents *e = (redisAeEvents*)privdata;
  47. aeEventLoop *loop = e->loop;
  48. if (e->writing) {
  49. e->writing = 0;
  50. aeDeleteFileEvent(loop,e->fd,AE_WRITABLE);
  51. }
  52. }
  53. void redisAeCleanup(void *privdata) {
  54. redisAeEvents *e = (redisAeEvents*)privdata;
  55. redisAeDelRead(privdata);
  56. redisAeDelWrite(privdata);
  57. free(e);
  58. }
  59. int redisAeAttach(aeEventLoop *loop, redisAsyncContext *ac) {
  60. redisContext *c = &(ac->c);
  61. redisAeEvents *e;
  62. /* Nothing should be attached when something is already attached */
  63. if (ac->ev.data != NULL)
  64. return REDIS_ERR;
  65. /* Create container for context and r/w events */
  66. e = (redisAeEvents*)malloc(sizeof(*e));
  67. e->context = ac;
  68. e->loop = loop;
  69. e->fd = c->fd;
  70. e->reading = e->writing = 0;
  71. /* Register functions to start/stop listening for events */
  72. ac->ev.addRead = redisAeAddRead;
  73. ac->ev.delRead = redisAeDelRead;
  74. ac->ev.addWrite = redisAeAddWrite;
  75. ac->ev.delWrite = redisAeDelWrite;
  76. ac->ev.cleanup = redisAeCleanup;
  77. ac->ev.data = e;
  78. return REDIS_OK;
  79. }