diff options
author | Brion Vibber <brion@status.net> | 2010-01-04 14:24:16 -0800 |
---|---|---|
committer | Brion Vibber <brion@status.net> | 2010-01-04 14:30:45 -0800 |
commit | 440b9957f9ae6fdfdb44c39074803fcdbc64112d (patch) | |
tree | 234068ad048079dc5365c3724e9001e09482d020 | |
parent | e668709ce48f366b4477bc62434db28b3e211a33 (diff) |
Exclude process-specific link & result cache references from serialized Memcached_Data_Object instances.
Should fix seemingly-random bugs due to destructor free()ing local resources by mistake.
-rw-r--r-- | classes/Memcached_DataObject.php | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/classes/Memcached_DataObject.php b/classes/Memcached_DataObject.php index a77e43d38..d830884b6 100644 --- a/classes/Memcached_DataObject.php +++ b/classes/Memcached_DataObject.php @@ -21,7 +21,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } class Memcached_DataObject extends DB_DataObject { - /** + /** * Destructor to free global memory resources associated with * this data object when it's unset or goes out of scope. * DB_DataObject doesn't do this yet by itself. @@ -36,6 +36,42 @@ class Memcached_DataObject extends DB_DataObject } /** + * Magic function called at serialize() time. + * + * We use this to drop a couple process-specific references + * from DB_DataObject which can cause trouble in future + * processes. + * + * @return array of variable names to include in serialization. + */ + function __sleep() + { + $vars = array_keys(get_object_vars($this)); + $skip = array('_DB_resultid', '_link_loaded'); + return array_diff($vars, $skip); + } + + /** + * Magic function called at unserialize() time. + * + * Clean out some process-specific variables which might + * be floating around from a previous process's cached + * objects. + * + * Old cached objects may still have them. + */ + function __wakeup() + { + // Refers to global state info from a previous process. + // Clear this out so we don't accidentally break global + // state in *this* process. + $this->_DB_resultid = null; + + // We don't have any local DBO refs, so clear these out. + $this->_link_loaded = false; + } + + /** * Wrapper for DB_DataObject's static lookup using memcached * as backing instead of an in-process cache array. * |