Ring buffer, linked list, etc.
Christopher R. Hertel
crh at ubiqx.mn.org
Sun Aug 7 05:06:40 GMT 2005
We also talked about using skip lists for the event queue, but the problem
we ran into was: If we get an arbitrary delete (caused by an event
actually occuring) the skip list pointers would no longer be valid and
could mess things up.
So: If we pre-tallocate blocks of doubly-linked-list nodes (in, say,
groups of 128 nodes each), then instead of freeing the memory when a
node is deleted we would:
= remove it from the event list
= add it to a singly-linked free list
= set the event timeout value to zero
In the event queue, only the first node in the linked list will have
a NULL previous pointer, so we can ignore skip list pointers that
point to nodes with a NULL previous pointer. We would probably mark
them as unused so that they can be re-used (another free list).
If the free list ever runs out, we would tallocate another 128
(or whatever) nodes and rebuild the node free list.
I'm thinking that we would probably set aside one skip node per 128
event nodes. The skip nodes could also be arranged as a
I'd like to code this up. I have a very full week at work, however, and
my kids haven't seen me for a week so if anyone else wants to do it please
go ahead. :)
On Sat, Aug 06, 2005 at 10:43:43PM -0500, Christopher R. Hertel wrote:
> Tridge, Volker,
> Once I got home and had my first decent cup of tea in a week, a thought
> occurred to me regarding the idea of using a ring buffer.
> As I understand it, f an event is received before the queue entry times
> out then the entry is removed from the event queue. This is done by way
> of a pointer directly to the event queue entry.
> With a doubly-linked-list or a binary tree, that removal can occur without
> any traversal of the list. The pointer to the event node is all you need.
> If we build a ring buffer, however, and use memmove() to open spaces when
> we need to insert new nodes, we'll mess up any external pointers. You'll
> have to search for the correct node each time.
> Using a ring buffer, the way to get around this is to mark nodes as
> "Deleted" if the event arrives before timeout.
> That still leaves the problem of adding new nodes to the ring buffer. I
> have some ideas on how to do that...
> Let me know first, though, if I've misunderstood the way this code
> Chris -)-----
> "Implementing CIFS - the Common Internet FileSystem" ISBN: 013047116X
> Samba Team -- http://www.samba.org/ -)----- Christopher R. Hertel
> jCIFS Team -- http://jcifs.samba.org/ -)----- ubiqx development, uninq.
> ubiqx Team -- http://www.ubiqx.org/ -)----- crh at ubiqx.mn.org
> OnLineBook -- http://ubiqx.org/cifs/ -)----- crh at ubiqx.org
"Implementing CIFS - the Common Internet FileSystem" ISBN: 013047116X
Samba Team -- http://www.samba.org/ -)----- Christopher R. Hertel
jCIFS Team -- http://jcifs.samba.org/ -)----- ubiqx development, uninq.
ubiqx Team -- http://www.ubiqx.org/ -)----- crh at ubiqx.mn.org
OnLineBook -- http://ubiqx.org/cifs/ -)----- crh at ubiqx.org
More information about the samba-technical