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)
return -1;
}
+ bufev_private->refcnt = 1;
bufev->ev_base = base;
/* Disable timeouts. */
}
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);
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