summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrion Vibber <brion@status.net>2010-01-04 14:24:16 -0800
committerBrion Vibber <brion@status.net>2010-01-04 14:30:45 -0800
commit440b9957f9ae6fdfdb44c39074803fcdbc64112d (patch)
tree234068ad048079dc5365c3724e9001e09482d020
parente668709ce48f366b4477bc62434db28b3e211a33 (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.php38
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.
*