Date: Sun, 15 Oct 1995 11:21:25 +0000 From: Matt Thomas <matt@lkg.dec.com> To: Julian Elischer <julian@freefall.freebsd.org> Cc: hackers@freefall.freebsd.org Subject: Re: suggested changes to mbuf routines Message-ID: <199510151123.LAA01923@whydos.lkg.dec.com> In-Reply-To: Your message of "Sat, 14 Oct 1995 04:19:35 MST." <199510141119.EAA05158@freefall.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
In <199510141119.EAA05158@freefall.freebsd.org> , you wrote:
I find the method of doing the references as done in Digital UNIX
(aka DEC OSF/1) quite clean. Basically the m_ext struct gets an
queue entry added. When the extended mbuf is first allocated, the
link queue entry merely points to itself (an empty queue). As more
references are made, their queues get linked together. As references
are removed, their queues get unlinked.
To see if there is a non-zero reference count, imply see if the queue
entry points to itself.
/* description of external storage mapped into mbuf, valid if M_EXT set */
struct m_ext {
caddr_t ext_buf; /* start of buffer */
#if __STDC__
void (*ext_free)(caddr_t, u_long, caddr_t);
#else
void (*ext_free)(); /* free routine if not the usual */
#endif
u_int ext_size; /* size of buffer, for ext_free */
caddr_t ext_arg; /* additional ext_free argument */
struct ext_refq { /* reference list */
struct ext_refq *forw, *back;
} ext_ref;
};
#define MCLREFERENCED(m) \
((m)->m_ext.ext_ref.forw != &((m)->m_ext.ext_ref))
Matt Thomas Internet: matt@lkg.dec.com
3am Software Foundry WWW URL: <currently homeless>
Westford, MA Disclaimer: Digital disavows all knowledge
of this message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199510151123.LAA01923>
