]> arthur.barton.de Git - netatalk.git/blobdiff - libevent/bufferevent.c
Writing metadata xattr on directories with sticky bit set, FR#94
[netatalk.git] / libevent / bufferevent.c
index 4c9e38fa1abca07dab2a7f8ceb1497e5470c5df7..45a1437e70563e3868b19492e45e2fa61de2030d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2002-2007 Niels Provos <provos@citi.umich.edu>
- * 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)
 {