Merge branch 'master' into issue237

This commit is contained in:
Mark Ellzey 2015-05-11 12:34:30 -04:00
commit d9f6140b6b
3 changed files with 39 additions and 6 deletions

View File

@ -327,14 +327,17 @@ int bufferevent_disable_hard_(struct bufferevent *bufev, short event);
/** Internal: Set up locking on a bufferevent. If lock is set, use it. /** Internal: Set up locking on a bufferevent. If lock is set, use it.
* Otherwise, use a new lock. */ * Otherwise, use a new lock. */
int bufferevent_enable_locking_(struct bufferevent *bufev, void *lock); int bufferevent_enable_locking_(struct bufferevent *bufev, void *lock);
/** Internal: Increment the reference count on bufev. */ /** Internal: backwards compat macro for the now public function
void bufferevent_incref_(struct bufferevent *bufev); * Increment the reference count on bufev. */
#define bufferevent_incref_(bufev) bufferevent_incref(bufev)
/** Internal: Lock bufev and increase its reference count. /** Internal: Lock bufev and increase its reference count.
* unlocking it otherwise. */ * unlocking it otherwise. */
void bufferevent_incref_and_lock_(struct bufferevent *bufev); void bufferevent_incref_and_lock_(struct bufferevent *bufev);
/** Internal: Decrement the reference count on bufev. Returns 1 if it freed /** Internal: backwards compat macro for the now public function
* Decrement the reference count on bufev. Returns 1 if it freed
* the bufferevent.*/ * the bufferevent.*/
int bufferevent_decref_(struct bufferevent *bufev); #define bufferevent_decref_(bufev) bufferevent_decref(bufev)
/** Internal: Drop the reference count on bufev, freeing as necessary, and /** Internal: Drop the reference count on bufev, freeing as necessary, and
* unlocking it otherwise. Returns 1 if it freed the bufferevent. */ * unlocking it otherwise. Returns 1 if it freed the bufferevent. */
int bufferevent_decref_and_unlock_(struct bufferevent *bufev); int bufferevent_decref_and_unlock_(struct bufferevent *bufev);

View File

@ -777,7 +777,7 @@ bufferevent_finalize_cb_(struct event_callback *evcb, void *arg_)
} }
int int
bufferevent_decref_(struct bufferevent *bufev) bufferevent_decref(struct bufferevent *bufev)
{ {
BEV_LOCK(bufev); BEV_LOCK(bufev);
return bufferevent_decref_and_unlock_(bufev); return bufferevent_decref_and_unlock_(bufev);
@ -793,11 +793,15 @@ bufferevent_free(struct bufferevent *bufev)
} }
void void
bufferevent_incref_(struct bufferevent *bufev) bufferevent_incref(struct bufferevent *bufev)
{ {
struct bufferevent_private *bufev_private = struct bufferevent_private *bufev_private =
EVUTIL_UPCAST(bufev, struct bufferevent_private, bev); EVUTIL_UPCAST(bufev, struct bufferevent_private, bev);
/* XXX: now that this function is public, we might want to
* - return the count from this function
* - create a new function to atomically grab the current refcount
*/
BEV_LOCK(bufev); BEV_LOCK(bufev);
++bufev_private->refcnt; ++bufev_private->refcnt;
BEV_UNLOCK(bufev); BEV_UNLOCK(bufev);

View File

@ -562,6 +562,32 @@ void bufferevent_lock(struct bufferevent *bufev);
EVENT2_EXPORT_SYMBOL EVENT2_EXPORT_SYMBOL
void bufferevent_unlock(struct bufferevent *bufev); void bufferevent_unlock(struct bufferevent *bufev);
/**
* Public interface to manually increase the reference count of a bufferevent
* this is useful in situations where a user may reference the bufferevent
* somewhere eles (unknown to libevent)
*
* @param bufev the bufferevent to increase the refcount on
*
*/
EVENT2_EXPORT_SYMBOL
void bufferevent_incref(struct bufferevent *bufev);
/**
* Public interface to manually decrement the reference count of a bufferevent
*
* Warning: make sure you know what you're doing. This is mainly used in
* conjunction with bufferevent_incref(). This will free up all data associated
* with a bufferevent if the reference count hits 0.
*
* @param bufev the bufferevent to decrement the refcount on
*
* @return 1 if the bufferevent was freed, otherwise 0 (still referenced)
*/
EVENT2_EXPORT_SYMBOL
int bufferevent_decref(struct bufferevent *bufev);
/** /**
Flags that can be passed into filters to let them know how to Flags that can be passed into filters to let them know how to
deal with the incoming data. deal with the incoming data.