summaryrefslogtreecommitdiff
path: root/include/globals.h
diff options
context:
space:
mode:
authorEmiel Bruijntjes <emiel.bruijntjes@copernica.com>2013-09-11 08:00:28 -0700
committerEmiel Bruijntjes <emiel.bruijntjes@copernica.com>2013-09-11 08:00:28 -0700
commit68fd128d82819db1022137a45ca3224cee8ef029 (patch)
tree6f01d5456d830de9d24150ec56e5c1ee4d464faa /include/globals.h
parentf08f5850fa39c42974e12e42fa101ffe51eef594 (diff)
The environment object that is passed to functions now always is the same environment object, added move operator= to Value class to make moving zvals faster, and added request startup and request closedown methods
Diffstat (limited to 'include/globals.h')
-rw-r--r--include/globals.h58
1 files changed, 58 insertions, 0 deletions
diff --git a/include/globals.h b/include/globals.h
new file mode 100644
index 0000000..052bab8
--- /dev/null
+++ b/include/globals.h
@@ -0,0 +1,58 @@
+/**
+ * Globals.h
+ *
+ * Variables and structured required by the Zend engine to work
+ * with global variables
+ *
+ * @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
+ * @copyright 2013 Copernica BV
+ */
+
+/**
+ * Namespace
+ */
+namespace Php {
+
+/**
+ * The way how PHP C API deals with "global" variables is stupid.
+ *
+ * This is supposed to turn into a structure that is going to be
+ * instantiated for each parallel running request, and for which the
+ * PHP engine allocates a certain amount of memory, and a magic
+ * pointer that is passed and should be forwarded to every thinkable
+ * PHP function.
+ *
+ * We don't like this architecture. We have our own environment object
+ * that makes much more sense, and that we use. However, we need
+ * to assign this object somewhere, so that's what we do in this
+ * one and only global variable
+ */
+ZEND_BEGIN_MODULE_GLOBALS(phpcpp)
+ Php::Environment *environment;
+ZEND_END_MODULE_GLOBALS(phpcpp)
+
+/**
+ * And now we're going to define a macro. This also is a ridiculous
+ * architecture from PHP to get access to a variable from the
+ * structure above.
+ */
+#ifdef ZTS
+#define PHPCPP_G(v) TSRMG(phpcpp_globals_id, phpcpp_globals *, v)
+#else
+#define PHPCPP_G(v) (phpcpp_globals.v)
+#endif
+
+/**
+ * We're almost there, we now need to declare an instance of the
+ * structure defined above (if building for a single thread) or some
+ * sort of impossible to understand magic pointer-to-a-pointer (for
+ * multi-threading builds). We make this a static variable because
+ * this already is bad enough.
+ */
+extern ZEND_DECLARE_MODULE_GLOBALS(phpcpp)
+
+/**
+ * End of namespace
+ */
+}
+