libev/libc-ares migration
authorWilfried Goesgens <dothebart@citadel.org>
Sat, 8 Jan 2011 21:31:34 +0000 (22:31 +0100)
committerWilfried Goesgens <dothebart@citadel.org>
Sat, 8 Jan 2011 21:31:34 +0000 (22:31 +0100)
  - no, c-ares does need a write and a send wrapper.

citadel/event_client.h
citadel/modules/c-ares-dns/serv_c-ares-dns.c

index cfb8d031beb42c1d36ac6759c75000ce9a84c6de..f9cf037b5967fe907b08ef3449724a4d950dbe88 100644 (file)
@@ -38,7 +38,8 @@ struct AsyncIO {
                eNextState NextState;
        ev_io recv_event, 
                send_event, 
-               dns_io_event;
+               dns_recv_event, 
+               dns_send_event;
        StrBuf *ErrMsg; /* if we fail to connect, or lookup, error goes here. */
 
        /* read/send related... */
index 6d410efa1064cb0696f7e21ae6369caa47d23db2..9cd52b9afb9daa1ea468e7519990161b21ab12d0 100644 (file)
@@ -290,30 +290,48 @@ int QueueQuery(ns_type Type, char *name, AsyncIO *IO, IO_CallBack PostDNS)
        return 1;
 }
 
-static void DNS_io_callback(struct ev_loop *loop, ev_io *watcher, int revents)
+static void DNS_send_callback(struct ev_loop *loop, ev_io *watcher, int revents)
 {
        AsyncIO *IO = watcher->data;
        
-       ares_process_fd(IO->DNSChannel, IO->dns_io_event.fd, 0);
+       ares_process_fd(IO->DNSChannel, ARES_SOCKET_BAD, IO->dns_send_event.fd);
+}
+static void DNS_recv_callback(struct ev_loop *loop, ev_io *watcher, int revents)
+{
+       AsyncIO *IO = watcher->data;
+       
+       ares_process_fd(IO->DNSChannel, IO->dns_recv_event.fd, ARES_SOCKET_BAD);
 }
 
 void SockStateCb(void *data, int sock, int read, int write) 
 {
+/*
        struct timeval tvbuf, maxtv, *ret;
        
        int64_t time = 10;
+*/
        AsyncIO *IO = data;
 /* already inside of the event queue. */       
 
-       if ((read == 0) && (write == 0)) {
-//             ev_io_stop(event_base, &IO->dns_io_event);
-       } else if (IO->dns_io_event.fd != sock) {
-               if (IO->dns_io_event.fd != 0) {
-                       ev_io_stop(event_base, &IO->dns_io_event);
+       if (read) {
+               if ((IO->dns_recv_event.fd != sock) &&
+                   (IO->dns_recv_event.fd != 0)) {
+                       ev_io_stop(event_base, &IO->dns_recv_event);
+               }
+               IO->dns_recv_event.fd = sock;
+               ev_io_init(&IO->dns_recv_event, DNS_recv_callback, IO->dns_recv_event.fd, EV_READ);
+               IO->dns_recv_event.data = IO;
+
+       } else if (write) {
+               if ((IO->dns_send_event.fd != sock) &&
+                   (IO->dns_send_event.fd != 0)) {
+                       ev_io_stop(event_base, &IO->dns_send_event);
                }
-               IO->dns_io_event.fd = sock;
-               ev_io_init(&IO->dns_io_event, DNS_io_callback, IO->dns_io_event.fd, EV_READ|EV_WRITE);
-               IO->dns_io_event.data = IO;
+               IO->dns_send_event.fd = sock;
+               ev_io_init(&IO->dns_send_event, DNS_send_callback, IO->dns_send_event.fd, EV_WRITE);
+               IO->dns_send_event.data = IO;
+       }
+/*
 
                ev_io_start(event_base, &IO->dns_io_event);
        
@@ -322,6 +340,9 @@ void SockStateCb(void *data, int sock, int read, int write)
                
                ret = ares_timeout(IO->DNSChannel, &maxtv, &tvbuf);
        }
+       if ((read == 0) && (write == 0)) {
+//             ev_io_stop(event_base, &IO->dns_io_event);
+*/
 }
 
 CTDL_MODULE_INIT(c_ares_client)