X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=netatalk.git;a=blobdiff_plain;f=libevent%2Fbufferevent.c;h=45a1437e70563e3868b19492e45e2fa61de2030d;hp=4c9e38fa1abca07dab2a7f8ceb1497e5470c5df7;hb=3a84db87064922ad10ac10cc1d6833380e575995;hpb=f357762920325c7d84ec891e468655fea5b4473e diff --git a/libevent/bufferevent.c b/libevent/bufferevent.c index 4c9e38fa..45a1437e 100644 --- a/libevent/bufferevent.c +++ b/libevent/bufferevent.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2002-2007 Niels Provos - * Copyright (c) 2007-2010 Niels Provos, Nick Mathewson + * Copyright (c) 2007-2012 Niels Provos, Nick Mathewson * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -59,6 +59,9 @@ #include "evbuffer-internal.h" #include "util-internal.h" +static void _bufferevent_cancel_all(struct bufferevent *bev); + + void bufferevent_suspend_read(struct bufferevent *bufev, bufferevent_suspend_flags what) { @@ -473,6 +476,24 @@ bufferevent_settimeout(struct bufferevent *bufev, } +int +bufferevent_disable_hard(struct bufferevent *bufev, short event) +{ + int r = 0; + struct bufferevent_private *bufev_private = + EVUTIL_UPCAST(bufev, struct bufferevent_private, bev); + + BEV_LOCK(bufev); + bufev->enabled &= ~event; + + bufev_private->connecting = 0; + if (bufev->be_ops->disable(bufev, event) < 0) + r = -1; + + BEV_UNLOCK(bufev); + return r; +} + int bufferevent_disable(struct bufferevent *bufev, short event) { @@ -656,6 +677,7 @@ bufferevent_free(struct bufferevent *bufev) { BEV_LOCK(bufev); bufferevent_setcb(bufev, NULL, NULL, NULL, NULL); + _bufferevent_cancel_all(bufev); _bufferevent_decref_and_unlock(bufev); } @@ -732,6 +754,17 @@ bufferevent_getfd(struct bufferevent *bev) return (res<0) ? -1 : d.fd; } +static void +_bufferevent_cancel_all(struct bufferevent *bev) +{ + union bufferevent_ctrl_data d; + memset(&d, 0, sizeof(d)); + BEV_LOCK(bev); + if (bev->be_ops->ctrl) + bev->be_ops->ctrl(bev, BEV_CTRL_CANCEL_ALL, &d); + BEV_UNLOCK(bev); +} + short bufferevent_get_enabled(struct bufferevent *bufev) {