]> granicus.if.org Git - libevent/commitdiff
Add reference counts to bufferevents.
authorNick Mathewson <nickm@torproject.org>
Fri, 17 Apr 2009 06:57:38 +0000 (06:57 +0000)
committerNick Mathewson <nickm@torproject.org>
Fri, 17 Apr 2009 06:57:38 +0000 (06:57 +0000)
svn:r1189

bufferevent-internal.h
bufferevent.c

index b1026f681370a679522f896cf3885ecf7bb5f423..1fb78716094af96e9b3de1eaa7301bfe0e88d363 100644 (file)
@@ -110,6 +110,8 @@ void bufferevent_wm_suspend_read(struct bufferevent *bufev);
 void bufferevent_wm_unsuspend_read(struct bufferevent *bufev);
 
 int bufferevent_enable_locking(struct bufferevent *bufev, void *lock);
+void bufferevent_incref(struct bufferevent *bufev);
+void _bufferevent_decref_and_unlock(struct bufferevent *bufev);
 
 #define BEV_UPCAST(b) EVUTIL_UPCAST((b), struct bufferevent_private, bev)
 
index f0d7bfdfd84eb71d49c5e6e56410267cf66e964c..7b6c94f2458164404e618f17a08a363fa8f08708 100644 (file)
@@ -128,6 +128,7 @@ bufferevent_init_common(struct bufferevent_private *bufev_private,
                return -1;
        }
 
+       bufev_private->refcnt = 1;
        bufev->ev_base = base;
 
        /* Disable timeouts. */
@@ -367,8 +368,16 @@ bufferevent_flush(struct bufferevent *bufev,
 }
 
 void
-bufferevent_free(struct bufferevent *bufev)
+_bufferevent_decref_and_unlock(struct bufferevent *bufev)
 {
+       struct bufferevent_private *bufev_private =
+           EVUTIL_UPCAST(bufev, struct bufferevent_private, bev);
+
+       if (--bufev_private->refcnt) {
+               BEV_UNLOCK(bufev);
+               return;
+       }
+
        /* Clean up the shared info */
        if (bufev->be_ops->destruct)
                bufev->be_ops->destruct(bufev);
@@ -377,9 +386,30 @@ bufferevent_free(struct bufferevent *bufev)
        evbuffer_free(bufev->input);
        evbuffer_free(bufev->output);
 
+       BEV_UNLOCK(bufev);
+       if (bufev_private->own_lock)
+               EVTHREAD_FREE_LOCK(bufev_private->lock);
+
        /* Free the actual allocated memory. */
        mm_free(bufev - bufev->be_ops->mem_offset);
-       /* Free lock XXX */
+}
+
+void
+bufferevent_free(struct bufferevent *bufev)
+{
+       BEV_LOCK(bufev);
+       _bufferevent_decref_and_unlock(bufev);
+}
+
+void
+bufferevent_incref(struct bufferevent *bufev)
+{
+       struct bufferevent_private *bufev_private =
+           EVUTIL_UPCAST(bufev, struct bufferevent_private, bev);
+
+       BEV_LOCK(bufev);
+       ++bufev_private->refcnt;
+       BEV_UNLOCK(bufev);
 }
 
 int