]> granicus.if.org Git - libevent/commitdiff
added comments to describe refcounting of multicase chains
authorJoachim Bauch <mail@joachim-bauch.de>
Mon, 17 Oct 2011 19:46:12 +0000 (21:46 +0200)
committerJoachim Bauch <mail@joachim-bauch.de>
Mon, 17 Oct 2011 19:46:12 +0000 (21:46 +0200)
buffer.c

index e2c7f2f81f0b81e32251015cff5775a7b1f497c5..8a0020c1777a38713fc020f2d2073f4b1ae70a42 100644 (file)
--- a/buffer.c
+++ b/buffer.c
@@ -192,7 +192,9 @@ evbuffer_chain_free(struct evbuffer_chain *chain)
                // chain is still referenced by other chains
                return;
        }
-    
+       
+       // save to release chain, it's either a referencing
+       // chain or all references to it have been freed
        if (chain->flags & EVBUFFER_REFERENCE) {
                struct evbuffer_chain_reference *info =
                    EVBUFFER_CHAIN_EXTRA(
@@ -221,6 +223,10 @@ evbuffer_chain_free(struct evbuffer_chain *chain)
                    EVBUFFER_CHAIN_EXTRA(
                            struct evbuffer_multicast_parent,
                            chain);
+               // referencing chain is being freed, decrease
+               // refcounts of source chain and associated
+               // evbuffer (which get freed once both reach
+               // zero)
                EVUTIL_ASSERT(info->source != NULL);
                EVUTIL_ASSERT(info->parent != NULL);
                EVBUFFER_LOCK(info->source);
@@ -835,9 +841,12 @@ APPEND_CHAIN_MULTICAST(struct evbuffer *dst, struct evbuffer *src)
                        return;
                }
                extra = EVBUFFER_CHAIN_EXTRA(struct evbuffer_multicast_parent, tmp);
-               // reference source chain which now becomes immutable
+               // reference evbuffer containing source chain so it
+               // doesn't get released while the chain is still
+               // being referenced to
                _evbuffer_incref(src);
                extra->source = src;
+               // reference source chain which now becomes immutable
                evbuffer_chain_incref(chain);
                extra->parent = chain;
                chain->flags |= EVBUFFER_IMMUTABLE;