Peter Dimov wrote:
Larry Evans wrote:

Chuck Messenger wrote:

The basic idea is to intercept all memory allocations -- p = new X;
--
saving the info with "map[p] = sizeof(X);".  To find the
interconnections between objects, you do this:

   for (map_type::iterator it = map.begin(); it != map.end(); ++it)
       { char *p = it->first;
       unsigned size = it->second;
       for (char *v = p; v + 4 <= p + size; v += 4) {
           char *q = *(reinterpret_cast<char **>(v));
           if (map.count(q)) {
               // connection detected from object p to object q
           }
       }
   }

This is similar to Mirek Fidler's code:



http://groups.google.com/groups?q=OGC2+-+major+improvement+group:comp.lang.c%2B%2B.moderated&hl=en&lr=&ie=UTF-8&group=comp.lang.c%2B%2B.moderated&selm=3DCD36C3.4090502%40nospam_prodigy.net&rnum=1


If by "similar to" you mean "derived from" or "inspired by" (an euphemism
for "plagiarized" or "borrowed" which is itself an e. f. "stolen") then no,
it is not "similar". sp_collector.cpp is written entirely from scratch. It
I very much apologize for the possible implication made by my poor choice
of words.
is not even derived from or inspired by (no quotes) Greg's cyclic_ptr
although of course as the implemented algorithm is basically the same there
are obvious similarities.

FWIW, it is not similar (no quotes) to Mirek Fidler's code, either. I just
checked.
By similarity, I was referring to the fact that each allocated object
had it's size stored somewhere (it->second in the above) and that
the memory was scanned in each object to see if it contained
another pointer ( or a word that could be interpreted as pointer. e.g.
in sp_collector this, I believe, the:
  reinterpret_cast<shared_ptr_layout const *>(p)

in scan_and_count).  Fidler also used a similar method to cylic_ptr's
(and Christopher's "global rc mark-scan") to determine roots by
finding all objects pointed to by root pointers (by subtracting the count
due to pointers from the heap).  This is again, similar to sp_collector
as you noted above.  Of course this is again based on an incomplete
understanding of sp_collector.  After a closer look, I didn't notice
any comment about finding roots, as with Fidler's method.  This make quess
that sp_collector avoided actually decrementing the reference counts, as
in Christopher's and cyclic_ptr) and only stored the count's in
a map (the map2_type).  Then, during the heap scan, a check was made to
see if the reference count was == that in the map2_type, and if so, then
the object was garbage (since map2_type contains internal counts).  OK,
now I'm realizing I need to spend more time understanding sp_collector.
Maybe you could clarify.  Maybe Fidler could make any corrections
of my understanding of his code too.

I in no way meant to imply anything negative.  I apologize for any
ambiguity.

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to