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.

libevent.h 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include <event.h>
  2. #include "../hiredis.h"
  3. #include "../async.h"
  4. typedef struct redisLibeventEvents {
  5. redisAsyncContext *context;
  6. struct event rev, wev;
  7. } redisLibeventEvents;
  8. void redisLibeventReadEvent(int fd, short event, void *arg) {
  9. ((void)fd); ((void)event);
  10. redisLibeventEvents *e = (redisLibeventEvents*)arg;
  11. redisAsyncHandleRead(e->context);
  12. }
  13. void redisLibeventWriteEvent(int fd, short event, void *arg) {
  14. ((void)fd); ((void)event);
  15. redisLibeventEvents *e = (redisLibeventEvents*)arg;
  16. redisAsyncHandleWrite(e->context);
  17. }
  18. void redisLibeventAddRead(void *privdata) {
  19. redisLibeventEvents *e = (redisLibeventEvents*)privdata;
  20. event_add(&e->rev,NULL);
  21. }
  22. void redisLibeventDelRead(void *privdata) {
  23. redisLibeventEvents *e = (redisLibeventEvents*)privdata;
  24. event_del(&e->rev);
  25. }
  26. void redisLibeventAddWrite(void *privdata) {
  27. redisLibeventEvents *e = (redisLibeventEvents*)privdata;
  28. event_add(&e->wev,NULL);
  29. }
  30. void redisLibeventDelWrite(void *privdata) {
  31. redisLibeventEvents *e = (redisLibeventEvents*)privdata;
  32. event_del(&e->wev);
  33. }
  34. void redisLibeventCleanup(void *privdata) {
  35. redisLibeventEvents *e = (redisLibeventEvents*)privdata;
  36. event_del(&e->rev);
  37. event_del(&e->wev);
  38. free(e);
  39. }
  40. int redisLibeventAttach(redisAsyncContext *ac, struct event_base *base) {
  41. redisContext *c = &(ac->c);
  42. redisLibeventEvents *e;
  43. /* Nothing should be attached when something is already attached */
  44. if (ac->ev.data != NULL)
  45. return REDIS_ERR;
  46. /* Create container for context and r/w events */
  47. e = (redisLibeventEvents*)malloc(sizeof(*e));
  48. e->context = ac;
  49. /* Register functions to start/stop listening for events */
  50. ac->ev.addRead = redisLibeventAddRead;
  51. ac->ev.delRead = redisLibeventDelRead;
  52. ac->ev.addWrite = redisLibeventAddWrite;
  53. ac->ev.delWrite = redisLibeventDelWrite;
  54. ac->ev.cleanup = redisLibeventCleanup;
  55. ac->ev.data = e;
  56. /* Initialize and install read/write events */
  57. event_set(&e->rev,c->fd,EV_READ,redisLibeventReadEvent,e);
  58. event_set(&e->wev,c->fd,EV_WRITE,redisLibeventWriteEvent,e);
  59. event_base_set(base,&e->rev);
  60. event_base_set(base,&e->wev);
  61. return REDIS_OK;
  62. }