Introduce M.A.D. within the schema/source instance linkage
authorPeter Rabbitson <ribasushi@cpan.org>
Tue, 11 Jan 2011 18:14:07 +0000 (19:14 +0100)
committerPeter Rabbitson <ribasushi@cpan.org>
Thu, 13 Jan 2011 15:51:09 +0000 (16:51 +0100)
commit50261284a5486d1974adb202eb84e5ed782d3665
treea6ebcffa7d819d0e2f1b50677631c0681eb2ccf9
parentc76e5262bd2cdd19ac0260b1a916767db304a953
Introduce M.A.D. within the schema/source instance linkage

When a source instance is registered with a schema instance, the code
in Schema::_register_source() adds a strong ref of the source to the
schema register, and a weak schema ref to the source itself. Install
DESTROY handlers both on Schema and ResultSource to flip this setup
any time the Schema instance goes out of scope (if we somehow
increment the refcount of $self in a DESTROY, then the garbage
collection is aborted). Tested all the way back to 5.8.1 with excellent
results.

Promote the source links in both ResultSet and Row to real ResultSource
instance refs, as there's no longer any issue with memory leaks (before
a source handle would be instantiated lazily to sidestep the source
object entirely by keeping a schema ref instead).

Add freeze/thaw hooks for proper serialization of Source-containing
structures (be it Row's or ResultSet's). In another round of cleanup
ResultSourceHandle will be reduced to purely a "no schema yet"
placeholder after schema-less a freeze/thaw cycle.
Changes
lib/DBIx/Class/ResultSet.pm
lib/DBIx/Class/ResultSource.pm
lib/DBIx/Class/Row.pm
lib/DBIx/Class/Schema.pm
t/52leaks.t
xt/podcoverage.t