digitalmars.D - GC Sentinel
- dsimcha (7/7) Oct 27 2009 I'm looking at the GC implementation and starting my hacking. I noticed...
- Leandro Lucarella (16/23) Oct 27 2009 I think that's used to check for memory corruption, by storing a known
- bearophile (4/8) Oct 28 2009 Such things can be quite useful. Do you need to compile Phobos again to ...
- Leandro Lucarella (10/19) Oct 28 2009 What do you mean?
- bearophile (4/7) Oct 28 2009 For example something run-time that doesn't work with a version(), like ...
- Leandro Lucarella (13/26) Oct 28 2009 You can compile just the GC as a shared object (.so) in Linux and then
- Steven Schveighoffer (10/21) Oct 29 2009 IIRC, the sentinel byte is to prevent pointers from leaking into the nex...
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
bearophile, el 28 de octubre a las 03:52 me escribiste:Leandro Lucarella:Yes, it's added through a version statement.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.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
Leandro Lucarella: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, bearophileIf that's true then handier (compile-time?) solutions can be found.What do you mean?
Oct 28 2009
bearophile, el 28 de octubre a las 13:19 me escribiste:Leandro Lucarella: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 KiwiFor 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.If that's true then handier (compile-time?) solutions can be found.What do you mean?
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