digitalmars.D - GC Sentinel
- dsimcha <dsimcha yahoo.com> Oct 27 2009
- Leandro Lucarella <llucax gmail.com> Oct 27 2009
- bearophile <bearophileHUGS lycos.com> Oct 28 2009
- bearophile <bearophileHUGS lycos.com> Oct 28 2009
- Leandro Lucarella <llucax gmail.com> Oct 28 2009
- Leandro Lucarella <llucax gmail.com> Oct 28 2009
- "Steven Schveighoffer" <schveiguy yahoo.com> Oct 29 2009
I'm looking at the GC implementation and starting my hacking. I noticed that the ends of blocks are already being used in some creative ways in the sentinel version. This looks like a debugging feature, though I don't understand it completely. Can one of the original implementors (Walter, Sean) explain to me what the heck version(SENTINEL) in gcx.d does at a high level, whether it conflicts with storing bit masks for precise heap scanning at the ends of memory blocks, and whether we still even need it?
Oct 27 2009
dsimcha, el 27 de octubre a las 23:41 me escribiste:I'm looking at the GC implementation and starting my hacking. I noticed that the ends of blocks are already being used in some creative ways in the sentinel version. This looks like a debugging feature, though I don't understand it completely. Can one of the original implementors (Walter, Sean) explain to me what the heck version(SENTINEL) in gcx.d does at a high level, whether it conflicts with storing bit masks for precise heap scanning at the ends of memory blocks, and whether we still even need it?
I think that's used to check for memory corruption, by storing a known patter before and after the actual object. Then, each time you can, you check that the unused memory block is intact (meaning nobody wrote to an invalid memory area). I think it would be reasonble to keep the SENTINEL version as is (without precise scanning) since it's a debugging feature. Of course it's nice to have things unchanged when debugging, but the SENTINEL version is already changing *a lot* about how objects are stored, so that nice property is gone already. -- Leandro Lucarella (AKA luca) http://llucax.com.ar/ ---------------------------------------------------------------------- GPG Key: 5F5A8D05 (F8CD F9A7 BF00 5431 4145 104C 949E BFB6 5F5A 8D05) ---------------------------------------------------------------------- Don't take life to seriously, you won't get out alive
Oct 27 2009
Leandro Lucarella:I think that's used to check for memory corruption, by storing a known patter before and after the actual object. Then, each time you can, you check that the unused memory block is intact (meaning nobody wrote to an invalid memory area).
Such things can be quite useful. Do you need to compile Phobos again to do that? If that's true then handier (compile-time?) solutions can be found. Bye, bearophile
Oct 28 2009
Leandro Lucarella:If that's true then handier (compile-time?) solutions can be found.
What do you mean?
For example something run-time that doesn't work with a version(), like something that can be added to the GC API. If this is seen as too much slow or hard to do, then just the GC may be compiled, and used as separated dynamic lib. With LDC other intermediate solutions may be possible. Think of this problem from the point of view of someone that wants something handy. Debugging data structures is something I do often. Bye, bearophile
Oct 28 2009
bearophile, el 28 de octubre a las 03:52 me escribiste:Leandro Lucarella:I think that's used to check for memory corruption, by storing a known patter before and after the actual object. Then, each time you can, you check that the unused memory block is intact (meaning nobody wrote to an invalid memory area).
Such things can be quite useful. Do you need to compile Phobos again to do that?
Yes, it's added through a version statement.If that's true then handier (compile-time?) solutions can be found.
What do you mean? -- Leandro Lucarella (AKA luca) http://llucax.com.ar/ ---------------------------------------------------------------------- GPG Key: 5F5A8D05 (F8CD F9A7 BF00 5431 4145 104C 949E BFB6 5F5A 8D05) ---------------------------------------------------------------------- Se ha dicho tanto que las apariencias engañan Por supuesto que engañarán a quien sea tan vulgar como para creerlo
Oct 28 2009
bearophile, el 28 de octubre a las 13:19 me escribiste:Leandro Lucarella:If that's true then handier (compile-time?) solutions can be found.
What do you mean?
For example something run-time that doesn't work with a version(), like something that can be added to the GC API. If this is seen as too much slow or hard to do, then just the GC may be compiled, and used as separated dynamic lib. With LDC other intermediate solutions may be possible. Think of this problem from the point of view of someone that wants something handy. Debugging data structures is something I do often.
You can compile just the GC as a shared object (.so) in Linux and then preload it to change just the GC implementation at "dynamic-link-time". Just run: $ LD_PRELOAD=mygc.so ./myprogram If your GC with extra checks is compiled as a shared object in mygc.so. -- Leandro Lucarella (AKA luca) http://llucax.com.ar/ ---------------------------------------------------------------------- GPG Key: 5F5A8D05 (F8CD F9A7 BF00 5431 4145 104C 949E BFB6 5F5A 8D05) ---------------------------------------------------------------------- Que barbaridad, este país se va cada ves más pa' tras, más pa' tras... -- Sidharta Kiwi
Oct 28 2009
On Tue, 27 Oct 2009 19:41:24 -0400, dsimcha <dsimcha yahoo.com> wrote:I'm looking at the GC implementation and starting my hacking. I noticed that the ends of blocks are already being used in some creative ways in the sentinel version. This looks like a debugging feature, though I don't understand it completely. Can one of the original implementors (Walter, Sean) explain to me what the heck version(SENTINEL) in gcx.d does at a high level, whether it conflicts with storing bit masks for precise heap scanning at the ends of memory blocks, and whether we still even need it?
IIRC, the sentinel byte is to prevent pointers from leaking into the next block. For example, if you did: byte[] x = new byte[16]; // GC allocates 16 byte block. x = x[$..$]; Now, if there is no sentinel byte, the pointer in x points to the *next* memory block. It is an interesting problem, there might be a better solution. -Steve
Oct 29 2009









bearophile <bearophileHUGS lycos.com> 