add pin/unpin functions, and a deref-and-free pair.

svn:r1165
This commit is contained in:
Nick Mathewson 2009-04-13 03:06:47 +00:00
parent dcda7915ac
commit 9f1a94ecec
2 changed files with 17 additions and 10 deletions

View File

@ -231,23 +231,21 @@ evbuffer_chain_insert(struct evbuffer *buf, struct evbuffer_chain *chain)
buf->total_len += chain->off; buf->total_len += chain->off;
} }
#ifdef NOT_USED_YET void
static void _evbuffer_chain_pin(struct evbuffer_chain *chain, unsigned flag)
evbuffer_chain_pin(struct evbuffer_chain *chain, unsigned flag)
{ {
assert((chain->flags & flag) == 0); assert((chain->flags & flag) == 0);
chain->flags |= flag; chain->flags |= flag;
} }
static void void
evbuffer_chain_unpin(struct evbuffer_chain *chain, unsigned flag) _evbuffer_chain_unpin(struct evbuffer_chain *chain, unsigned flag)
{ {
assert((chain->flags & flag) != 0); assert((chain->flags & flag) != 0);
chain->flags &= ~flag; chain->flags &= ~flag;
if (chain->flags & EVBUFFER_DANGLING) if (chain->flags & EVBUFFER_DANGLING)
evbuffer_chain_free(chain); evbuffer_chain_free(chain);
} }
#endif
struct evbuffer * struct evbuffer *
evbuffer_new(void) evbuffer_new(void)
@ -370,8 +368,7 @@ evbuffer_deferred_callback(struct deferred_cb *cb, void *arg)
EVBUFFER_LOCK(buffer, EVTHREAD_WRITE); EVBUFFER_LOCK(buffer, EVTHREAD_WRITE);
evbuffer_run_callbacks(buffer); evbuffer_run_callbacks(buffer);
evbuffer_free(buffer); /* release the reference */ _evbuffer_decref_and_unlock(buffer);
EVBUFFER_UNLOCK(buffer, EVTHREAD_WRITE);
} }
static void static void
@ -386,11 +383,11 @@ evbuffer_remove_all_callbacks(struct evbuffer *buffer)
} }
void void
evbuffer_free(struct evbuffer *buffer) _evbuffer_decref_and_unlock(struct evbuffer *buffer)
{ {
struct evbuffer_chain *chain, *next; struct evbuffer_chain *chain, *next;
ASSERT_EVBUFFER_LOCKED(buffer);
EVBUFFER_LOCK(buffer, EVTHREAD_WRITE);
if (--buffer->refcnt > 0) { if (--buffer->refcnt > 0) {
EVBUFFER_UNLOCK(buffer, EVTHREAD_WRITE); EVBUFFER_UNLOCK(buffer, EVTHREAD_WRITE);
return; return;
@ -410,6 +407,13 @@ evbuffer_free(struct evbuffer *buffer)
mm_free(buffer); mm_free(buffer);
} }
void
evbuffer_free(struct evbuffer *buffer)
{
EVBUFFER_LOCK(buffer, EVTHREAD_WRITE);
_evbuffer_decref_and_unlock(buffer);
}
void void
evbuffer_lock(struct evbuffer *buf) evbuffer_lock(struct evbuffer *buf)
{ {

View File

@ -194,6 +194,9 @@ struct evbuffer_chain_reference {
} while(0) } while(0)
void _evbuffer_incref(struct evbuffer *buf); void _evbuffer_incref(struct evbuffer *buf);
void _evbuffer_chain_pin(struct evbuffer_chain *chain, unsigned flag);
void _evbuffer_chain_unpin(struct evbuffer_chain *chain, unsigned flag);
void _evbuffer_decref_and_unlock(struct evbuffer *buffer);
#ifdef _EVENT_HAVE_SYS_UIO_H #ifdef _EVENT_HAVE_SYS_UIO_H
int _evbuffer_read_setup_vecs(struct evbuffer *buf, ssize_t howmuch, int _evbuffer_read_setup_vecs(struct evbuffer *buf, ssize_t howmuch,