Difference between DList and SList from garbage collector point of view
Alexandr Druzhinin
drug2004 at bk.ru
Mon Feb 25 21:02:04 PST 2013
25.02.2013 3:59, monarch_dodra пишет:
>
> I don't see any any calls to remove, so I'm not sure what the algorithm
> is. Wouldn't patch just grow and grow and grow?
>
> Regardless, the design of DList is currently flawed (but a pull is open
> to fix it), in the sense that a DList is just a "handle" on a chain of
> nodes.
>
> The problem with this approach is that calls to things such as
> "removeFront()" or "removeFront(n)" merelly reposition the "first"
> pointer. However, the nodes are never actually un-linked. I'd say there
> are good chances this is what you are seeing.
>
> Seeing a DList doesn't have splice either, I'm unsure what to tell you
> in regards to working around it.
>
> I'd say once you are done with a list, you can try to "dup" it: This
> will allocate *more*, but will allow the GC to collect everything that
> was previously removed.
>
> ...Or just SList. It's "less" bugged.
>
> See this:
> http://forum.dlang.org/thread/gjhclwsuqyhrimdeoaec@forum.dlang.org
After some research I think that this situation is due to several
reasons set and DList isn't single cause.
patch is local var:
class DataChunk {
uint source_id;
uint id;
...
}
class DataStorage {
DList!DataChunk patch;
(RedBlackTree!DataChunk)[uint] _container_map;
...
auto getPatch(uint source, long last) {
bool isNewer(DataChunk dc) {
if(dc.source_id == source && dc.id > last)
return true;
else
return false;
}
Patch patch;
foreach(datachunk; find!isNewer(_container_map[source][])) {
patch.insertFront(datachunk);
}
}
}
so it doesn't grow.
More information about the Digitalmars-d-learn
mailing list