This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: New GCC plugin: gcc-python-plugin
- From: David Malcolm <dmalcolm at redhat dot com>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: Basile Starynkevitch <basile at starynkevitch dot net>, gcc at gcc dot gnu dot org
- Date: Sat, 14 Jan 2012 07:00:15 -0500
- Subject: Re: New GCC plugin: gcc-python-plugin
- References: <1308681200.8539.8598.camel@surprise> <20110621210235.3460f1ec.basile@starynkevitch.net> <1308684891.8539.8698.camel@surprise> <20110621223150.225cb3f8.basile@starynkevitch.net> <1308700347.8539.9199.camel@surprise> <20110622061916.GF11563@sunsite.ms.mff.cuni.cz>
On Wed, 2011-06-22 at 08:19 +0200, Jakub Jelinek wrote:
> Hi!
>
> On Tue, Jun 21, 2011 at 07:52:27PM -0400, David Malcolm wrote:
> > I'm not yet familiar with the details of the gcc GC, but it appears that
> > GTY() annotations are preprocessed to generate traversal code used by a
> > mark-and-sweep algorithm.
> >
> > Python's own GC allows for classes to opt-in as reference-owners;
> > instances of such classes get tracked within linked lists (one per
> > generation of Python's GC). This is intended for use for tracking
> > PyObject* references, but I may be able to piggy-back off of this - if I
> > add the relevant flag to my wrapper classes then they get tracked in
> > these linked lists. I can then register a callback to
> > PLUGIN_GGC_MARKING that uses this to locate the subset of all PyObject*
> > objects that wrap GCC objects. This could then mark all of the wrapped
> > GCC objects referenced from Python. That way all of the Python wrapper
> > objects can be found as roots within a GCC GC, and thus not have their
> > wrapped GCC objects deleted "from under them" (traversing any refs they
> > in turn keep alive, of course).
>
> You could just:
> #include "ggc.h"
>
> static void my_walker (void *arg ATTRIBUTE_UNUSED)
> {
> /* Ignore argument, as it is dummy */
> /* Walk all the still live python objects here and if they reference
> GCC GC objects, call
> ggc_test_and_set_mark (ptr);
> on each of them. */
> }
>
> static struct ggc_root_tab myroot = { "", 1, 1, my_walker, NULL };
>
> ...
> init_plugin (...)
> {
> ...
> ggc_register_root_tab (&myroot);
> ...
> }
>
> No need for gengtype for this, unless you want to use GTY(()) markup
> inside of your plugin.
[replying to 6-month old thread about integrating the Python plugin with
GCC's garbage collector]
Thanks. FWIW, I implemented something like this in
http://git.fedorahosted.org/git/?p=gcc-python-plugin.git;a=commitdiff;h=58d65a1b353220efbcf8d908b0946ef5d1c4fafd
which iterates over all live wrapper objects calling
gt_ggc_mx_NAME_OF_TYPE() on each wrapped object, which I hope is the
correct approach [it seems to work: the selftest puts the machinery into
verbose mode, and then verifies this log:
http://git.fedorahosted.org/git/?p=gcc-python-plugin.git;a=blob;f=tests/plugin/gc/_gc_selftest/stdout.txt;hb=HEAD ]
Hope this is helpful
Dave