Hi,

while reading some code which used buffered events, i saw that
you really have to define callbacks for read, write and error,
even if you do not care about one of them.
Is there a reason for that?

This ends up in ugly code, defining empty functions as callbacks.
The problem is, that bufferevent_new enables EV_WRITE and
EV_READ regardless of beeing defined not NULL. (On OpenBSD only
EV_WRITE currently)

If there is no reason for that, i would suggest to apply the
following diff. It fixes the problem for me. :)

Thanks for the great work Niels.
So long...

/dev/rainer

--- evbuffer.c  2005-04-20 00:55:45.000000000 +0200
+++ ../evbuffer.c       2006-07-27 20:59:44.000000000 +0200
@@ -136,7 +136,8 @@
        return;
 
  error:
-       (*bufev->errorcb)(bufev, what, bufev->cbarg);
+       if (*bufev->errorcb != NULL)
+               (*bufev->errorcb)(bufev, what, bufev->cbarg);
 }
 
 static void
@@ -186,7 +187,8 @@
        return;
 
  error:
-       (*bufev->errorcb)(bufev, what, bufev->cbarg);
+       if (*bufev->errorcb != NULL)
+               (*bufev->errorcb)(bufev, what, bufev->cbarg);
 }
 
 /*
@@ -217,8 +219,15 @@
                return (NULL);
        }
 
-       event_set(&bufev->ev_read, fd, EV_READ, bufferevent_readcb, bufev);
-       event_set(&bufev->ev_write, fd, EV_WRITE, bufferevent_writecb, bufev);
+       if (readcb != NULL) {
+               event_set(&bufev->ev_read, fd, EV_READ, bufferevent_readcb, 
bufev);
+               bufev->enabled = EV_READ;
+       }
+
+       if (writecb != NULL) {
+               event_set(&bufev->ev_write, fd, EV_WRITE, bufferevent_writecb, 
bufev);
+               bufev->enabled = EV_WRITE;
+       }
 
        bufev->readcb = readcb;
        bufev->writecb = writecb;
@@ -226,8 +235,6 @@
 
        bufev->cbarg = cbarg;
 
-       bufev->enabled = EV_READ | EV_WRITE;
-
        return (bufev);
 }
 
_______________________________________________
Libevent-users mailing list
Libevent-users@monkey.org
http://monkey.org/mailman/listinfo/libevent-users

Reply via email to